https://there.oughta.be/a/macro-keyboard

Overview

inkkeys

Details and instructions can be found on https://there.oughta.be/a/macro-keyboard

In contrast to most of my other projects, I decided to put this into its own repository as it is slightly more complex and I am hoping for community contributions.

If you have pull-requests, bug reports or want to contribute new case designs, please do not hesitate to open an issue. For generic discussions, "show and tell" and if you are looking for support for something that is not a problem in the code here, I would recommend r/thereoughtabe on reddit.

Comments
  • Request: Gerber Files for Other PCB Services?

    Request: Gerber Files for Other PCB Services?

    Hi, I am totally digging this project and am eager to try my hand at building one.

    Being an absolute hack when it comes to PCB software, would it be possible for you to create some Gerber files of your PCB design? I tried plotting it from KiCAD, but I wasn't getting copper layers that JLCPCB recognized.

    opened by Extra-Fox 13
  • PCB give away if you cover my costs

    PCB give away if you cover my costs

    I ordered a amount of 10 PCBs because one piece is obviously not worth it. So I can share the remaining 9 PCBs if you cover my basics costs.

    I'll send you one PCB each by postal mail without warranty it will arrive the destination. 2€ + postage fee. One mail is less than 40g. Payment via Paypal.

    Please contact me if you desire a brand new green PCB for the macro keyboard project.

    btw: I have very good experience with JLCPCB from China - no advertisement but this was not my fist order and price/quality is very good.

    opened by Helicon007 7
  • Example Of Images

    Example Of Images

    Is there any chance I could get an example of a full image refresh and a partial image refresh?

    I am a bit confused and trying to get something usable going in golang, but I need an example of how to flash the whole screen and a partial update. What it would look like in raw serial data would be very useful.

    Like a simple example of writing a centered glyph or word, and the steps to draw it :pray:

    opened by Rudis1261 7
  • Can't seem to get the python app running

    Can't seem to get the python app running

    I run windows 10, and it seems it's not quite working as expected. I first ran into an issue where win32gui wasn't available, and resolved that by installing pip install pywin32

    Then I tried launching it, but next it failed at a pulse audio import in modes.py. Which from what I understand should only be available in linux.

    Traceback (most recent call last):
      File "./controller.py", line 9, in <module>
        from modes import *          #Definitions of the hotkey functions in different "modes"
      File "C:\Users\Rudi\Documents\Github\inkkeys\python-controller\modes.py", line 23, in <module>
        import pulsectl                                  # Get volume level in Linux, pip3 install pulsectl
      File "C:\Users\Rudi\AppData\Local\Programs\Python\Python37\lib\site-packages\pulsectl\__init__.py", line 4, in <module>
        from . import _pulsectl
      File "C:\Users\Rudi\AppData\Local\Programs\Python\Python37\lib\site-packages\pulsectl\_pulsectl.py", line 684, in <module>
        pa = LibPulse()
      File "C:\Users\Rudi\AppData\Local\Programs\Python\Python37\lib\site-packages\pulsectl\_pulsectl.py", line 636, in __init__
        p = CDLL(ctypes.util.find_library('libpulse') or 'libpulse.so.0')
      File "C:\Users\Rudi\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 356, in __init__
        self._handle = _dlopen(self._name, mode)
    OSError: [WinError 126] The specified module could not be found
    

    I then commented out the pulse audio import which got me to where I am now.

    My device is COM20, and when I start it, it does this:

    https://there.oughta.be/a/macro-keyboard
    I will try to stay connected. Press Ctrl+c to quit.
    Connecting to  COM20 .
    Requesting device info...
    Header found. Waiting for infos...
    End of info received.
    Testmode:  False
    Number of LEDs:  10
    Display width:  128
    Display height:  296
    Rotation circle steps:  20
    Connected to  COM20 .
    Error:  <class 'AttributeError'>
    I will retry in three seconds...
    Connecting to  COM20 .
    Serial error:  could not open port 'COM20': PermissionError(13, 'Access is denied.', None, 5)
    I will retry in three seconds...
    Connecting to  COM20 .
    Serial error:  could not open port 'COM20': PermissionError(13, 'Access is denied.', None, 5)
    I will retry in three seconds...
    Connecting to  COM20 .
    Serial error:  could not open port 'COM20': PermissionError(13, 'Access is denied.', None, 5)
    I will retry in three seconds...
    Connecting to  COM20 .
    Serial error:  could not open port 'COM20': PermissionError(13, 'Access is denied.', None, 5)
    I will retry in three seconds...
    Connecting to  COM20 .
    

    Any advice / suggestions would be welcome.

    opened by Rudis1261 6
  • Keycap model source?

    Keycap model source?

    Hi,

    I am trying to build this cool keypad. I got most of the stuff working okay, but I failed at keycaps: I managed to print them in PETG without issues, but they do not fit. The cross-shaped hole is too small (using typical Gateron switches).

    I would like to fix this, but I need some source 3d model to work with. I do not have Blender nor KiCad (never used these). I am experienced with OpenSCAD and I suppose I can learn some other CAD tools as well, provided I can get the source model.

    The documentation states that 3d models were taken from a KiCad component library. Can you please provide some more specific instructions/links for that?

    Thanks, Ondrej Zara

    opened by ondras 5
  • Question regarding resistor cluster

    Question regarding resistor cluster

    resistors, capacitors

    I am curious what these resistors are used for, mind sharing some insight? I may or may not be busy with a variation of the board, and I can't say I have played with an encoder wheel before to understand why it's needed.

    opened by Rudis1261 3
  • OSError: cannot open resource

    OSError: cannot open resource

    I get this error when I try to run the python script:

    Connecting to  /dev/ttyACM2 .
    Requesting device info...
    Sending: I
    Received: Inkkeys
    Header found. Waiting for infos...
    Received: TEST 0
    Received: N_LED 12
    Received: DISP_W 128
    Received: DISP_H 296
    Received: ROT_CIRCLE_STEPS 20
    Received: Done
    End of info received.
    Testmode:  False
    Number of LEDs:  12
    Display width:  128
    Display height:  296
    Rotation circle steps:  20
    Connected to  /dev/ttyACM2 .
    Active window: Navigator
    Traceback (most recent call last):
      File "/home/marius/Downloads/inkkeys-main/python-controller/controller.py", line 110, in tryUsingPort
        work()  #Success, enter main loop
      File "/home/marius/Downloads/inkkeys-main/python-controller/controller.py", line 78, in work
        mode.activate(device)       # ...and call its activate function
      File "/home/marius/Downloads/inkkeys-main/python-controller/modes.py", line 206, in activate
        device.sendTextFor("title", "Default", inverted=True) #Title
      File "/home/marius/Downloads/inkkeys-main/python-controller/inkkeys/device.py", line 207, in sendTextFor
        font1 = ImageFont.truetype("font/Munro.ttf", 10)
      File "/usr/lib/python3.10/site-packages/PIL/ImageFont.py", line 976, in truetype
        return freetype(font)
      File "/usr/lib/python3.10/site-packages/PIL/ImageFont.py", line 973, in freetype
        return FreeTypeFont(font, size, index, encoding, layout_engine)
      File "/usr/lib/python3.10/site-packages/PIL/ImageFont.py", line 249, in __init__
        self.font = core.getfont(
    OSError: cannot open resource
    
    Error:  <class 'OSError'>
    I will retry in three seconds...
    

    The error changes when terminal is in focus:

    Connecting to  /dev/ttyACM2 .
    Requesting device info...
    Sending: I
    Received: Inkkeys
    Header found. Waiting for infos...
    Received: TEST 0
    Received: N_LED 12
    Received: DISP_W 128
    Received: DISP_H 296
    Received: ROT_CIRCLE_STEPS 20
    Received: Done
    End of info received.
    Testmode:  False
    Number of LEDs:  12
    Display width:  128
    Display height:  296
    Rotation circle steps:  20
    Connected to  /dev/ttyACM2 .
    Could not get active window:  <class 'Xlib.error.BadWindow'>
    Traceback (most recent call last):
      File "/home/marius/Downloads/inkkeys-main/python-controller/controller.py", line 110, in tryUsingPort
        work()  #Success, enter main loop
      File "/home/marius/Downloads/inkkeys-main/python-controller/controller.py", line 72, in work
        if ("process" in i and i["process"] in processes) or ("activeWindow" in i and i["activeWindow"].match(activeWindow)) or not ("process" in i or "activeWindow" in i):
    UnboundLocalError: local variable 'activeWindow' referenced before assignment
    
    Error:  <class 'UnboundLocalError'>
    I will retry in three seconds...
    

    I had it working few times so I'm not sure what might be causing this error, it seemingly appears out of nowhere. Any idea what might be causing this?

    opened by Yersi88 2
  • e-Paper Module not Performing Parital Refresh

    e-Paper Module not Performing Parital Refresh

    I've got the device programmed and working on Windows 10, but haven't been able to get the display to perform a partial refresh at any point. I have the v2 of the display and have made the changes to the Arduino code as specified in the readme.

    Not sure what the intended behaviour is, but the hardware demo file does display a static image, and then clears.

    In the python controller however the functionality of the different keys is working, but the only time I can get an image on the screen is by pressing button 8 to toggle the demo display. I realised that this function makes a call to updateDisplay with fullRefresh=True, so I made that the default in the updateDisplay function and now all the screens display correctly, but only after a lengthy full refresh.

    Has anyone else encountered this issue? Or any suggestions for what to try to resolve it? If any additional info would be useful to identify the issue let me know and I'll try to provide it ASAP.

    opened by lucas-fern 2
  • Windows Install - controller.py: Could not find module 'libpulse.so.0'

    Windows Install - controller.py: Could not find module 'libpulse.so.0'

    Hey gang - I'm getting this set up on my Windows 11 pc running Python 3.9. Initially I found that I was missing the pulsectl dependency but, after installing via pip, I now get this error:

    FileNotFoundError: Could not find module 'libpulse.so.0' (or one of its dependencies). Try using the full path with constructor syntax.

    As far as I can tell, libpulse is part of pulsectl so I don't know what else to try. Hoping you guys might know whats up. Thanks!

    opened by amercer86 2
  • inkkeys/python-controller/processchecks.py

    inkkeys/python-controller/processchecks.py

    Hi! Thanks for making this great project. I will build 6 of the keyboards to help control a radio amateur station.

    On a Mac OS, Monterey 12.1 I have a problem with using AppKit. It is installed with pip3 so the OS should be ready.

    when processchecks.py is with capital letters like: from AppKit import NSWorkspace

    it doesn't find the AppKit. If I change it to small caps: from appkit import NSWorkspace

    it finds the Appkit but doesn't find NSWorkspace with error: Traceback (most recent call last): File "/Users/simon/Downloads/inkkeys/python-controller/controller.py", line 7, in from processchecks import * #Functions to check for active processes and windows File "/Users/simon/Downloads/inkkeys/python-controller/processchecks.py", line 13, in from appkit import NSWorkspace ImportError: cannot import name 'NSWorkspace' from 'appkit' (/usr/local/lib/python3.9/site-packages/appkit/init.py)

    Any idea and help please?

    opened by s53zo 2
  • Spare PCBs for sale (cheap)

    Spare PCBs for sale (cheap)

    Hi,

    I have 4 more PCBs here that I don't need, they are quite pretty with black solder mask and white silkscreen. Price £4 + postage (should be cheap, fits in letter)

    opened by Yersi88 0
  • GxEPD2 compiling error

    GxEPD2 compiling error

    I keep getting this error when I try to complie the code. Any ideas how to fix thsi?

    In file included from c:\users\boss\documents\arduino\libraries\hid-project\src\hid-apis\KeyboardAPI.h:29:0,
                     from c:\users\boss\documents\arduino\libraries\hid-project\src\hid-apis\defaultkeyboardapi.h:27,
                     from C:\Users\BOSS\Documents\Arduino\libraries\HID-Project\src/SingleReport/BootKeyboard.h:30,
                     from C:\Users\BOSS\Documents\Arduino\libraries\HID-Project\src/HID-Project.h:50,
                     from C:\Users\BOSS\Downloads\inkkeys-main(1)\inkkeys-main\arduino\inkkeys\inkkeys.ino:13:
    c:\users\boss\documents\arduino\libraries\hid-project\src\keyboardlayouts\improvedkeylayouts.h:54:21: note: #pragma message: Using default ASCII layout for keyboard modules
         #pragma message "Using default ASCII layout for keyboard modules"
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from C:\Users\BOSS\Downloads\inkkeys-main(1)\inkkeys-main\arduino\inkkeys\inkkeys.ino:15:0:
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:79:1: error: expected class-name before '{' token
     {
     ^
    In file included from C:\Users\BOSS\Downloads\inkkeys-main(1)\inkkeys-main\arduino\inkkeys\inkkeys.ino:15:0:
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In constructor 'GxEPD2_BW<GxEPD2_Type, page_height>::GxEPD2_BW(GxEPD2_Type)':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:30:31: error: class 'GxEPD2_BW<GxEPD2_Type, page_height>' does not have any field named 'Adafruit_GFX'
     #define GxEPD2_GFX_BASE_CLASS Adafruit_GFX
                                   ^
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:85:44: note: in expansion of macro 'GxEPD2_GFX_BASE_CLASS'
         GxEPD2_BW(GxEPD2_Type epd2_instance) : GxEPD2_GFX_BASE_CLASS(GxEPD2_Type::WIDTH, GxEPD2_Type::HEIGHT), epd2(epd2_instance)
                                                ^~~~~~~~~~~~~~~~~~~~~
    In file included from C:\Users\BOSS\Downloads\inkkeys-main(1)\inkkeys-main\arduino\inkkeys\inkkeys.ino:15:0:
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:89:17: error: 'HEIGHT' was not declared in this scope
           _pages = (HEIGHT / _page_height) + ((HEIGHT % _page_height) > 0);
                     ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:89:17: note: suggested alternative: 'HIGH'
           _pages = (HEIGHT / _page_height) + ((HEIGHT % _page_height) > 0);
                     ^~~~~~
                     HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In member function 'void GxEPD2_BW<GxEPD2_Type, page_height>::drawPixel(int16_t, int16_t, uint16_t)':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:122:15: error: 'WIDTH' was not declared in this scope
               x = WIDTH - x - 1;
                   ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:126:15: error: 'HEIGHT' was not declared in this scope
               y = HEIGHT - y - 1;
                   ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:126:15: note: suggested alternative: 'HIGH'
               y = HEIGHT - y - 1;
                   ^~~~~~
                   HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In member function 'void GxEPD2_BW<GxEPD2_Type, page_height>::display(bool)':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:196:63: error: 'WIDTH' was not declared in this scope
           if (partial_update_mode) epd2.writeImage(_buffer, 0, 0, WIDTH, _page_height);
                                                                   ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:197:57: error: 'WIDTH' was not declared in this scope
           else epd2.writeImageForFullRefresh(_buffer, 0, 0, WIDTH, _page_height);
                                                             ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:201:45: error: 'WIDTH' was not declared in this scope
             epd2.writeImageAgain(_buffer, 0, 0, WIDTH, _page_height);
                                                 ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In member function 'void GxEPD2_BW<GxEPD2_Type, page_height>::displayWindow(uint16_t, uint16_t, uint16_t, uint16_t)':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:219:36: error: 'HEIGHT' was not declared in this scope
           uint16_t y_part = _reverse ? HEIGHT - h - y : y;
                                        ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:219:36: note: suggested alternative: 'HIGH'
           uint16_t y_part = _reverse ? HEIGHT - h - y : y;
                                        ^~~~~~
                                        HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:220:47: error: 'WIDTH' was not declared in this scope
           epd2.writeImagePart(_buffer, x, y_part, WIDTH, _page_height, x, y, w, h);
                                                   ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In member function 'void GxEPD2_BW<GxEPD2_Type, page_height>::setFullWindow()':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:233:15: error: 'WIDTH' was not declared in this scope
           _pw_w = WIDTH;
                   ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:234:15: error: 'HEIGHT' was not declared in this scope
           _pw_h = HEIGHT;
                   ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:234:15: note: suggested alternative: 'HIGH'
           _pw_h = HEIGHT;
                   ^~~~~~
                   HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In member function 'bool GxEPD2_BW<GxEPD2_Type, page_height>::nextPage()':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:269:41: error: 'HEIGHT' was not declared in this scope
               uint32_t offset = _reverse ? (HEIGHT - _pw_h) * _pw_w / 8 : 0;
                                             ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:269:41: note: suggested alternative: 'HIGH'
               uint32_t offset = _reverse ? (HEIGHT - _pw_h) * _pw_w / 8 : 0;
                                             ^~~~~~
                                             HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:280:56: error: 'WIDTH' was not declared in this scope
               epd2.writeImageForFullRefresh(_buffer, 0, 0, WIDTH, HEIGHT);
                                                            ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:280:63: error: 'HEIGHT' was not declared in this scope
               epd2.writeImageForFullRefresh(_buffer, 0, 0, WIDTH, HEIGHT);
                                                                   ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:280:63: note: suggested alternative: 'HIGH'
               epd2.writeImageForFullRefresh(_buffer, 0, 0, WIDTH, HEIGHT);
                                                                   ^~~~~~
                                                                   HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:296:91: error: 'HEIGHT' was not declared in this scope
             uint16_t page_ye = _current_page < int16_t(_pages - 1) ? page_ys + _page_height : HEIGHT;
                                                                                               ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:296:91: note: suggested alternative: 'HIGH'
             uint16_t page_ye = _current_page < int16_t(_pages - 1) ? page_ys + _page_height : HEIGHT;
                                                                                               ^~~~~~
                                                                                               HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:334:80: error: 'WIDTH' was not declared in this scope
             if (!_second_phase) epd2.writeImageForFullRefresh(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                    ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:334:115: error: 'HEIGHT' was not declared in this scope
             if (!_second_phase) epd2.writeImageForFullRefresh(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                                                       ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:334:115: note: suggested alternative: 'HIGH'
             if (!_second_phase) epd2.writeImageForFullRefresh(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                                                       ^~~~~~
                                                                                                                       HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:335:56: error: 'WIDTH' was not declared in this scope
             else epd2.writeImageAgain(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                            ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:335:91: error: 'HEIGHT' was not declared in this scope
             else epd2.writeImageAgain(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                               ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:335:91: note: suggested alternative: 'HIGH'
             else epd2.writeImageAgain(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                               ^~~~~~
                                                                                               HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In member function 'void GxEPD2_BW<GxEPD2_Type, page_height>::drawPaged(void (*)(const void*), const void*)':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:368:41: error: 'HEIGHT' was not declared in this scope
               uint32_t offset = _reverse ? (HEIGHT - _pw_h) * _pw_w / 8 : 0;
                                             ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:368:41: note: suggested alternative: 'HIGH'
               uint32_t offset = _reverse ? (HEIGHT - _pw_h) * _pw_w / 8 : 0;
                                             ^~~~~~
                                             HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:379:56: error: 'WIDTH' was not declared in this scope
               epd2.writeImageForFullRefresh(_buffer, 0, 0, WIDTH, HEIGHT);
                                                            ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:379:63: error: 'HEIGHT' was not declared in this scope
               epd2.writeImageForFullRefresh(_buffer, 0, 0, WIDTH, HEIGHT);
                                                                   ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:379:63: note: suggested alternative: 'HIGH'
               epd2.writeImageForFullRefresh(_buffer, 0, 0, WIDTH, HEIGHT);
                                                                   ^~~~~~
                                                                   HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:397:88: error: 'HEIGHT' was not declared in this scope
                 uint16_t page_ye = _current_page < (_pages - 1) ? page_ys + _page_height : HEIGHT;
                                                                                            ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:397:88: note: suggested alternative: 'HIGH'
                 uint16_t page_ye = _current_page < (_pages - 1) ? page_ys + _page_height : HEIGHT;
                                                                                            ^~~~~~
                                                                                            HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:421:62: error: 'WIDTH' was not declared in this scope
               epd2.writeImageForFullRefresh(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                  ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:421:97: error: 'HEIGHT' was not declared in this scope
               epd2.writeImageForFullRefresh(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                                     ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:421:97: note: suggested alternative: 'HIGH'
               epd2.writeImageForFullRefresh(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                                     ^~~~~~
                                                                                                     HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:432:55: error: 'WIDTH' was not declared in this scope
                 epd2.writeImageAgain(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                           ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:432:90: error: 'HEIGHT' was not declared in this scope
                 epd2.writeImageAgain(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                              ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:432:90: note: suggested alternative: 'HIGH'
                 epd2.writeImageAgain(_buffer, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
                                                                                              ^~~~~~
                                                                                              HIGH
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h: In member function 'void GxEPD2_BW<GxEPD2_Type, page_height>::_rotate(uint16_t&, uint16_t&, uint16_t&, uint16_t&)':
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:584:15: error: 'WIDTH' was not declared in this scope
               x = WIDTH - x - w;
                   ^~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:588:15: error: 'HEIGHT' was not declared in this scope
               y = HEIGHT - y - h;
                   ^~~~~~
    C:\Users\BOSS\Documents\Arduino\libraries\GxEPD2\src/GxEPD2_BW.h:588:15: note: suggested alternative: 'HIGH'
               y = HEIGHT - y - h;
                   ^~~~~~
                   HIGH
    
    exit status 1
    
    Compilation error: exit status 1
    
    opened by Yersi88 3
  • Display not supporting partial updates?

    Display not supporting partial updates?

    Hi,

    I built the whole keypad, but I am starting to think that my e-ink display is not supporting partial updates. I am opening this issue to organize my thoughts and seek advice.

    I have a second revision of the display, so I adjusted the wiring, constants (settings.h) and constructor (GxEPD2_290_T94) according to https://www.reddit.com/r/arduino/comments/l4wxxf/the_hardware_is_assembled_and_passed_all_tests/gqovq1j. I did this both in the hardware-test sketch as well as the main inkkeys sketch.

    I tried:

    1. the hardware test sketch. This one works flawlessly, shows circle patterns. I am not sure whether this uses partial updates or not.

    2. the regular inkkeys sketch. The serial protocol works. I launched the python script and loaded the ModeGimp() mode. The display remained blank/white. Keys are working according to the Gimp mode.

    3. I then connected to the keypad via serial and issues the R f command. Magically, everything (icons) appeared on screen.

    To further debug the issue, I restarted the keypad, did nothing Python-related, opened the serial terminal and issued:

    D 50 50 8 2 <enter>
    AA <enter>
    R f <enter>
    

    This worked: two small rows with several black bits appeared. However, when I did the same with partial refresh, nothing appeared:

    D 50 50 8 2 <enter>
    AA <enter>
    R p <enter>
    

    Finally, once I issued R f, everything that has been previously sent (and failed to partially update) appeared.

    This is what I bought: https://www.aliexpress.com/item/32811510579.html

    Do you think this can be solved software-wise? Or shall I contact the seller? I would be happy for any comments/suggestions.

    opened by ondras 8
  • Supporting slim line keys

    Supporting slim line keys

    I think it could be nice to support low-profile keys as well. Their pins are aligned slightly differently, and I think you have both footprints on the same layer and just bridge the pins :grimacing:

    I will take a photo a bit later to show the difference, and maybe try my hand at updating it.

    opened by Rudis1261 1
  • LED Pin Spacing and Ground Plane

    LED Pin Spacing and Ground Plane

    I ordered 5 boards from PCBway and I am super happy that they came out really great. But one of the issues I was having is definitely the pin spacing of the LEDs, it's quite a pain. I think most people would be happy to print a 3mm or so ring spacer and rather use 2.54mm pitch, with the legs slightly bent. I kinda trashed ~~one of my boards~~ two of my boards just because of that issue.

    This raised something else, which may need improvement. The ground plane is massive :scream:, my poor little soldering iron could not heat it fast enough to use a wick as suggested to clear out excess solder. It's fairly bad to heat an LED for so long, and the chances of damaging it are fairly high.

    I wonder if the ground plane could have an isolation ring around the circuit to reduce the ground plane, and make it easier to heat up. Basically, all the heat is transferring into that entire PCB plane at the moment.

    Not so much as an issue, but a quality of life on both

    opened by Rudis1261 2
Owner
Sebastian Staacks
Sebastian Staacks
Make visual music sheets for thatskygame (graphical representations of the Sky keyboard)

sky-python-music-sheet-maker This program lets you make visual music sheets for Sky: Children of the Light. It will ask you a few questions, and does

null 21 Aug 26, 2022
BoobSnail allows generating Excel 4.0 XLM macro. Its purpose is to support the RedTeam and BlueTeam in XLM macro generation.

Follow us on Twitter! BoobSnail BoobSnail allows generating XLM (Excel 4.0) macro. Its purpose is to support the RedTeam and BlueTeam in XLM macro gen

STM Cyber 232 Nov 21, 2022
Brogrammer-keyboard - FIrmware for the Brogrammer Keyboard v1.0

Brogrammer Keyboard Firmware The package contains the firmware that runs on the Brogrammer Keyboard v1.0 See https://imgur.com/a/oY5QZ14 This keyboard

Devin Hartleben 1 Apr 21, 2022
A Raspberry Pi Pico powered Macro board, like a Streamdeck but cheaper and simpler.

Env-MCRO A Raspberry Pi Pico powered Macro board, like a Streamdeck but cheaper and simpler. (btw this image is a bit outdated, some of the silkscreen

EnviousData 68 Oct 14, 2022
Macro recording and metaprogramming in Python

macro-kit is a package for efficient macro recording and metaprogramming in Python using abstract syntax tree (AST).

null 8 Aug 31, 2022
An example project that shows how to check if a certain macro is active in a file.

PlatformIO Check Compiler Flags Example Description Demonstrates the usage of an extra script and a special compilter invocation to get the active mac

Maximilian Gerhardt 1 Oct 28, 2021
A set of postprocessing scripts and macro to accelerate the gyroid infill print speed with Klipper

A set of postprocessing scripts and macro to accelerate the gyroid infill print speed with Klipper

Jérôme W. 75 Jan 7, 2023
Sheet2export - FreeCAD macro to export spreadsheet

Description This is FreeCAD macro to export spreadsheet to file.

Darek L 3 Jul 9, 2022
Fast image augmentation library and easy to use wrapper around other libraries. Documentation: https://albumentations.ai/docs/ Paper about library: https://www.mdpi.com/2078-2489/11/2/125

Albumentations Albumentations is a Python library for image augmentation. Image augmentation is used in deep learning and computer vision tasks to inc

null 11.4k Jan 9, 2023
Official mirror of https://gitlab.com/pgjones/hypercorn https://pgjones.gitlab.io/hypercorn/

Hypercorn Hypercorn is an ASGI web server based on the sans-io hyper, h11, h2, and wsproto libraries and inspired by Gunicorn. Hypercorn supports HTTP

Phil Jones 432 Jan 8, 2023
Askbot is a Django/Python Q&A forum. **Contributors README**: https://github.com/ASKBOT/askbot-devel#how-to-contribute. Commercial hosting of Askbot and support are available at https://askbot.com

ATTENTION: master branch is experimental, please read below Askbot - a Django Q&A forum platform This is Askbot project - open source Q&A system, like

ASKBOT 1.5k Dec 28, 2022
Fast image augmentation library and easy to use wrapper around other libraries. Documentation: https://albumentations.ai/docs/ Paper about library: https://www.mdpi.com/2078-2489/11/2/125

Albumentations Albumentations is a Python library for image augmentation. Image augmentation is used in deep learning and computer vision tasks to inc

null 11.4k Jan 2, 2023
Display money format and its filthy currencies, for all money lovers out there.

Python Currencies Display money format and its filthy currencies, for all money lovers out there. Installation currencies is available on PyPi http://

Alireza Savand 64 Dec 28, 2022
Face2webtoon - Despite its importance, there are few previous works applying I2I translation to webtoon.

Despite its importance, there are few previous works applying I2I translation to webtoon. I collected dataset from naver webtoon 연애혁명 and tried to transfer human faces to webtoon domain.

이상윤 64 Oct 19, 2022
“ Hey there 👋 I'm Daisy „ AI based Advanced Group Management Bot Suit For All Your Needs ❤️.. Source Code of @Daisyxbot

Project still under heavy development Everything will be changed in the release “ Hey there ?? I'm Daisy „ AI based Advanced telegram Group Management

TeamDaisyX 43 Nov 12, 2022