cncjs
1import events from 'events';2import Mousetrap from 'mousetrap';3import log from './log';4import { preventDefault } from './dom-events';5
6const AXIS_X = 'x';7const AXIS_Y = 'y';8const AXIS_Z = 'z';9const AXIS_A = 'a';10//const AXIS_B = 'b';
11//const AXIS_C = 'c';
12const FORWARD = 1;13const BACKWARD = -1;14const OVERSHOOT_FACTOR = 10; // 10x15const UNDERSHOOT_FACTOR = 0.1; // 0.1x16
17const commandKeys = [18{ // Feed Hold19keys: '!',20cmd: 'CONTROLLER_COMMAND',21payload: {22command: 'feedhold'23},24preventDefault: true25},26{ // Cycle Start27keys: '~',28cmd: 'CONTROLLER_COMMAND',29payload: {30command: 'cyclestart'31},32preventDefault: true33},34{ // Homing35keys: ['ctrl', 'alt', 'command', 'h'].join('+'),36cmd: 'CONTROLLER_COMMAND',37payload: {38command: 'homing'39},40preventDefault: true41},42{ // Unlock43keys: ['ctrl', 'alt', 'command', 'u'].join('+'),44cmd: 'CONTROLLER_COMMAND',45payload: {46command: 'unlock'47},48preventDefault: true49},50{ // Reset51keys: ['ctrl', 'alt', 'command', 'r'].join('+'),52cmd: 'CONTROLLER_COMMAND',53payload: {54command: 'reset'55},56preventDefault: true57},58{ // Select Jog Distance59keys: ['ctrl', 'alt', 'command', '-'].join('+'),60cmd: 'JOG_LEVER_SWITCH',61payload: {62key: '-'63},64preventDefault: true65},66{ // Select Jog Distance67keys: ['ctrl', 'alt', 'command', '+'].join('+'),68cmd: 'JOG_LEVER_SWITCH',69payload: {70key: '+'71},72preventDefault: true73},74{ // Select Jog Distance75keys: ['ctrl', 'alt', 'command', '='].join('+'),76cmd: 'JOG_LEVER_SWITCH',77payload: {78key: ''79},80preventDefault: true81},82{ // Jog Forward83keys: ['ctrl', 'alt', 'command', ']'].join('+'),84cmd: 'JOG',85payload: {86axis: null,87direction: FORWARD,88factor: 189},90preventDefault: true91},92{ // Jog Forward (Alias)93keys: ['ctrl', 'alt', 'command', 'f'].join('+'),94cmd: 'JOG',95payload: {96axis: null,97direction: FORWARD,98factor: 199},100preventDefault: true101},102{ // Jog Backward103keys: ['ctrl', 'alt', 'command', '['].join('+'),104cmd: 'JOG',105payload: {106axis: null,107direction: BACKWARD,108factor: 1109},110preventDefault: true111},112{ // Jog Backward (Alias)113keys: ['ctrl', 'alt', 'command', 'b'].join('+'),114cmd: 'JOG',115payload: {116axis: null,117direction: BACKWARD,118factor: 1119},120preventDefault: true121},122{ // Jog X+123keys: 'right',124cmd: 'JOG',125payload: {126axis: AXIS_X,127direction: FORWARD,128factor: 1129},130preventDefault: false131},132{ // Jog X+ (undershoot)133keys: 'alt+right',134cmd: 'JOG',135payload: {136axis: AXIS_X,137direction: FORWARD,138factor: UNDERSHOOT_FACTOR139},140preventDefault: false141},142{ // Jog X+ (overshoot)143keys: 'shift+right',144cmd: 'JOG',145payload: {146axis: AXIS_X,147direction: FORWARD,148factor: OVERSHOOT_FACTOR149},150preventDefault: false151},152{ // Jog X-153keys: 'left',154cmd: 'JOG',155payload: {156axis: AXIS_X,157direction: BACKWARD,158factor: 1159},160preventDefault: false161},162{ // Jog X- (undershoot)163keys: 'alt+left',164cmd: 'JOG',165payload: {166axis: AXIS_X,167direction: BACKWARD,168factor: UNDERSHOOT_FACTOR169},170preventDefault: false171},172{ // Jog X- (overshoot)173keys: 'shift+left',174cmd: 'JOG',175payload: {176axis: AXIS_X,177direction: BACKWARD,178factor: OVERSHOOT_FACTOR179},180preventDefault: false181},182{ // Jog Y+183keys: 'up',184cmd: 'JOG',185payload: {186axis: AXIS_Y,187direction: FORWARD,188factor: 1189},190preventDefault: false191},192{ // Jog Y+ (undershoot)193keys: 'alt+up',194cmd: 'JOG',195payload: {196axis: AXIS_Y,197direction: FORWARD,198factor: UNDERSHOOT_FACTOR199},200preventDefault: false201},202{ // Jog Y+ (overshoot)203keys: 'shift+up',204cmd: 'JOG',205payload: {206axis: AXIS_Y,207direction: FORWARD,208factor: OVERSHOOT_FACTOR209},210preventDefault: false211},212{ // Jog Y-213keys: 'down',214cmd: 'JOG',215payload: {216axis: AXIS_Y,217direction: BACKWARD,218factor: 1219},220preventDefault: false221},222{ // Jog Y- (undershoot)223keys: 'alt+down',224cmd: 'JOG',225payload: {226axis: AXIS_Y,227direction: BACKWARD,228factor: UNDERSHOOT_FACTOR229},230preventDefault: false231},232{ // Jog Y- (overshoot)233keys: 'shift+down',234cmd: 'JOG',235payload: {236axis: AXIS_Y,237direction: BACKWARD,238factor: OVERSHOOT_FACTOR239},240preventDefault: false241},242{ // Jog Z+243keys: 'pageup',244cmd: 'JOG',245payload: {246axis: AXIS_Z,247direction: FORWARD,248factor: 1249},250preventDefault: false251},252{ // Jog Z+ (undershoot)253keys: 'alt+pageup',254cmd: 'JOG',255payload: {256axis: AXIS_Z,257direction: FORWARD,258factor: UNDERSHOOT_FACTOR259},260preventDefault: false261},262{ // Jog Z+ (overshoot)263keys: 'shift+pageup',264cmd: 'JOG',265payload: {266axis: AXIS_Z,267direction: FORWARD,268factor: OVERSHOOT_FACTOR269},270preventDefault: false271},272{ // Jog Z-273keys: 'pagedown',274cmd: 'JOG',275payload: {276axis: AXIS_Z,277direction: BACKWARD,278factor: 1279},280preventDefault: false281},282{ // Jog Z- (undershoot)283keys: 'alt+pagedown',284cmd: 'JOG',285payload: {286axis: AXIS_Z,287direction: BACKWARD,288factor: UNDERSHOOT_FACTOR289},290preventDefault: false291},292{ // Jog Z- (overshoot)293keys: 'shift+pagedown',294cmd: 'JOG',295payload: {296axis: AXIS_Z,297direction: BACKWARD,298factor: OVERSHOOT_FACTOR299},300preventDefault: false301},302{ // Jog A+303keys: ']',304cmd: 'JOG',305payload: {306axis: AXIS_A,307direction: FORWARD,308factor: 1309},310preventDefault: false311},312{ // Jog A+ (undershoot)313keys: 'alt+]',314cmd: 'JOG',315payload: {316axis: AXIS_A,317direction: FORWARD,318factor: UNDERSHOOT_FACTOR319},320preventDefault: false321},322{ // Jog A+ (overshoot)323keys: 'shift+]',324cmd: 'JOG',325payload: {326axis: AXIS_A,327direction: FORWARD,328factor: OVERSHOOT_FACTOR329},330preventDefault: false331},332{ // Jog A-333keys: '[',334cmd: 'JOG',335payload: {336axis: AXIS_A,337direction: BACKWARD,338factor: 1339},340preventDefault: false341},342{ // Jog A- (undershoot)343keys: 'alt+[',344cmd: 'JOG',345payload: {346axis: AXIS_A,347direction: BACKWARD,348factor: UNDERSHOOT_FACTOR349},350preventDefault: false351},352{ // Jog A- (overshoot)353keys: 'shift+[',354cmd: 'JOG',355payload: {356axis: AXIS_A,357direction: BACKWARD,358factor: OVERSHOOT_FACTOR359},360preventDefault: false361},362{ // Shuttle Zone -7363keys: ['ctrl', 'alt', 'shift', '7'].join('+'),364cmd: 'SHUTTLE',365payload: {366zone: -7367},368preventDefault: true369},370{ // Shuttle Zone -6371keys: ['ctrl', 'alt', 'shift', '6'].join('+'),372cmd: 'SHUTTLE',373payload: {374zone: -6375},376preventDefault: true377},378{ // Shuttle Zone -5379keys: ['ctrl', 'alt', 'shift', '5'].join('+'),380cmd: 'SHUTTLE',381payload: {382zone: -5383},384preventDefault: true385},386{ // Shuttle Zone -4387keys: ['ctrl', 'alt', 'shift', '4'].join('+'),388cmd: 'SHUTTLE',389payload: {390zone: -4391},392preventDefault: true393},394{ // Shuttle Zone -3395keys: ['ctrl', 'alt', 'shift', '3'].join('+'),396cmd: 'SHUTTLE',397payload: {398zone: -3399},400preventDefault: true401},402{ // Shuttle Zone -2403keys: ['ctrl', 'alt', 'shift', '2'].join('+'),404cmd: 'SHUTTLE',405payload: {406zone: -2407},408preventDefault: true409},410{ // Shuttle Zone -1411keys: ['ctrl', 'alt', 'shift', '1'].join('+'),412cmd: 'SHUTTLE',413payload: {414zone: -1415},416preventDefault: true417},418{ // Shuttle Zone 0419keys: ['ctrl', 'alt', 'command', '0'].join('+'),420cmd: 'SHUTTLE',421payload: {422zone: 0423},424preventDefault: true425},426{ // Shuttle Zone 1427keys: ['ctrl', 'alt', 'command', '1'].join('+'),428cmd: 'SHUTTLE',429payload: {430zone: 1431},432preventDefault: true433},434{ // Shuttle Zone 2435keys: ['ctrl', 'alt', 'command', '2'].join('+'),436cmd: 'SHUTTLE',437payload: {438zone: 2439},440preventDefault: true441},442{ // Shuttle Zone 3443keys: ['ctrl', 'alt', 'command', '3'].join('+'),444cmd: 'SHUTTLE',445payload: {446zone: 3447},448preventDefault: true449},450{ // Shuttle Zone 4451keys: ['ctrl', 'alt', 'command', '4'].join('+'),452cmd: 'SHUTTLE',453payload: {454zone: 4455},456preventDefault: true457},458{ // Shuttle Zone 5459keys: ['ctrl', 'alt', 'command', '5'].join('+'),460cmd: 'SHUTTLE',461payload: {462zone: 5463},464preventDefault: true465},466{ // Shuttle Zone 6467keys: ['ctrl', 'alt', 'command', '6'].join('+'),468cmd: 'SHUTTLE',469payload: {470zone: 6471},472preventDefault: true473},474{ // Shuttle Zone 7475keys: ['ctrl', 'alt', 'command', '7'].join('+'),476cmd: 'SHUTTLE',477payload: {478zone: 7479},480preventDefault: true481},482{ // Select X-axis483keys: ['ctrl', 'alt', 'command', 'x'].join('+'),484cmd: 'SELECT_AXIS',485payload: {486axis: 'x'487},488preventDefault: true489},490{ // Select Y-axis491keys: ['ctrl', 'alt', 'command', 'y'].join('+'),492cmd: 'SELECT_AXIS',493payload: {494axis: 'y'495},496preventDefault: true497},498{ // Select Z-axis499keys: ['ctrl', 'alt', 'command', 'z'].join('+'),500cmd: 'SELECT_AXIS',501payload: {502axis: 'z'503},504preventDefault: true505},506{ // Select A-axis507keys: ['ctrl', 'alt', 'command', 'a'].join('+'),508cmd: 'SELECT_AXIS',509payload: {510axis: 'a'511},512preventDefault: true513},514{ // Select B-axis515keys: ['ctrl', 'alt', 'command', 'b'].join('+'),516cmd: 'SELECT_AXIS',517payload: {518axis: 'b'519},520preventDefault: true521},522{ // Select C-axis523keys: ['ctrl', 'alt', 'command', 'c'].join('+'),524cmd: 'SELECT_AXIS',525payload: {526axis: 'c'527},528preventDefault: true529}530];531
532class Combokeys extends events.EventEmitter {533state = {534didBindEvents: false535};536
537list = [];538
539constructor(options = {}) {540super();541
542if (options.autoBind) {543this.bind();544}545}546
547bind() {548if (this.state.didBindEvents) {549return;550}551commandKeys.forEach((o) => {552const { keys, cmd, payload = {} } = o;553const callback = (event) => {554log.debug(`combokeys: keys=${keys} cmd=${cmd} payload=${JSON.stringify(payload)}`);555if (!!o.preventDefault) {556preventDefault(event);557}558this.emit(cmd, event, payload);559};560Mousetrap.bind(keys, callback);561this.list.push({ keys: keys, callback: callback });562});563this.state.didBindEvents = true;564}565
566unbind() {567if (!this.state.didBindEvents) {568return;569}570this.list.forEach((o) => {571const { keys, callback } = o;572Mousetrap.unbind(keys, callback);573});574this.state.didBindEvents = false;575}576
577reset() {578Mousetrap.reset();579this.state.didBindEvents = false;580}581}
582
583const combokeys = new Combokeys({ autoBind: true });584
585export default combokeys;586