Git Product home page Git Product logo

inkkeys's Introduction

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.

Buy Me A Coffee

Common problems

Display revision 2

Apparently, the original design used revision 1 of the display, while many newly ordered version are revision 2. There are a few differences and thankfully, Corky402 made a good list of required changes on Reddit. Here is an excerpt of the original post for reference:

If you want to test your display hooked to a Arduino or Raspberry Pi you need to run examples for the epd2in9_V2 not the epd2in9.

To get this awesome project working there is no need to make any alterations to the PCB, just simply plumb the Waveshare up on the connectors as I describe, not as per Sebastian's original post.

PCB Pin Waveshare wiring loom

+5v Grey

GND Brown

DIN Blue

CLK Yellow

CS Orange

DC Green

RST Purple

BUSY White

In short you are swapping the RST & BUSY lines on the PCB.

Next, go to your Arduino sketch. This is for the hardware-test script. Enable line numbering and go to line 43 which reads -

GxEPD2_290 display(/*CS=*/ PIN_CS, /*DC=*/ PIN_DC, /*RST=*/ PIN_RST, /*BUSY=*/ PIN_BUSY);

Change this to -

GxEPD2_290_T94 display(/*CS=*/ PIN_CS, /*DC=*/ PIN_DC, /*RST=*/ PIN_RST, /*BUSY=*/ PIN_BUSY);

Then go to settings.h

Lines 2 - 7 need to be altered so change that section of code as follows -

const byte PIN_DIN = 16;
const byte PIN_CLK = 15;
const byte PIN_CS = 19;
const byte PIN_DC = 18;
const byte PIN_RST = 10;
const byte PIN_BUSY = 14;

The sketch will then compile and when uploaded to the board you will get the Waveshare drawing all sorts of Austin Powers time machine circles that make your eyes spin!

Gallery

Original design Original design as presented on there.oughta.be with the 3d printing files from this repository.

Original design Design by John, Mat and Roland from the UK. The case was CNC milled from beech with a similarly machined clear perspex lid. You can find the knob with finger dimple by Roland Irving in the 3dprint folder as know_with_dimple.stl.

inkkeys's People

Contributors

ondras avatar rudis1261 avatar staacks avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

inkkeys's Issues

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.

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 ๐Ÿ˜ฌ

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

Arduino micro pro usbc

I think it should be a recommendation to use a micro pro with a USB-C connector. I have broken more micro USB off these than I care to mention ๐Ÿ™ˆ

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

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.

Serial error - Permission denied when accessing COM port and script silently exiting on Windows

I am trying to get the Python controller running on a Windows machine. when I run controller.py it appears to connect to the keypad successfully. It retrieves the info from the keypad. However when it enters the main loop I get the following error:

Error: <class 'AttributeError'>
I will retry in three seconds...
Connecting to COM6 .
Serial error: could not open port 'COM6': PermissionError(13, 'Access is denied.', None, 5)

If I enable debug mode I get the following traceback:

Traceback (most recent call last):
File "D:\Downloads\DIY\Macro Keypad\inkkeys-main\python-controller\controller.py", line 110, in tryUsingPort
work() #Success, enter main loop
^^^^^^
File "D:\Downloads\DIY\Macro Keypad\inkkeys-main\python-controller\controller.py", line 85, in work
pollInterval = mode.poll(device)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'poll'

Any assistance that you can offer would be appreciated.

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.

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.

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?

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 ๐Ÿ˜ฑ, 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

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?

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.

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.

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)

Capacitors for neo pixels

Hello Sebastian,

I found your project through a hack a day blog post, https://hackaday.com/2021/02/18/dynamic-macro-keyboard-controls-all-the-things/, and I am certainly interested in trying to build one. I have not completely reviewed the circuit, but I did see that the RGB neo pixel LED modules do not have a decoupling capacitor. This could cause flashing, browning out, general misbehaving of the LED device. I am currently installing ki-cad to look at the circuit design and layout. I am bringing this up because I was thinking about modifying the layout and adding a string of addressable RGB under the key caps, because more RGB is always better! Though I will have to look at the power consumption of the devices in total to ensure that it stays USB compatible with no need of an external power source. This part may be the part of choice for individual key RGB https://kprepublic.com/products/xd-halo-rgb-light-control-pcb-soft-lighting-light-diffuser-circle-light-for-mechanical-keyboard-cospad-xd60-64-75-84-96-40-68

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 ๐Ÿ™

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!

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.