diff --git a/index.html b/index.html index 36e64fe..68b1506 100644 --- a/index.html +++ b/index.html @@ -99,9 +99,13 @@ methods: { async askForSerialPort() { this.connection = await SerialConnection.open(); + this.connection.on("tx", (data) => console.log("tx", data)); + this.connection.on("rx", (data) => console.log("rx", data)); }, async askForBleDevice() { this.connection = await BleConnection.open(); + this.connection.on("tx", (data) => console.log("tx", data)); + this.connection.on("rx", (data) => console.log("rx", data)); }, async disconnect() { if(this.connection){ diff --git a/src/connection/ble_connection.js b/src/connection/ble_connection.js index 5eee2ac..c8beff1 100644 --- a/src/connection/ble_connection.js +++ b/src/connection/ble_connection.js @@ -88,8 +88,9 @@ class BleConnection extends Connection { } } - async sendToRadioFrame(data) { - await this.write(data); + async sendToRadioFrame(frame) { + this.emit("tx", frame); + await this.write(frame); } } diff --git a/src/connection/connection.js b/src/connection/connection.js index eb95f3c..f34977e 100644 --- a/src/connection/connection.js +++ b/src/connection/connection.js @@ -1,8 +1,9 @@ import BufferWriter from "../buffer_writer.js"; import BufferReader from "../buffer_reader.js"; import Constants from "../constants.js"; +import EventEmitter from "../events.js"; -class Connection { +class Connection extends EventEmitter { async close() { throw new Error("This method must be implemented by the subclass."); @@ -130,7 +131,8 @@ class Connection { onFrameReceived(frame) { - // console.log("onFrameReceived", frame); + // emit received frame + this.emit("rx", frame); const bufferReader = new BufferReader(frame); const responseCode = bufferReader.readByte(); @@ -164,32 +166,32 @@ class Connection { } onAdvertPush(bufferReader) { - console.log("onAdvertPush", { + this.emit("AdvertPush", { publicKey: bufferReader.readBytes(32), }); } onSendConfirmedPush(bufferReader) { - console.log("onSendConfirmedPush", { + this.emit("SendConfirmedPush", { ackCode: bufferReader.readBytes(4), roundTrip: bufferReader.readUInt32LE(), }); } onMsgWaitingPush(bufferReader) { - console.log("onMsgWaitingPush", { + this.emit("MsgWaitingPush", { }); } onContactsStartResponse(bufferReader) { - console.log("onContactsStartResponse", { + this.emit("ContactsStartResponse", { count: bufferReader.readUInt32LE(), }); } onContactResponse(bufferReader) { - console.log("onContactResponse", { + this.emit("ContactResponse", { publicKey: bufferReader.readBytes(32), type: bufferReader.readByte(), flags: bufferReader.readByte(), @@ -204,19 +206,19 @@ class Connection { } onEndOfContactsResponse(bufferReader) { - console.log("onEndOfContactsResponse", { + this.emit("EndOfContactsResponse", { mostRecentLastmod: bufferReader.readUInt32LE(), }); } onSentResponse(bufferReader) { - console.log("onSentResponse", { + this.emit("SentResponse", { }); } onSelfInfoResponse(bufferReader) { - console.log("onSelfInfoResponse", { + this.emit("SelfInfoResponse", { type: bufferReader.readByte(), txPower: bufferReader.readByte(), maxTxPower: bufferReader.readByte(), @@ -233,19 +235,19 @@ class Connection { } onCurrTimeResponse(bufferReader) { - console.log("onCurrTimeResponse", { + this.emit("CurrTimeResponse", { epochSecs: bufferReader.readUInt32LE(), }); } onNoMoreMessagesResponse(bufferReader) { - console.log("onNoMoreMessagesResponse", { + this.emit("NoMoreMessagesResponse", { }); } onContactMsgRecvResponse(bufferReader) { - console.log("onContactMsgRecvResponse", { + this.emit("ContactMsgRecvResponse", { pubKeyPrefix: bufferReader.readBytes(6), pathLen: bufferReader.readByte(), txtType: bufferReader.readByte(), diff --git a/src/connection/serial_connection.js b/src/connection/serial_connection.js index ec69dab..4b40276 100644 --- a/src/connection/serial_connection.js +++ b/src/connection/serial_connection.js @@ -82,6 +82,7 @@ class SerialConnection extends Connection { async sendToRadioFrame(data) { // write "app to radio" frame 0x3c "<" + this.emit("tx", data); await this.writeFrame(0x3c, data); } diff --git a/src/events.js b/src/events.js new file mode 100644 index 0000000..1a8f238 --- /dev/null +++ b/src/events.js @@ -0,0 +1,42 @@ +class EventEmitter { + + constructor() { + this.eventListenersMap = new Map(); + } + + on(event, callback) { + + // create list of listeners for event if it doesn't exist + if(!this.eventListenersMap.has(event)){ + this.eventListenersMap.set(event, []); + } + + // add listener for event + this.eventListenersMap.get(event).push(callback); + + } + + off(event, callback) { + + // remove callback from listeners for this event + if(this.eventListenersMap.has(event)){ + const callbacks = this.eventListenersMap.get(event).filter(cb => cb !== callback); + this.eventListenersMap.set(event, callbacks); + } + + } + + emit(event, ...data) { + + // invoke each listener for this event + if(this.eventListenersMap.has(event)){ + for(const eventListener of this.eventListenersMap.get(event)){ + setTimeout(() => eventListener(...data), 0); + } + } + + } + +} + +export default EventEmitter;