The goal was to use an extra XT case I had laying around and insert a Wheelwriter 70 assembly. I saw an interesting comment on Reddit that indicated the Wheelwriter barrel plate seemed to be able to fit inside an XT case and wanted to test that theory. The Wheelwriter layout is more usable than a XT and although not perfect, if it could be configured with QMK the 78 available keys, the Code key, and function rows to the left allow a lot of flexibility for key layout. Since I did not have the F pcb anyways this allowed me to at least use these components and has a very unique and interesting look.
The first task was to see if I could even get the Wheelwriter keyboard assembly to fit. The Wheelwriter backplate is about 1/4-1/2 an inch too wide on the left of the function keys (looking at the barrel plate), and there was interference with the posts in the case and needed a little trimmed off the top sides to let the feet lay flat inside the case. None of this requires removal of barrel plate so it the plate can be trimmed without disassembly. This was possible with modification via grinder of the backplate. (NOTE: This is the time to consider a screw or bolt mod. I just wanted to test this out so I didnt, but using a grinder can certainly pop some rivets.)
This then fits in the case like so: I put the keyboard, a Level1Techs MStar controller, and cable back inside and then assembled the case to make sure everything could be put together. It was tight, but they all fit and looked pretty good.
Once I realized that I could get this to work I decided to use my Level1Techs controller that I acquired for my Mini M and see if I could configure it to work with this keyboard. This actually looked like it would work well as it already had the 2x16 triomate connectors that fit the 2x15 ribbon cables on the Wheelwriter.
I assigned an 16x8 matrix in QMK and used some debugging functions to map the matrix. The following is the matrix layout for the Wheelwriter 70, in column/row pairs, other Wheelwriters may be different as they seem to use different membranes for the smaller layouts.
The QMK layout definition is the following, for the MStar this means adding the definition to Level1Techs m_star_classic.h header file:
Code: Select all
// Keep the Wheelwriter matrix at 16 columns to maintain implementation
// consistency using the Default mappings, but cols 0 and F are not used
#define LAYOUT_wheelwriter70( \
K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4N, K4O, K4P, K4Q, K4R, K4S, K4T, \
K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N, K3O, K3Q, K3R, K3S, K3T, \
K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2M, K2N, K2O, K2Q, K2R, K2S, K2T, \
K1A, K1B, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1M, K1N, K1O, K1Q, K1S, \
K0A, K0B, K0E, K0J, K0O, K0Q, K0R, K0S, K0T \
) \
{ \
/* 00 */ { KC_NO, K0B, K0A, KC_NO, KC_NO, KC_NO, KC_NO, K2H, K2I, KC_NO, KC_NO, K2N, K2Q, K0S, KC_NO, KC_NO }, \
/* 01 */ { KC_NO, K1A, K1B, KC_NO, K2D, K2E, K2F, K2G, K2J, K2K, K2L, K2M, K2R, K2S, KC_NO, KC_NO }, \
/* 02 */ { KC_NO, K4A, K4B, KC_NO, K4C, KC_NO, KC_NO, K4H, K4I, K4O, KC_NO, K4N, K4Q, K4S, KC_NO, KC_NO }, \
/* 03 */ { KC_NO, K3A, KC_NO, KC_NO, K4D, K4E, K4F, K4G, K4J, K4K, K4L, K4M, K4R, K4T, KC_NO, KC_NO }, \
/* 04 */ { KC_NO, K3B, K3C, KC_NO, K3D, K3E, K3F, K3G, K3J, K3K, K3L, K3M, K3R, K3S, KC_NO, KC_NO }, \
/* 05 */ { KC_NO, K2A, K2B, KC_NO, KC_NO, KC_NO, KC_NO, K3H, K3I, K3O, KC_NO, K3N, KC_NO, K3T, KC_NO, KC_NO }, \
/* 06 */ { KC_NO, KC_NO, K2C, K1Q, K1E, K1F, K1G, K1H, K1K, K1L, K1M, KC_NO, K1S, K2T, KC_NO, KC_NO }, \
/* 07 */ { KC_NO, K0J, K0Q, K1C, KC_NO, KC_NO, KC_NO, K1I, K1J, KC_NO, KC_NO, K1N, K0R, K0T, K0E , KC_NO }, \
}
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
Code: Select all
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_wheelwriter70( /* Base layer */
KC_F1, KC_F2, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, KC_PSCR, KC_SLCK, KC_PAUS,
KC_F3, KC_F4, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_INS, KC_HOME, KC_PGUP,
KC_F5, KC_F6, KC_CLCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_DEL, KC_END, KC_PGDN,
KC_F7, KC_F8, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_RSFT, KC_UP,
KC_F9, KC_F10, KC_LCTL, KC_SPACE, KC_RCTL, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
),
};
Once I got it all tested and debugged I flashed the configuration using the QMK_MSYS tool. It's alive!
[UPDATE]
I have been able to get this to compile with the VIA toolkit and allow dynamic update of layout. You have to build a layout file below to load into the Design Tab, using the "Use V2 definitions" option enabled. You can then go to the Configure Tab to modify the mapping. The "vendorId" and "productId" in this file need to match the values in the QMK build with VIA enabled. I was only allowed to build with 3 layers due to a constraint in the compiler for the STM32. The pairs in the text are row, col mappings of the matrix to the key in KLE layout format. FYI the row, col layout was very annoying as I had already documented my matrix in col, row format, so I had to go and swap all the pairs around in my KLE file...
Code: Select all
{
"name": "MStar Wheelwriter70",
"vendorId": "0xFEED",
"productId": "0xB155",
"lighting": "none",
"matrix": { "rows": 8, "cols": 16 },
"layouts": {
"keymap": [
[
"2,1",
"2,2",
{
"x": 0.25
},
"2,4 ",
"3,4 ",
"3,5 ",
"3,6 ",
"3,7 ",
"2,7 ",
"2,8 ",
"3,8 ",
"3,9 ",
"3,10",
"3,11",
"2,11",
"2,9 ",
{
"w": 2
},
"2,12",
{
"x": 0.25
},
"3,12",
"2,13",
"3,13"
],
[
"3,1",
"4,1",
{
"x": 0.25,
"w": 1.5
},
"4,2 ",
"4,4 ",
"4,5 ",
"4,6 ",
"4,7 ",
"5,7 ",
"5,8 ",
"4,8 ",
"4,9 ",
"4,10",
"4,11",
"5,11",
"5,9 ",
{
"w": 1.5,
"h": 2,
"w2": 2.25,
"h2": 1,
"x2": -0.75,
"y2": 1
},
"0,12",
{
"x": 0.25
},
"4,12",
"4,13",
"5,13"
],
[
"5,1",
"5,2",
{
"x": 0.25,
"w": 1.75
},
"6,2 ",
"1,4 ",
"1,5 ",
"1,6 ",
"1,7 ",
"0,7 ",
"0,8 ",
"1,8 ",
"1,9 ",
"1,10",
"1,11",
"0,11",
{
"x": 2.5
},
"1,12",
"1,13",
"6,13"
],
[
"1,1",
"1,2",
{
"x": 0.25,
"w": 2.25
},
"7,3 ",
"6,4 ",
"6,5 ",
"6,6 ",
"6,7 ",
"7,7 ",
"7,8 ",
"6,8 ",
"6,9 ",
"6,10",
"7,11",
{
"w": 2.75
},
"6,3",
{
"x": 1.25
},
"6,12"
],
[
"0,2",
"0,1",
{
"x": 3,
"w": 2.5
},
"7,14",
{
"w": 7
},
"7,1",
{
"x": 1.25,
"w": 1.5
},
"7,2",
{
"x": 0.25
},
"7,12",
"0,13",
"7,13"
]
]
}
}
After cutting the Wheelwriter cover to fit over the barrel plate and inside the case we finally have something that looks like it might have come from the factory. When trimming the Wheelwriter cover remember to leave extra space (1/4in) to the right of the nav cluster as the case has a little extra gap there. Here is how it turned out....
As I mentioned in my post is this probably not my best idea, but it was a fun and a learning effort for me using QMK. I suspect not many will have a spare XT case and a Wheelwriter assembly but hopefully this is helpful for others in using QMK and the MStar controller.