@robdobsn/raftjs 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +14 -0
- package/.gitattributes +11 -0
- package/.nvmrc +1 -0
- package/LICENSE +22 -0
- package/README.md +11 -0
- package/TODO.md +1 -0
- package/dist/RaftAttributeHandler.d.ts +12 -0
- package/dist/RaftAttributeHandler.js +241 -0
- package/dist/RaftAttributeHandler.js.map +1 -0
- package/dist/RaftChannel.d.ts +18 -0
- package/dist/RaftChannel.js +12 -0
- package/dist/RaftChannel.js.map +1 -0
- package/dist/RaftChannelWebBLE.d.ts +38 -0
- package/dist/RaftChannelWebBLE.js +274 -0
- package/dist/RaftChannelWebBLE.js.map +1 -0
- package/dist/RaftChannelWebSerial.d.ts +37 -0
- package/dist/RaftChannelWebSerial.js +319 -0
- package/dist/RaftChannelWebSerial.js.map +1 -0
- package/dist/RaftChannelWebSocket.d.ts +28 -0
- package/dist/RaftChannelWebSocket.js +197 -0
- package/dist/RaftChannelWebSocket.js.map +1 -0
- package/dist/RaftCommsStats.d.ts +39 -0
- package/dist/RaftCommsStats.js +128 -0
- package/dist/RaftCommsStats.js.map +1 -0
- package/dist/RaftConnEvents.d.ts +31 -0
- package/dist/RaftConnEvents.js +44 -0
- package/dist/RaftConnEvents.js.map +1 -0
- package/dist/RaftConnector.d.ts +242 -0
- package/dist/RaftConnector.js +613 -0
- package/dist/RaftConnector.js.map +1 -0
- package/dist/RaftCustomAttrHandler.d.ts +4 -0
- package/dist/RaftCustomAttrHandler.js +50 -0
- package/dist/RaftCustomAttrHandler.js.map +1 -0
- package/dist/RaftDeviceInfo.d.ts +64 -0
- package/dist/RaftDeviceInfo.js +36 -0
- package/dist/RaftDeviceInfo.js.map +1 -0
- package/dist/RaftDeviceManager.d.ts +37 -0
- package/dist/RaftDeviceManager.js +450 -0
- package/dist/RaftDeviceManager.js.map +1 -0
- package/dist/RaftDeviceMsg.d.ts +9 -0
- package/dist/RaftDeviceMsg.js +11 -0
- package/dist/RaftDeviceMsg.js.map +1 -0
- package/dist/RaftDeviceStates.d.ts +33 -0
- package/dist/RaftDeviceStates.js +60 -0
- package/dist/RaftDeviceStates.js.map +1 -0
- package/dist/RaftFileHandler.d.ts +52 -0
- package/dist/RaftFileHandler.js +502 -0
- package/dist/RaftFileHandler.js.map +1 -0
- package/dist/RaftLog.d.ts +22 -0
- package/dist/RaftLog.js +63 -0
- package/dist/RaftLog.js.map +1 -0
- package/dist/RaftMiniHDLC.d.ts +18 -0
- package/dist/RaftMiniHDLC.js +383 -0
- package/dist/RaftMiniHDLC.js.map +1 -0
- package/dist/RaftMsgHandler.d.ts +57 -0
- package/dist/RaftMsgHandler.js +480 -0
- package/dist/RaftMsgHandler.js.map +1 -0
- package/dist/RaftMsgTrackInfo.d.ts +17 -0
- package/dist/RaftMsgTrackInfo.js +42 -0
- package/dist/RaftMsgTrackInfo.js.map +1 -0
- package/dist/RaftProtocolDefs.d.ts +30 -0
- package/dist/RaftProtocolDefs.js +48 -0
- package/dist/RaftProtocolDefs.js.map +1 -0
- package/dist/RaftStreamHandler.d.ts +38 -0
- package/dist/RaftStreamHandler.js +257 -0
- package/dist/RaftStreamHandler.js.map +1 -0
- package/dist/RaftSystemType.d.ts +21 -0
- package/dist/RaftSystemType.js +3 -0
- package/dist/RaftSystemType.js.map +1 -0
- package/dist/RaftSystemUtils.d.ts +136 -0
- package/dist/RaftSystemUtils.js +410 -0
- package/dist/RaftSystemUtils.js.map +1 -0
- package/dist/RaftTypes.d.ts +184 -0
- package/dist/RaftTypes.js +157 -0
- package/dist/RaftTypes.js.map +1 -0
- package/dist/RaftUpdateEvents.d.ts +33 -0
- package/dist/RaftUpdateEvents.js +46 -0
- package/dist/RaftUpdateEvents.js.map +1 -0
- package/dist/RaftUpdateManager.d.ts +61 -0
- package/dist/RaftUpdateManager.js +618 -0
- package/dist/RaftUpdateManager.js.map +1 -0
- package/dist/RaftUtils.d.ts +125 -0
- package/dist/RaftUtils.js +454 -0
- package/dist/RaftUtils.js.map +1 -0
- package/dist/RaftWifiTypes.d.ts +23 -0
- package/dist/RaftWifiTypes.js +43 -0
- package/dist/RaftWifiTypes.js.map +1 -0
- package/dist/TestDataGen.d.ts +7 -0
- package/dist/TestDataGen.js +133 -0
- package/dist/TestDataGen.js.map +1 -0
- package/dist/main.d.ts +18 -0
- package/dist/main.js +42 -0
- package/dist/main.js.map +1 -0
- package/eslint.config.mjs +33 -0
- package/examples/dashboard/package.json +39 -0
- package/examples/dashboard/src/ConnManager.ts +86 -0
- package/examples/dashboard/src/Main.tsx +100 -0
- package/examples/dashboard/src/StatusScreen.tsx +72 -0
- package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +144 -0
- package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +77 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +70 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +33 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +342 -0
- package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +170 -0
- package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +123 -0
- package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +207 -0
- package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +464 -0
- package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +146 -0
- package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +32 -0
- package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +371 -0
- package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +20 -0
- package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +113 -0
- package/examples/dashboard/src/index.html +15 -0
- package/examples/dashboard/src/index.tsx +15 -0
- package/examples/dashboard/src/styles.css +122 -0
- package/examples/dashboard/tsconfig.json +18 -0
- package/jest.config.js +11 -0
- package/package.json +50 -0
- package/src/RaftAttributeHandler.ts +289 -0
- package/src/RaftChannel.ts +30 -0
- package/src/RaftChannelWebBLE.ts +342 -0
- package/src/RaftChannelWebSerial.ts +408 -0
- package/src/RaftChannelWebSocket.ts +245 -0
- package/src/RaftCommsStats.ts +142 -0
- package/src/RaftConnEvents.ts +46 -0
- package/src/RaftConnector.ts +745 -0
- package/src/RaftCustomAttrHandler.ts +54 -0
- package/src/RaftDeviceInfo.ts +104 -0
- package/src/RaftDeviceManager.ts +542 -0
- package/src/RaftDeviceMsg.ts +20 -0
- package/src/RaftDeviceStates.ts +89 -0
- package/src/RaftFileHandler.ts +668 -0
- package/src/RaftLog.ts +70 -0
- package/src/RaftMiniHDLC.ts +396 -0
- package/src/RaftMsgHandler.ts +778 -0
- package/src/RaftMsgTrackInfo.ts +51 -0
- package/src/RaftProtocolDefs.ts +46 -0
- package/src/RaftStreamHandler.ts +328 -0
- package/src/RaftSystemType.ts +25 -0
- package/src/RaftSystemUtils.ts +487 -0
- package/src/RaftTypes.ts +250 -0
- package/src/RaftUpdateEvents.ts +48 -0
- package/src/RaftUpdateManager.ts +778 -0
- package/src/RaftUtils.ts +484 -0
- package/src/RaftWifiTypes.ts +36 -0
- package/src/TestDataGen.ts +157 -0
- package/src/main.ts +28 -0
- package/testdata/TestDeviceTypeRecs.json +492 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
3
|
+
//
|
|
4
|
+
// Raft Protocol Definitions
|
|
5
|
+
// Part of RaftJS
|
|
6
|
+
//
|
|
7
|
+
// Rob Dobson & Chris Greening 2020-2024
|
|
8
|
+
// (C) 2020-2024 All rights reserved
|
|
9
|
+
//
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RaftCommsMsgProtocol = exports.RaftCommsMsgTypeCode = exports.RICRESTElemCode = exports.RICREST_BRIDGE_PAYLOAD_POS = exports.RICREST_BRIDGE_ID_POS = exports.RICREST_FILEBLOCK_PAYLOAD_POS = exports.RICREST_FILEBLOCK_FILEPOS_POS_BYTES = exports.RICREST_FILEBLOCK_FILEPOS_POS = exports.RICREST_FILEBLOCK_CHANNEL_POS = exports.RICREST_HEADER_PAYLOAD_POS = exports.RICREST_REST_ELEM_CODE_POS = exports.RICSERIAL_PAYLOAD_POS = exports.RICSERIAL_PROTOCOL_POS = exports.RICSERIAL_MSG_NUM_POS = void 0;
|
|
13
|
+
// RIC Protocols
|
|
14
|
+
exports.RICSERIAL_MSG_NUM_POS = 0;
|
|
15
|
+
exports.RICSERIAL_PROTOCOL_POS = 1;
|
|
16
|
+
exports.RICSERIAL_PAYLOAD_POS = 2;
|
|
17
|
+
exports.RICREST_REST_ELEM_CODE_POS = 0;
|
|
18
|
+
exports.RICREST_HEADER_PAYLOAD_POS = 1;
|
|
19
|
+
exports.RICREST_FILEBLOCK_CHANNEL_POS = 0;
|
|
20
|
+
exports.RICREST_FILEBLOCK_FILEPOS_POS = 0;
|
|
21
|
+
exports.RICREST_FILEBLOCK_FILEPOS_POS_BYTES = 4;
|
|
22
|
+
exports.RICREST_FILEBLOCK_PAYLOAD_POS = 4;
|
|
23
|
+
exports.RICREST_BRIDGE_ID_POS = 2;
|
|
24
|
+
exports.RICREST_BRIDGE_PAYLOAD_POS = 3;
|
|
25
|
+
// Protocol enums
|
|
26
|
+
var RICRESTElemCode;
|
|
27
|
+
(function (RICRESTElemCode) {
|
|
28
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_URL"] = 0] = "RICREST_ELEM_CODE_URL";
|
|
29
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_CMDRESPJSON"] = 1] = "RICREST_ELEM_CODE_CMDRESPJSON";
|
|
30
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_BODY"] = 2] = "RICREST_ELEM_CODE_BODY";
|
|
31
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_COMMAND_FRAME"] = 3] = "RICREST_ELEM_CODE_COMMAND_FRAME";
|
|
32
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_FILEBLOCK"] = 4] = "RICREST_ELEM_CODE_FILEBLOCK";
|
|
33
|
+
})(RICRESTElemCode || (exports.RICRESTElemCode = RICRESTElemCode = {}));
|
|
34
|
+
var RaftCommsMsgTypeCode;
|
|
35
|
+
(function (RaftCommsMsgTypeCode) {
|
|
36
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_COMMAND"] = 0] = "MSG_TYPE_COMMAND";
|
|
37
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_RESPONSE"] = 1] = "MSG_TYPE_RESPONSE";
|
|
38
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_PUBLISH"] = 2] = "MSG_TYPE_PUBLISH";
|
|
39
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_REPORT"] = 3] = "MSG_TYPE_REPORT";
|
|
40
|
+
})(RaftCommsMsgTypeCode || (exports.RaftCommsMsgTypeCode = RaftCommsMsgTypeCode = {}));
|
|
41
|
+
var RaftCommsMsgProtocol;
|
|
42
|
+
(function (RaftCommsMsgProtocol) {
|
|
43
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_ROSSERIAL"] = 0] = "MSG_PROTOCOL_ROSSERIAL";
|
|
44
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_RESERVED_1"] = 1] = "MSG_PROTOCOL_RESERVED_1";
|
|
45
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_RICREST"] = 2] = "MSG_PROTOCOL_RICREST";
|
|
46
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_BRIDGE_RICREST"] = 3] = "MSG_PROTOCOL_BRIDGE_RICREST";
|
|
47
|
+
})(RaftCommsMsgProtocol || (exports.RaftCommsMsgProtocol = RaftCommsMsgProtocol = {}));
|
|
48
|
+
//# sourceMappingURL=RaftProtocolDefs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RaftProtocolDefs.js","sourceRoot":"","sources":["../src/RaftProtocolDefs.ts"],"names":[],"mappings":";AAAA,iHAAiH;AACjH,EAAE;AACF,4BAA4B;AAC5B,iBAAiB;AACjB,EAAE;AACF,wCAAwC;AACxC,oCAAoC;AACpC,EAAE;AACF,iHAAiH;;;AAEjH,gBAAgB;AACH,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,0BAA0B,GAAG,CAAC,CAAC;AAC/B,QAAA,0BAA0B,GAAG,CAAC,CAAC;AAC/B,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,mCAAmC,GAAG,CAAC,CAAC;AACxC,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,0BAA0B,GAAG,CAAC,CAAC;AAE5C,iBAAiB;AACjB,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,uFAAqB,CAAA;IACrB,uGAA6B,CAAA;IAC7B,yFAAsB,CAAA;IACtB,2GAA+B,CAAA;IAC/B,mGAA2B,CAAA;AAC7B,CAAC,EANW,eAAe,+BAAf,eAAe,QAM1B;AAED,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,uFAAgB,CAAA;IAChB,yFAAiB,CAAA;IACjB,uFAAgB,CAAA;IAChB,qFAAe,CAAA;AACjB,CAAC,EALW,oBAAoB,oCAApB,oBAAoB,QAK/B;AAED,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,mGAA0B,CAAA;IAC1B,qGAA2B,CAAA;IAC3B,+FAAwB,CAAA;IACxB,6GAA+B,CAAA;AACjC,CAAC,EALW,oBAAoB,oCAApB,oBAAoB,QAK/B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import RaftMsgHandler from './RaftMsgHandler';
|
|
2
|
+
import RaftCommsStats from './RaftCommsStats';
|
|
3
|
+
import RaftConnector from './RaftConnector';
|
|
4
|
+
export default class RaftStreamHandler {
|
|
5
|
+
private _streamID;
|
|
6
|
+
DEFAULT_MAX_BLOCK_SIZE: number;
|
|
7
|
+
private _maxBlockSize;
|
|
8
|
+
private _msgHandler;
|
|
9
|
+
private _commsStats;
|
|
10
|
+
private _raftConnector;
|
|
11
|
+
private _soktoReceived;
|
|
12
|
+
private _soktoPos;
|
|
13
|
+
private _streamIsStarting;
|
|
14
|
+
private _lastStreamStartTime;
|
|
15
|
+
private _isStreaming;
|
|
16
|
+
private _isPaused;
|
|
17
|
+
private _streamBuffer;
|
|
18
|
+
private _audioDuration;
|
|
19
|
+
private _audioByteRate;
|
|
20
|
+
private _streamPos;
|
|
21
|
+
private _numBlocksWithoutPause;
|
|
22
|
+
private _legacySoktoMode;
|
|
23
|
+
private soundFinishPoint;
|
|
24
|
+
constructor(msgHandler: RaftMsgHandler, commsStats: RaftCommsStats, raftConnector: RaftConnector);
|
|
25
|
+
setNumBlocksWithoutPause(numBlocks: number): void;
|
|
26
|
+
setLegacySoktoMode(legacyMode: boolean): void;
|
|
27
|
+
streamAudio(streamContents: Uint8Array, clearExisting: boolean, audioDuration: number): void;
|
|
28
|
+
streamCancel(): Promise<void>;
|
|
29
|
+
isStreamStarting(): boolean;
|
|
30
|
+
clearFinishPointTimeout(): void;
|
|
31
|
+
streamingPerformanceChecker(): void;
|
|
32
|
+
private _sendStreamStartMsg;
|
|
33
|
+
get maxBlockSize(): number;
|
|
34
|
+
set maxBlockSize(maxBlockSize: number);
|
|
35
|
+
private _sendStreamEndMsg;
|
|
36
|
+
private _sendStreamBuffer;
|
|
37
|
+
onSoktoMsg(soktoPos: number): void;
|
|
38
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
3
|
+
//
|
|
4
|
+
// RafStreamHandler
|
|
5
|
+
// Part of RaftJS
|
|
6
|
+
//
|
|
7
|
+
// Rob Dobson & Chris Greening 2020-2024
|
|
8
|
+
// (C) 2020-2024 All rights reserved
|
|
9
|
+
//
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const tslib_1 = require("tslib");
|
|
13
|
+
const RaftLog_1 = tslib_1.__importDefault(require("./RaftLog"));
|
|
14
|
+
const RaftTypes_1 = require("./RaftTypes");
|
|
15
|
+
const RaftConnEvents_1 = require("./RaftConnEvents");
|
|
16
|
+
const RaftProtocolDefs_1 = require("./RaftProtocolDefs");
|
|
17
|
+
class RaftStreamHandler {
|
|
18
|
+
constructor(msgHandler, commsStats, raftConnector) {
|
|
19
|
+
// Queue of audio stream requests
|
|
20
|
+
/*
|
|
21
|
+
private _streamAudioQueue: {
|
|
22
|
+
streamContents: Uint8Array;
|
|
23
|
+
audioDuration: number;
|
|
24
|
+
}[] = [];
|
|
25
|
+
*/
|
|
26
|
+
// Stream state
|
|
27
|
+
this._streamID = null;
|
|
28
|
+
this.DEFAULT_MAX_BLOCK_SIZE = 475;
|
|
29
|
+
this._maxBlockSize = this.DEFAULT_MAX_BLOCK_SIZE;
|
|
30
|
+
// Flow control
|
|
31
|
+
this._soktoReceived = false;
|
|
32
|
+
this._soktoPos = 0;
|
|
33
|
+
this._streamIsStarting = false;
|
|
34
|
+
this._lastStreamStartTime = 0;
|
|
35
|
+
this._isStreaming = false;
|
|
36
|
+
this._isPaused = false;
|
|
37
|
+
this._streamBuffer = new Uint8Array();
|
|
38
|
+
this._audioDuration = 0;
|
|
39
|
+
this._audioByteRate = 0;
|
|
40
|
+
this._streamPos = 0;
|
|
41
|
+
this._numBlocksWithoutPause = 15;
|
|
42
|
+
this._legacySoktoMode = false;
|
|
43
|
+
// soundFinishPoint timer
|
|
44
|
+
this.soundFinishPoint = null;
|
|
45
|
+
this._raftConnector = raftConnector;
|
|
46
|
+
this._msgHandler = msgHandler;
|
|
47
|
+
this._commsStats = commsStats;
|
|
48
|
+
this.onSoktoMsg = this.onSoktoMsg.bind(this);
|
|
49
|
+
}
|
|
50
|
+
setNumBlocksWithoutPause(numBlocks) {
|
|
51
|
+
this._numBlocksWithoutPause = numBlocks;
|
|
52
|
+
}
|
|
53
|
+
setLegacySoktoMode(legacyMode) {
|
|
54
|
+
RaftLog_1.default.debug(`Setting legacy sokto mode to ${legacyMode}`);
|
|
55
|
+
this._legacySoktoMode = legacyMode;
|
|
56
|
+
}
|
|
57
|
+
// Start streaming audio
|
|
58
|
+
streamAudio(streamContents, clearExisting, audioDuration) {
|
|
59
|
+
if (!clearExisting)
|
|
60
|
+
RaftLog_1.default.debug(`only clearExisting = true is supported right now.`);
|
|
61
|
+
// TODO - if clearExisting is not set, form a queue
|
|
62
|
+
if (this._streamIsStarting || this._lastStreamStartTime > (Date.now() - 500)) {
|
|
63
|
+
RaftLog_1.default.error(`Unable to start sound, too soon since last request`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this._isPaused = true;
|
|
67
|
+
this._streamIsStarting = true;
|
|
68
|
+
this._lastStreamStartTime = Date.now();
|
|
69
|
+
this._soktoReceived = false;
|
|
70
|
+
this._soktoPos = 0;
|
|
71
|
+
this._streamPos = 0;
|
|
72
|
+
this._streamBuffer = streamContents;
|
|
73
|
+
this._audioDuration = audioDuration;
|
|
74
|
+
this._audioByteRate = (streamContents.length / audioDuration) * 1000;
|
|
75
|
+
this.clearFinishPointTimeout();
|
|
76
|
+
this._sendStreamStartMsg("audio.mp3", "streamaudio", RaftTypes_1.RaftStreamType.REAL_TIME_STREAM, streamContents).then((result) => {
|
|
77
|
+
this._isPaused = false;
|
|
78
|
+
this._streamIsStarting = false;
|
|
79
|
+
if (!result) {
|
|
80
|
+
RaftLog_1.default.error(`Unable to start stream. ufStart message send failed`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
//this.streamingPerformanceChecker();
|
|
84
|
+
if (!this._isStreaming) {
|
|
85
|
+
this._isStreaming = true;
|
|
86
|
+
this._sendStreamBuffer();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async streamCancel() {
|
|
91
|
+
this._streamBuffer = new Uint8Array();
|
|
92
|
+
this.clearFinishPointTimeout();
|
|
93
|
+
}
|
|
94
|
+
isStreamStarting() {
|
|
95
|
+
return this._streamIsStarting;
|
|
96
|
+
}
|
|
97
|
+
clearFinishPointTimeout() {
|
|
98
|
+
if (this.soundFinishPoint) {
|
|
99
|
+
clearTimeout(this.soundFinishPoint);
|
|
100
|
+
this.soundFinishPoint = null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
streamingPerformanceChecker() {
|
|
104
|
+
if (this._audioDuration) {
|
|
105
|
+
this.clearFinishPointTimeout();
|
|
106
|
+
this.soundFinishPoint = setTimeout(() => {
|
|
107
|
+
// if the streaming hasn't finished before the end of the audio
|
|
108
|
+
// we can assume we are having streaming issues
|
|
109
|
+
// publish event in case we are having issues
|
|
110
|
+
this._raftConnector.onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_STREAMING_ISSUE);
|
|
111
|
+
this.clearFinishPointTimeout();
|
|
112
|
+
}, this._audioDuration + 500);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Send the start message
|
|
116
|
+
async _sendStreamStartMsg(streamName, targetEndpoint, streamTypeEnum, streamContents) {
|
|
117
|
+
// Stream start command message
|
|
118
|
+
const streamType = 'rtstream';
|
|
119
|
+
const cmdMsg = `{"cmdName":"ufStart","reqStr":"ufStart","fileType":"${streamType}","fileName":"${streamName}","endpoint":"${targetEndpoint}","fileLen":${streamContents.length}}`;
|
|
120
|
+
// Debug
|
|
121
|
+
RaftLog_1.default.debug(`sendStreamStartMsg ${cmdMsg}`);
|
|
122
|
+
// Send
|
|
123
|
+
let streamStartResp = null;
|
|
124
|
+
try {
|
|
125
|
+
streamStartResp = await this._msgHandler.sendRICREST(cmdMsg, RaftProtocolDefs_1.RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
RaftLog_1.default.error(`sendStreamStartMsg error ${err}`);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
// Extract params
|
|
132
|
+
if (streamStartResp && (streamStartResp.rslt === 'ok')) {
|
|
133
|
+
this._streamID = streamStartResp.streamID;
|
|
134
|
+
this._maxBlockSize = streamStartResp.maxBlockSize || this.DEFAULT_MAX_BLOCK_SIZE;
|
|
135
|
+
this.streamingPerformanceChecker();
|
|
136
|
+
RaftLog_1.default.verbose(`sendStreamStartMsg streamID ${this._streamID} maxBlockSize ${this._maxBlockSize} streamType ${streamTypeEnum}`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
RaftLog_1.default.warn(`sendStreamStartMsg failed ${streamStartResp ? streamStartResp.rslt : 'no response'}`);
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
get maxBlockSize() {
|
|
145
|
+
return this._maxBlockSize;
|
|
146
|
+
}
|
|
147
|
+
set maxBlockSize(maxBlockSize) {
|
|
148
|
+
this._maxBlockSize = maxBlockSize;
|
|
149
|
+
this.DEFAULT_MAX_BLOCK_SIZE = maxBlockSize;
|
|
150
|
+
}
|
|
151
|
+
async _sendStreamEndMsg(streamID) {
|
|
152
|
+
if (streamID === null) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
// Stram end command message
|
|
156
|
+
const cmdMsg = `{"cmdName":"ufEnd","reqStr":"ufEnd","streamID":${streamID}}`;
|
|
157
|
+
// Debug
|
|
158
|
+
RaftLog_1.default.debug(`sendStreamEndMsg ${cmdMsg}`);
|
|
159
|
+
// Send
|
|
160
|
+
let streamEndResp = null;
|
|
161
|
+
try {
|
|
162
|
+
streamEndResp = await this._msgHandler.sendRICREST(cmdMsg, RaftProtocolDefs_1.RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
RaftLog_1.default.error(`sendStreamEndMsg error ${err}`);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
return streamEndResp.rslt === 'ok';
|
|
169
|
+
}
|
|
170
|
+
/*
|
|
171
|
+
private async _sendAudioStopMsg(): Promise<RaftOKFail> {
|
|
172
|
+
const cmdMsg = `{"cmdName":"audio/stop"}`;
|
|
173
|
+
|
|
174
|
+
// Debug
|
|
175
|
+
RaftLog.debug(`sendAudioStopMsg ${cmdMsg}`);
|
|
176
|
+
|
|
177
|
+
// Send
|
|
178
|
+
return this._msgHandler.sendRICREST<RaftOKFail>(
|
|
179
|
+
cmdMsg,
|
|
180
|
+
RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
private async _sendStreamCancelMsg(): Promise<RaftOKFail> {
|
|
186
|
+
// File cancel command message
|
|
187
|
+
const cmdMsg = `{"cmdName":"ufCancel","reqStr":"ufCancel","streamID":${this._streamID}}`;
|
|
188
|
+
|
|
189
|
+
// Debug
|
|
190
|
+
RaftLog.debug(`sendStreamCancelMsg ${cmdMsg}`);
|
|
191
|
+
|
|
192
|
+
// Send
|
|
193
|
+
return this._msgHandler.sendRICREST<RaftOKFail>(
|
|
194
|
+
cmdMsg,
|
|
195
|
+
RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
*/
|
|
199
|
+
async _sendStreamBuffer() {
|
|
200
|
+
const streamStartTime = Date.now();
|
|
201
|
+
// Check streamID is valid
|
|
202
|
+
if (this._streamID === null) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
let blockNum = 0;
|
|
206
|
+
// Send stream blocks
|
|
207
|
+
while (this._soktoPos < this._streamBuffer.length || this._isPaused) {
|
|
208
|
+
if (this._isPaused) {
|
|
209
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
// Check for new sokto
|
|
213
|
+
if (this._soktoReceived) {
|
|
214
|
+
if (this._legacySoktoMode)
|
|
215
|
+
this._streamPos = this._soktoPos;
|
|
216
|
+
// apart from when in legacy mode, the sokto message is now informational only,
|
|
217
|
+
// to allow the central to slow down sending of data if it is swamping the peripheral
|
|
218
|
+
RaftLog_1.default.verbose(`sendStreamContents ${Date.now() - streamStartTime}ms soktoReceived for ${this._streamPos}`);
|
|
219
|
+
this._soktoReceived = false;
|
|
220
|
+
// receiving an sokto message before the completion of the stream means that the streaming is not keeping up
|
|
221
|
+
this._raftConnector.onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_STREAMING_ISSUE);
|
|
222
|
+
}
|
|
223
|
+
// Send stream block
|
|
224
|
+
const blockSize = Math.min(this._streamBuffer.length - this._streamPos, this._maxBlockSize);
|
|
225
|
+
const block = this._streamBuffer.slice(this._streamPos, this._streamPos + blockSize);
|
|
226
|
+
if (block.length > 0) {
|
|
227
|
+
const sentOk = await this._msgHandler.sendStreamBlock(block, this._streamPos, this._streamID);
|
|
228
|
+
this._commsStats.recordStreamBytes(block.length);
|
|
229
|
+
RaftLog_1.default.verbose(`sendStreamContents ${sentOk ? "OK" : "FAILED"} ${Date.now() - streamStartTime}ms pos ${this._streamPos} ${blockSize} ${block.length} ${this._soktoPos}`);
|
|
230
|
+
if (!sentOk) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
this._streamPos += blockSize;
|
|
234
|
+
blockNum += 1;
|
|
235
|
+
if (this._audioByteRate && blockNum > this._numBlocksWithoutPause) {
|
|
236
|
+
const pauseTime = ((blockSize / this._audioByteRate) * 1000) - 10;
|
|
237
|
+
RaftLog_1.default.verbose(`Pausing for ${pauseTime} ms between audio packets. Bit rate ${this._audioByteRate * 8}`);
|
|
238
|
+
await new Promise((resolve) => setTimeout(resolve, pauseTime));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Wait to ensure we don't hog the CPU
|
|
242
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
243
|
+
}
|
|
244
|
+
this._isStreaming = false;
|
|
245
|
+
this.clearFinishPointTimeout();
|
|
246
|
+
await this._sendStreamEndMsg(this._streamID);
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
onSoktoMsg(soktoPos) {
|
|
250
|
+
// Get how far we've progressed in file
|
|
251
|
+
this._soktoPos = soktoPos;
|
|
252
|
+
this._soktoReceived = true;
|
|
253
|
+
RaftLog_1.default.debug(`onSoktoMsg received file up to ${this._soktoPos}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.default = RaftStreamHandler;
|
|
257
|
+
//# sourceMappingURL=RaftStreamHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RaftStreamHandler.js","sourceRoot":"","sources":["../src/RaftStreamHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import RaftSystemUtils from "./RaftSystemUtils";
|
|
2
|
+
import { RaftEventFn } from "./RaftTypes";
|
|
3
|
+
export type RaftSubscribeForUpdatesCBType = (systemUtils: RaftSystemUtils, enable: boolean) => Promise<void>;
|
|
4
|
+
export type RaftStateIsInvalidCBType = () => void;
|
|
5
|
+
export type RaftRxOtherMsgType = (payload: Uint8Array, _frameTimeMs: number) => void;
|
|
6
|
+
export interface ConnectorOptions {
|
|
7
|
+
wsSuffix?: string;
|
|
8
|
+
connTimeoutMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface RaftSystemType {
|
|
11
|
+
nameForDialogs: string;
|
|
12
|
+
defaultWiFiHostname: string;
|
|
13
|
+
firmwareDestName: string;
|
|
14
|
+
normalFileDestName: string;
|
|
15
|
+
connectorOptions: ConnectorOptions;
|
|
16
|
+
setup: (systemUtils: RaftSystemUtils, onEvent: RaftEventFn | null) => void;
|
|
17
|
+
subscribeForUpdates: RaftSubscribeForUpdatesCBType | null;
|
|
18
|
+
stateIsInvalid: RaftStateIsInvalidCBType | null;
|
|
19
|
+
rxOtherMsgType: RaftRxOtherMsgType | null;
|
|
20
|
+
}
|
|
21
|
+
export type RaftGetSystemTypeCBType = (systemUtils: RaftSystemUtils) => Promise<RaftSystemType | null>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RaftSystemType.js","sourceRoot":"","sources":["../src/RaftSystemType.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { RaftWifiConnStatus } from "./RaftWifiTypes";
|
|
2
|
+
import RaftMsgHandler from "./RaftMsgHandler";
|
|
3
|
+
import { RaftFileList, RaftFriendlyName, RaftOKFail, RaftSysModInfoBLEMan, RaftSystemInfo, RaftWifiScanResults } from "./RaftTypes";
|
|
4
|
+
export default class RaftSystemUtils {
|
|
5
|
+
private _msgHandler;
|
|
6
|
+
private _systemInfo;
|
|
7
|
+
private _friendlyName;
|
|
8
|
+
private _wifiConnStatus;
|
|
9
|
+
private _defaultWiFiHostname;
|
|
10
|
+
private _maxSecsToWaitForWiFiConn;
|
|
11
|
+
/**
|
|
12
|
+
* constructor
|
|
13
|
+
* @param raftMsgHandler
|
|
14
|
+
*/
|
|
15
|
+
constructor(raftMsgHandler: RaftMsgHandler);
|
|
16
|
+
/**
|
|
17
|
+
* getMsgHandler
|
|
18
|
+
* @returns RaftMsgHandler
|
|
19
|
+
*/
|
|
20
|
+
getMsgHandler(): RaftMsgHandler;
|
|
21
|
+
/**
|
|
22
|
+
* setDefaultWiFiHostname
|
|
23
|
+
* @param defaultWiFiHostname
|
|
24
|
+
*/
|
|
25
|
+
setDefaultWiFiHostname(defaultWiFiHostname: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* getFriendlyName
|
|
28
|
+
*
|
|
29
|
+
* @returns friendly name
|
|
30
|
+
*/
|
|
31
|
+
getFriendlyName(): RaftFriendlyName | null;
|
|
32
|
+
/**
|
|
33
|
+
* invalidate
|
|
34
|
+
*/
|
|
35
|
+
invalidate(): void;
|
|
36
|
+
/**
|
|
37
|
+
* retrieveInfo - get system info
|
|
38
|
+
* @returns Promise<RaftSystemInfo>
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
retrieveInfo(): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
* getSystemInfo
|
|
45
|
+
* @param forceGet - true to force a get from the raft app
|
|
46
|
+
* @returns Promise<RaftSystemInfo>
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
getSystemInfo(forceGet?: boolean): Promise<RaftSystemInfo>;
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
* setRaftName
|
|
53
|
+
* @param newName name to refer to Raft - used for BLE advertising
|
|
54
|
+
* @returns Promise<boolean> true if successful
|
|
55
|
+
*
|
|
56
|
+
*/
|
|
57
|
+
setRaftName(newName: string): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* getRaftName
|
|
61
|
+
* @param forceGet - true to force a get from the raft app
|
|
62
|
+
* @returns Promise<RaftNameResponse> (object containing rslt)
|
|
63
|
+
*
|
|
64
|
+
*/
|
|
65
|
+
getRaftName(forceGet?: boolean): Promise<RaftFriendlyName>;
|
|
66
|
+
/**
|
|
67
|
+
*
|
|
68
|
+
* getFileList - get list of files on file system
|
|
69
|
+
* @returns Promise<RaftFileList>
|
|
70
|
+
*
|
|
71
|
+
*/
|
|
72
|
+
getFileList(): Promise<RaftFileList>;
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
* Get BLEMan sysmod info
|
|
76
|
+
*
|
|
77
|
+
* @returns RaftSysModInfoBLEMan
|
|
78
|
+
*
|
|
79
|
+
*/
|
|
80
|
+
getSysModInfoBLEMan(): Promise<RaftSysModInfoBLEMan | null>;
|
|
81
|
+
/**
|
|
82
|
+
* Get hostname of connected WiFi
|
|
83
|
+
*
|
|
84
|
+
* @return string - hostname of connected WiFi
|
|
85
|
+
*
|
|
86
|
+
*/
|
|
87
|
+
_getHostnameFromFriendlyName(): string;
|
|
88
|
+
/**
|
|
89
|
+
* Get Wifi connection status
|
|
90
|
+
*
|
|
91
|
+
* @return boolean - true if connected
|
|
92
|
+
*
|
|
93
|
+
*/
|
|
94
|
+
getWiFiConnStatus(): Promise<boolean | null>;
|
|
95
|
+
/**
|
|
96
|
+
* pause Wifi connection
|
|
97
|
+
*
|
|
98
|
+
* @param boolean - true to pause, false to resume
|
|
99
|
+
* @return boolean - true if successful
|
|
100
|
+
*
|
|
101
|
+
*/
|
|
102
|
+
pauseWifiConnection(pause: boolean): Promise<boolean>;
|
|
103
|
+
/**
|
|
104
|
+
* Connect to WiFi
|
|
105
|
+
*
|
|
106
|
+
* @param string - WiFi SSID
|
|
107
|
+
* @param string - WiFi password
|
|
108
|
+
* @return boolean - true if successful
|
|
109
|
+
*
|
|
110
|
+
*/
|
|
111
|
+
wifiConnect(ssid: string, password: string): Promise<boolean>;
|
|
112
|
+
/**
|
|
113
|
+
* Disconnect WiFi
|
|
114
|
+
*
|
|
115
|
+
* @return boolean - true if successful
|
|
116
|
+
*
|
|
117
|
+
*/
|
|
118
|
+
wifiDisconnect(): Promise<boolean>;
|
|
119
|
+
/**
|
|
120
|
+
* WiFiScan start
|
|
121
|
+
*
|
|
122
|
+
* @return boolean - true if successful
|
|
123
|
+
*
|
|
124
|
+
*/
|
|
125
|
+
wifiScanStart(): Promise<boolean>;
|
|
126
|
+
/**
|
|
127
|
+
* WiFiScan get results
|
|
128
|
+
*
|
|
129
|
+
* @return boolean - false if unsuccessful, otherwise the results of the promise
|
|
130
|
+
*
|
|
131
|
+
*/
|
|
132
|
+
wifiScanResults(): Promise<boolean | RaftOKFail | RaftWifiScanResults>;
|
|
133
|
+
getCachedSystemInfo(): RaftSystemInfo | null;
|
|
134
|
+
getCachedRaftName(): RaftFriendlyName | null;
|
|
135
|
+
getCachedWifiStatus(): RaftWifiConnStatus;
|
|
136
|
+
}
|