Last active
October 8, 2018 20:58
-
-
Save Fabien-B/b7f14c526c8a6b4be27bb213c41c408e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/python3 | |
| from pynput.keyboard import Key, Controller | |
| import serial | |
| import argparse | |
| class CNCKeyboard: | |
| def __init__(self, port, baudrate=115200): | |
| self.port = port | |
| self.baudrate = baudrate | |
| self.keyboard = Controller() | |
| self.callbacks = { | |
| "STOP": self.cmd_emergency_stop, | |
| "HOME_PRESSED": self.cmd_home, | |
| "TOOL_MEASURE_PRESSED": self.cmd_tool_measure, | |
| "WORK_MEASURE_PRESSED": self.cmd_work_position_measure, | |
| "X_MINUS_PRESSED": self.cmd_x_minus_press, | |
| "X_MINUS_RELEASED": self.cmd_x_minus_release, | |
| "X_PLUS_PRESSED": self.cmd_x_plus_press, | |
| "X_PLUS_RELEASED": self.cmd_x_plus_release, | |
| "Y_MINUS_PRESSED": self.cmd_y_minus_press, | |
| "Y_MINUS_RELEASED": self.cmd_y_minus_release, | |
| "Y_PLUS_PRESSED": self.cmd_y_plus_press, | |
| "Y_PLUS_RELEASED": self.cmd_y_plus_release, | |
| "Z_MINUS_PRESSED": self.cmd_z_minus_press, | |
| "Z_MINUS_RELEASED": self.cmd_z_minus_release, | |
| "Z_PLUS_PRESSED": self.cmd_z_plus_press, | |
| "Z_PLUS_RELEASED": self.cmd_z_plus_release, | |
| } | |
| def run(self): | |
| with serial.Serial(self.port, self.baudrate) as ser: | |
| while True: | |
| line = ser.readline().strip().decode() | |
| #print(line) | |
| self.callbacks.get(line, self.default_callback)() | |
| def ctrl_plus_key(self, key): | |
| #with keyboard.pressed(Key.ctrl): | |
| self.keyboard.press(key) | |
| self.keyboard.release(key) | |
| def cmd_home(self): | |
| self.ctrl_plus_key('h') | |
| def cmd_tool_measure(self): | |
| self.ctrl_plus_key('t') | |
| def cmd_work_position_measure(self): | |
| self.ctrl_plus_key('w') | |
| def cmd_x_minus_press(self): | |
| self.keyboard.press(Key.ctrl) | |
| self.keyboard.press(Key.left) | |
| def cmd_x_minus_release(self): | |
| self.keyboard.release(Key.left) | |
| self.keyboard.release(Key.ctrl) | |
| def cmd_x_plus_press(self): | |
| self.keyboard.press(Key.ctrl) | |
| self.keyboard.press(Key.right) | |
| def cmd_x_plus_release(self): | |
| self.keyboard.release(Key.right) | |
| self.keyboard.release(Key.ctrl) | |
| def cmd_y_minus_press(self): | |
| self.keyboard.press(Key.ctrl) | |
| self.keyboard.press(Key.down) | |
| def cmd_y_minus_release(self): | |
| self.keyboard.release(Key.down) | |
| self.keyboard.release(Key.ctrl) | |
| def cmd_y_plus_press(self): | |
| self.keyboard.press(Key.ctrl) | |
| self.keyboard.press(Key.up) | |
| def cmd_y_plus_release(self): | |
| self.keyboard.release(Key.up) | |
| self.keyboard.release(Key.ctrl) | |
| def cmd_z_minus_press(self): | |
| self.keyboard.press(Key.ctrl) | |
| self.keyboard.press(Key.page_down) | |
| def cmd_z_minus_release(self): | |
| self.keyboard.release(Key.page_down) | |
| self.keyboard.release(Key.ctrl) | |
| def cmd_z_plus_press(self): | |
| self.keyboard.press(Key.ctrl) | |
| self.keyboard.press(Key.page_up) | |
| def cmd_z_plus_release(self): | |
| self.keyboard.release(Key.page_up) | |
| self.keyboard.release(Key.ctrl) | |
| def cmd_emergency_stop(self): | |
| self.keyboard.press(Key.esc) | |
| self.keyboard.release(Key.esc) | |
| def default_callback(self): | |
| print("No binding found for this command !") | |
| def main(port, baudrate=115200): | |
| cncKeyboard = CNCKeyboard(port, baudrate) | |
| cncKeyboard.run() | |
| if __name__ == '__main__': | |
| parser = argparse.ArgumentParser(description="Virtual keyboard for CNC external keyboard") | |
| parser.add_argument('port', help="Serial port of the device") | |
| args = parser.parse_args() | |
| main(args.port) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #define HOME 9 | |
| #define TOOL_MEASURE 10 | |
| #define WORK_MEASURE 11 | |
| #define X_MINUS 8 | |
| #define X_PLUS 6 | |
| #define Y_MINUS 3 | |
| #define Y_PLUS 7 | |
| #define Z_MINUS 4 | |
| #define Z_PLUS 5 | |
| #define DEBOUNCE_DELAY 30 | |
| int pins[] = { | |
| HOME, | |
| TOOL_MEASURE, | |
| WORK_MEASURE, | |
| X_MINUS, | |
| X_PLUS, | |
| Y_MINUS, | |
| Y_PLUS, | |
| Z_MINUS, | |
| Z_PLUS | |
| }; | |
| const char* names[] = { | |
| "HOME", | |
| "TOOL_MEASURE", | |
| "WORK_MEASURE", | |
| "X_MINUS", | |
| "X_PLUS", | |
| "Y_MINUS", | |
| "Y_PLUS", | |
| "Z_MINUS", | |
| "Z_PLUS" | |
| }; | |
| int lastStates[] = {1,1,1,1,1,1,1,1,1}; | |
| int buttonState[] = {1,1,1,1,1,1,1,1,1}; | |
| unsigned long lastDebounceTime[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; | |
| void setup() { | |
| pinMode(13, OUTPUT); | |
| for(int i=0; i<9; i++) { | |
| pinMode(pins[i], INPUT_PULLUP); | |
| } | |
| Serial.begin(115200); | |
| Serial.println("Ready !"); | |
| } | |
| void loop() { | |
| for(int i=0; i<9; i++) { | |
| int reading = digitalRead(pins[i]); | |
| if (reading != lastStates[i]) { | |
| // reset the debouncing timer | |
| lastDebounceTime[i] = millis(); | |
| } | |
| if ((millis() - lastDebounceTime[i]) > DEBOUNCE_DELAY) { | |
| if (reading != buttonState[i]) { | |
| buttonState[i] = reading; | |
| if(buttonState[i]) { //release | |
| Serial.print(names[i]); | |
| Serial.println("_RELEASED"); | |
| } | |
| else { //press | |
| Serial.print(names[i]); | |
| Serial.println("_PRESSED"); | |
| } | |
| } | |
| } | |
| lastStates[i] = reading; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment