ts-ssp
Version:
NodeJS library to work with coin and bill acceptors under SSP protocol. Written in Typescript.
205 lines • 7.94 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// tslint:disable-next-line: cyclomatic-complexity
const getEventFromEventCode = (eventCode, eventData, commands) => {
switch (eventCode) {
case 0xf1: //all
return ["slave_reset"];
case 0xef: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["read_note", eventData];
case 0xee: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["credit_note", eventData];
case 0xed: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["note_rejecting"];
case 0xec: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
//recieve reject code
void commands.exec("last_reject_code");
case 0xcc: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["note_stacking"];
case 0xeb: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["note_stacked"];
case 0xea: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["safe_note_jam"];
case 0xe9: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["unsafe_note_jam"];
case 0xe8: //all
return ["disabled"];
case 0xe6: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|nv201|SMART Payout|nv11|SMART Hopper
return ["fraud_attempt", eventData];
case 0xe7: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["stacker_full"];
case 0xe1: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|nv201|SMART Payout|nv11
return ["note_cleared_from_front", eventData];
case 0xe2: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|nv201|SMART Payout|nv11
return ["note_cleared_to_cashbox", eventData];
case 0xe3: //bv50|bv100|nv200|SMART Payout|nv11
return ["cashbox_removed"];
case 0xe4: //bv50|bv100|nv200|SMART Payout|nv11
return ["cashbox_replaced"];
case 0xe5: //nv200|nv201
return ["barcode_ticket_validated"];
case 0xd1: //nv200|nv201
return ["barcode_ticket_acknowledge"];
case 0xe0: //nv200
return ["note_path_open"];
case 0xb5: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|SMART Payout|nv11
return ["channel_disable"];
case 0xb6: //bv20|bv50|bv100|nv9usb|nv10usb|nv200|nv201|SMART Payout|nv11|SMART Hopper
return ["initialing"];
case 0xda: //SMART payout|SMART Hopper|nv11
return ["dispensing", eventData];
case 0xd2: //SMART payout|SMART Hopper|nv11
return ["dispensed", eventData];
// case 0xd2: //SMART payout|SMART Hopper|nv11
// TODO check out this code, it was dublicated
// return ["jammed", eventData];
case 0xd6: //SMART payout|SMART Hopper|nv11
return ["halted", eventData];
case 0xd7: //SMART payout|SMART Hopper
return ["floating", eventData];
case 0xd8: //SMART payout|SMART Hopper
return ["floated", eventData];
case 0xd9: //SMART payout|SMART Hopper|nv11
return ["timeout", eventData];
case 0xdc: //SMART payout|SMART Hopper|nv11
return ["incomplete_payout", eventData];
case 0xdd: //SMART payout|SMART Hopper|nv11
return ["incomplete_payout", eventData];
case 0xde: //SMART Hopper
return ["cashbox_paid", eventData];
case 0xdf: //SMART Hopper
return ["coin_credit", eventData];
case 0xc4: //SMART Hopper
return ["coin_mech_jammed"];
case 0xc5: //SMART Hopper
return ["coin_mech_return_pressed"];
case 0xb7: //SMART Hopper
return ["coin_mech_error"];
case 0xc2: //SMART payout|SMART Hopper|nv11
return ["emptying"];
case 0xc3: //SMART payout|SMART Hopper|nv11
return ["emptied"];
case 0xb3: //SMART payout|SMART Hopper|nv11
return ["smart_emptying", eventData];
case 0xb4: //SMART payout|SMART Hopper|nv11
return ["smart_emptied", eventData];
case 0xdb: //SMART payout|nv11
return ["note_stored_in_payout", eventData];
case 0xc6: //SMART payout|nv11
return ["payout_out_of_service"];
case 0xb0: //SMART payout
return ["jam_recovery"];
case 0xb1: //SMART payout
return ["error_during_payout"];
case 0xc9: //SMART payout|nv11
return ["note_transfered to stacker", eventData];
case 0xce: //SMART payout|nv11
return ["note_held_in_bezel", eventData];
case 0xcb: //SMART payout|nv11
return ["note_paid_into_store_at_powerup", eventData];
// case 0xcb: //SMART payout|nv11
// TODO check out this code, it was dublicated
// return ["note_paid_into_stacker_at_powerup", eventData];
case 0xcd: //nv11
return ["note_dispensed_at_powerup", eventData];
case 0xc7: //nv11
return ["note_float_removed"];
case 0xc8: //nv11
return ["note_float_attached"];
// case 0xc9: //nv11
// TODO check out this code, it was dublicated
// return ["device_full"];
//Reject reasons
case 0x0:
case 0x1:
case 0x2:
case 0x3:
case 0x4:
case 0x5:
case 0x6:
case 0x7:
case 0x8:
case 0x9:
case 0xa:
case 0xb:
case 0xc:
case 0xd:
case 0xe:
case 0xf:
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
case 0x1c:
return ["note_rejected", eventCode];
default:
throw new Error("Unknown event");
}
};
exports.getErrorMessageFromErrorCode = (errorCode) => {
switch (errorCode) {
case 0xf2:
return "Command not known";
case 0xf3:
return "Wrong no parameters";
case 0xf4:
return "Parameter out of range";
case 0xf5:
return "Command cannot be processed";
case 0xf6:
return "Software error";
case 0xf8:
return "Fail";
case 0xfa:
return "Key not set";
case 0xf0:
// OK
return undefined;
default:
return `Unknown error code ${errorCode}`;
}
};
exports.getEventFromBuffer = (buffer, commands) => {
/**
* Single byte indicating the start of a message 0x7F hex
*/
const STX = 0x7f;
if (buffer[0] !== STX) {
console.warn("unregistered message", buffer);
return ["unregistered_data", buffer];
}
const dataLength = buffer[2] + 3;
const startDataIndex = 3;
const data = buffer.slice(startDataIndex, dataLength);
const crcFromBuffer = buffer.slice(buffer.length - 2, buffer.length);
const crcCalculated = commands.crc16(buffer.slice(1, dataLength));
if (!crcFromBuffer.equals(Buffer.from(crcCalculated))) {
return [
"error",
new Error("Wrong CRC from validator"),
crcFromBuffer,
crcCalculated,
];
}
const errorCode = data[0];
const errorMessage = exports.getErrorMessageFromErrorCode(errorCode);
if (errorMessage) {
return ["error", new Error(errorMessage), buffer];
}
if (data.length < 2) {
return;
}
const eventCode = data[1];
const eventData = data[2];
const [commandName, commandData] = getEventFromEventCode(eventCode, eventData, commands);
return [commandName, commandData];
};
//# sourceMappingURL=SSPEvents.js.map