@robotical/webapp-types 1.0.0
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/application-manager.ts +20 -0
- package/dist-types/src/application/ApplicationManager/ApplicationManager.d.ts +91 -0
- package/dist-types/src/application/ApplicationManager/ApplicationManager.js +448 -0
- package/dist-types/src/application/RAFTs/Cog/Cog.d.ts +39 -0
- package/dist-types/src/application/RAFTs/Cog/Cog.js +171 -0
- package/dist-types/src/application/RAFTs/Marty/Marty.d.ts +40 -0
- package/dist-types/src/application/RAFTs/Marty/Marty.js +179 -0
- package/dist-types/src/application/RAFTs/RAFT.d.ts +109 -0
- package/dist-types/src/application/RAFTs/RAFT.js +313 -0
- package/dist-types/src/application/RAFTs/RAFTInterface.d.ts +13 -0
- package/dist-types/src/application/RAFTs/RAFTInterface.js +6 -0
- package/dist-types/src/application/RAFTs/RaftObserver.d.ts +10 -0
- package/dist-types/src/application/RAFTs/RaftObserver.js +1 -0
- package/dist-types/src/application/RAFTs/raft-subscription-helpers.d.ts +59 -0
- package/dist-types/src/application/RAFTs/raft-subscription-helpers.js +324 -0
- package/dist-types/src/application/communicators/SelfdestructiveMessagePromise.d.ts +10 -0
- package/dist-types/src/application/communicators/SelfdestructiveMessagePromise.js +31 -0
- package/dist-types/src/application/communicators/WrapperCommunicator.d.ts +24 -0
- package/dist-types/src/application/communicators/WrapperCommunicator.js +137 -0
- package/dist-types/src/components/disposables/LoadingSpinner/index.d.ts +7 -0
- package/dist-types/src/components/disposables/LoadingSpinner/index.js +29 -0
- package/dist-types/src/components/disposables/buttons/SVGImageButton/index.d.ts +14 -0
- package/dist-types/src/components/disposables/buttons/SVGImageButton/index.js +19 -0
- package/dist-types/src/components/disposables/buttons/SimpleButton/index.d.ts +14 -0
- package/dist-types/src/components/disposables/buttons/SimpleButton/index.js +18 -0
- package/dist-types/src/components/modals/DisconnectConfirmation/index.d.ts +6 -0
- package/dist-types/src/components/modals/DisconnectConfirmation/index.js +63 -0
- package/dist-types/src/components/modals/DisconnectConfirmation/styles.d.ts +1 -0
- package/dist-types/src/components/modals/DisconnectConfirmation/styles.js +7 -0
- package/dist-types/src/components/modals/InUnplugged/index.d.ts +1 -0
- package/dist-types/src/components/modals/InUnplugged/index.js +12 -0
- package/dist-types/src/components/modals/InUnplugged/styles.d.ts +5 -0
- package/dist-types/src/components/modals/InUnplugged/styles.js +11 -0
- package/dist-types/src/components/modals/VerificationModal/index.d.ts +6 -0
- package/dist-types/src/components/modals/VerificationModal/index.js +124 -0
- package/dist-types/src/components/modals/VerificationModalPhoneApp/index.d.ts +6 -0
- package/dist-types/src/components/modals/VerificationModalPhoneApp/index.js +190 -0
- package/dist-types/src/components/oneoffs/LEDs/index.d.ts +8 -0
- package/dist-types/src/components/oneoffs/LEDs/index.js +39 -0
- package/dist-types/src/components/oneoffs/RICSignal/index.d.ts +7 -0
- package/dist-types/src/components/oneoffs/RICSignal/index.js +29 -0
- package/dist-types/src/services/logger/Logger.d.ts +7 -0
- package/dist-types/src/services/logger/Logger.js +19 -0
- package/dist-types/src/state-observables/modal/ModalObserver.d.ts +17 -0
- package/dist-types/src/state-observables/modal/ModalObserver.js +1 -0
- package/dist-types/src/state-observables/modal/ModalState.d.ts +24 -0
- package/dist-types/src/state-observables/modal/ModalState.js +69 -0
- package/dist-types/src/store/SelectedRaftContext.d.ts +17 -0
- package/dist-types/src/store/SelectedRaftContext.js +80 -0
- package/dist-types/src/styles/colors.d.ts +35 -0
- package/dist-types/src/styles/colors.js +42 -0
- package/dist-types/src/types/communication-between-apps/wrapper-communication.d.ts +45 -0
- package/dist-types/src/types/communication-between-apps/wrapper-communication.js +25 -0
- package/dist-types/src/types/events/raft-info.d.ts +10 -0
- package/dist-types/src/types/events/raft-info.js +11 -0
- package/dist-types/src/types/phone-app-communicator.d.ts +20 -0
- package/dist-types/src/types/phone-app-communicator.js +5 -0
- package/dist-types/src/types/raft.d.ts +18 -0
- package/dist-types/src/types/raft.js +14 -0
- package/dist-types/src/utils/Toaster.d.ts +13 -0
- package/dist-types/src/utils/Toaster.js +38 -0
- package/dist-types/src/utils/helpers/compare-version.d.ts +2 -0
- package/dist-types/src/utils/helpers/compare-version.js +19 -0
- package/dist-types/src/utils/helpers/randomHashGenerator.d.ts +1 -0
- package/dist-types/src/utils/helpers/randomHashGenerator.js +10 -0
- package/dist-types/src/utils/helpers/rescale-range.d.ts +2 -0
- package/dist-types/src/utils/helpers/rescale-range.js +4 -0
- package/dist-types/src/utils/helpers/wifi-configuration-subtitle-gen.d.ts +3 -0
- package/dist-types/src/utils/helpers/wifi-configuration-subtitle-gen.js +34 -0
- package/dist-types/src/utils/phone-app-communication/is-phone-app.d.ts +5 -0
- package/dist-types/src/utils/phone-app-communication/is-phone-app.js +7 -0
- package/dist-types/src/wrapper-app/WrapperAppManager.d.ts +58 -0
- package/dist-types/src/wrapper-app/WrapperAppManager.js +176 -0
- package/dist-types/src/wrapper-app/communicators/WebAppCommunicator.d.ts +24 -0
- package/dist-types/src/wrapper-app/communicators/WebAppCommunicator.js +243 -0
- package/dist-types/src/wrapper-app/connectors/CogConnector/CogConnector.d.ts +35 -0
- package/dist-types/src/wrapper-app/connectors/CogConnector/CogConnector.js +177 -0
- package/dist-types/src/wrapper-app/connectors/Connector.d.ts +69 -0
- package/dist-types/src/wrapper-app/connectors/Connector.js +315 -0
- package/dist-types/src/wrapper-app/connectors/ConnectorFactory.d.ts +15 -0
- package/dist-types/src/wrapper-app/connectors/ConnectorFactory.js +99 -0
- package/dist-types/src/wrapper-app/connectors/ConnectorInterface.d.ts +10 -0
- package/dist-types/src/wrapper-app/connectors/ConnectorInterface.js +6 -0
- package/dist-types/src/wrapper-app/connectors/MartyConnector/MartyConnector.d.ts +35 -0
- package/dist-types/src/wrapper-app/connectors/MartyConnector/MartyConnector.js +219 -0
- package/dist-types/types-package/application-manager.d.ts +17 -0
- package/dist-types/types-package/application-manager.js +5 -0
- package/package.json +13 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is needed so we can build and publish the ApplicationManager interface to the children projects
|
|
3
|
+
*/
|
|
4
|
+
import ApplicationManager from "../src/application/ApplicationManager/ApplicationManager";
|
|
5
|
+
import WrapperCommunicator from "../src/application/communicators/WrapperCommunicator";
|
|
6
|
+
import Logger from "../src/services/logger/Logger";
|
|
7
|
+
import WebAppCommunicator from "../src/wrapper-app/communicators/WebAppCommunicator";
|
|
8
|
+
|
|
9
|
+
export { ApplicationManager }
|
|
10
|
+
|
|
11
|
+
declare global {
|
|
12
|
+
interface Window {
|
|
13
|
+
ReactNativeWebView: any;
|
|
14
|
+
// marty: Marty;
|
|
15
|
+
WebAppCommunicator: WebAppCommunicator;
|
|
16
|
+
wrapperCommunicator: WrapperCommunicator;
|
|
17
|
+
applicationManager: ApplicationManager;
|
|
18
|
+
Logger: Logger;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { RaftConnectionMethod } from "../../types/raft";
|
|
2
|
+
import WebAppCommunicator from "../../wrapper-app/communicators/WebAppCommunicator";
|
|
3
|
+
import RAFT from "../RAFTs/RAFT";
|
|
4
|
+
import Marty from "../RAFTs/Marty/Marty";
|
|
5
|
+
import Cog from "../RAFTs/Cog/Cog";
|
|
6
|
+
import { FOUND_RAFT_ON_DISCOVERY_RESPONSE } from "../../types/phone-app-communicator";
|
|
7
|
+
import { RaftObserver } from "../RAFTs/RaftObserver";
|
|
8
|
+
import { RaftInfoEvents } from "../../types/events/raft-info";
|
|
9
|
+
import { RaftConnEvent, RaftUpdateEvent, RaftPublishEvent } from "@robdobsn/raftjs";
|
|
10
|
+
import { ConnectedRaftItem } from "../../store/SelectedRaftContext";
|
|
11
|
+
import Toaster from "../../utils/Toaster";
|
|
12
|
+
export default class ApplicationManager {
|
|
13
|
+
private _observers;
|
|
14
|
+
static wrapperAppCommunicator: WebAppCommunicator;
|
|
15
|
+
connectedRafts: {
|
|
16
|
+
[key: string]: RAFT;
|
|
17
|
+
};
|
|
18
|
+
ricSelectedCb: ((raft: RAFT) => void) | null;
|
|
19
|
+
toaster: typeof Toaster;
|
|
20
|
+
connectedRaftContextMethods: {
|
|
21
|
+
addConnectedRaft: (connectedRaft: ConnectedRaftItem) => void;
|
|
22
|
+
removeConnectedRaft: (connectedRaftId: string) => void;
|
|
23
|
+
setSelectedRaft: (connectedRaftId: string) => void;
|
|
24
|
+
};
|
|
25
|
+
isPhoneApp: () => boolean;
|
|
26
|
+
constructor();
|
|
27
|
+
createNewCog(id: string): Cog;
|
|
28
|
+
createNewMarty(id: string): Marty;
|
|
29
|
+
/**
|
|
30
|
+
* Generic Connect method
|
|
31
|
+
* This method is called from various environments (connection button, blocksjr, blocks etc.)
|
|
32
|
+
* Known issue: connecting to a raft from within a platform won't add the newly connected raft to the connectedRafts hook
|
|
33
|
+
*/
|
|
34
|
+
connectGeneric(afterRaftConnectedCb: (raft: RAFT) => void): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Disconnect from RAFT generic
|
|
37
|
+
* This method is called from various environments (connection button, blocksjr, blocks etc.)
|
|
38
|
+
*/
|
|
39
|
+
disconnectGeneric(raft: RAFT): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Selects a RAFT in Phone's verification modal
|
|
42
|
+
*/
|
|
43
|
+
selectRaft(ricToConnectTo: FOUND_RAFT_ON_DISCOVERY_RESPONSE['foundRIC'], method: RaftConnectionMethod): Promise<RAFT | null>;
|
|
44
|
+
connectToRIC(method: RaftConnectionMethod): Promise<RAFT | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Disconnect from RAFT
|
|
47
|
+
*/
|
|
48
|
+
disconnectFromRaft(raftId: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Removes raft after a certain time
|
|
51
|
+
* Removes from the rics list after x seconds so that we can still get the last event
|
|
52
|
+
*/
|
|
53
|
+
_removeRIC(raftId: string, timeout: number): void;
|
|
54
|
+
/**
|
|
55
|
+
* Start looking for rics to connect to
|
|
56
|
+
* This is used from the Phone App only
|
|
57
|
+
*/
|
|
58
|
+
startDiscovery(ricSelectedCb: (raft: RAFT) => void): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Stop verifying raft
|
|
61
|
+
*/
|
|
62
|
+
stopVerifyingRaft(raftId: string, isCorrectRIC: boolean): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Publishing events to observers
|
|
65
|
+
* It could be either events we get from RAFT, or custom events related to the app
|
|
66
|
+
*/
|
|
67
|
+
publish(eventType: string, eventEnum: RaftConnEvent | RaftUpdateEvent | RaftPublishEvent | RaftInfoEvents, eventName: string, eventData: any): void;
|
|
68
|
+
subscribe(observer: RaftObserver, topics: Array<string>): void;
|
|
69
|
+
unsubscribe(observer: RaftObserver): void;
|
|
70
|
+
receivedRICEvent(raftId: string, eventType: any, eventEnum: any, eventName: any, eventData: any): void;
|
|
71
|
+
/**
|
|
72
|
+
* Save the file on the device
|
|
73
|
+
*/
|
|
74
|
+
saveFileOnDevice(fileName: string, base64: string): void | Promise<unknown>;
|
|
75
|
+
/**
|
|
76
|
+
* Save the file on the device's local storage
|
|
77
|
+
*/
|
|
78
|
+
saveFileOnDeviceLocalStorage(dirname: string, fileName: string, base64: string): void | Promise<unknown>;
|
|
79
|
+
/**
|
|
80
|
+
* Load the file from the device's local storage
|
|
81
|
+
*/
|
|
82
|
+
loadFileFromDeviceLocalStorage(dirname: string, fileName: string): void | Promise<unknown>;
|
|
83
|
+
/**
|
|
84
|
+
* Delete the file from the device's local storage
|
|
85
|
+
*/
|
|
86
|
+
deleteFileFromDeviceLocalStorage(dirname: string, fileName: string): void | Promise<unknown>;
|
|
87
|
+
/**
|
|
88
|
+
* List the files from the device's local storage
|
|
89
|
+
*/
|
|
90
|
+
listFilesFromDeviceLocalStorage(dirname: string): Promise<unknown>;
|
|
91
|
+
}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { createElement } from "react";
|
|
38
|
+
import modalState from "../../state-observables/modal/ModalState";
|
|
39
|
+
import { RaftConnectionMethod, RaftTypeE } from "../../types/raft";
|
|
40
|
+
import WebAppCommunicator from "../../wrapper-app/communicators/WebAppCommunicator";
|
|
41
|
+
import RAFT from "../RAFTs/RAFT";
|
|
42
|
+
import Marty from "../RAFTs/Marty/Marty";
|
|
43
|
+
import Cog from "../RAFTs/Cog/Cog";
|
|
44
|
+
import VerificationModal from "../../components/modals/VerificationModal";
|
|
45
|
+
import { raftFoundSubscriptionHelper } from "../RAFTs/raft-subscription-helpers";
|
|
46
|
+
import { AppSentMessage } from "../../types/communication-between-apps/wrapper-communication";
|
|
47
|
+
import VerificationModalPhoneApp from "../../components/modals/VerificationModalPhoneApp";
|
|
48
|
+
import Logger from "../../services/logger/Logger";
|
|
49
|
+
import isPhoneApp from "../../utils/phone-app-communication/is-phone-app";
|
|
50
|
+
import DisconnectConfirmationModal from "../../components/modals/DisconnectConfirmation";
|
|
51
|
+
import Toaster from "../../utils/Toaster";
|
|
52
|
+
var SHOW_LOGS = true;
|
|
53
|
+
var TAG = "ApplicationManager";
|
|
54
|
+
var ApplicationManager = /** @class */ (function () {
|
|
55
|
+
function ApplicationManager() {
|
|
56
|
+
// Observers
|
|
57
|
+
this._observers = {};
|
|
58
|
+
// Connected RICs
|
|
59
|
+
this.connectedRafts = {};
|
|
60
|
+
// Callback to call when a RAFT is selected (Phone App only)
|
|
61
|
+
// We need that to make sure the connection button gets the selected RAFT once the user selects one
|
|
62
|
+
this.ricSelectedCb = null;
|
|
63
|
+
// // RICNotificationsManager
|
|
64
|
+
// private _ricNotificationsManager: RICNotificationsManager = new RICNotificationsManager(
|
|
65
|
+
// this
|
|
66
|
+
// );
|
|
67
|
+
// sound streaming stats
|
|
68
|
+
// public soundStreamingStats = new MartySoundStreamingStats();
|
|
69
|
+
// Updater removers: when marty disconnects
|
|
70
|
+
// these functions will clear the time intervals
|
|
71
|
+
// created for updating the sensors
|
|
72
|
+
// all dbs for session data
|
|
73
|
+
// public sessionDbs = new SessionsDBManager();
|
|
74
|
+
// toaster
|
|
75
|
+
this.toaster = Toaster;
|
|
76
|
+
// connected raft context methods
|
|
77
|
+
this.connectedRaftContextMethods = {
|
|
78
|
+
addConnectedRaft: function (connectedRaft) { },
|
|
79
|
+
removeConnectedRaft: function (connectedRaftId) { },
|
|
80
|
+
setSelectedRaft: function (connectedRaftId) { },
|
|
81
|
+
};
|
|
82
|
+
this.isPhoneApp = isPhoneApp;
|
|
83
|
+
// super();
|
|
84
|
+
// AnalyticsManager.appStartSession();
|
|
85
|
+
}
|
|
86
|
+
ApplicationManager.prototype.createNewCog = function (id) {
|
|
87
|
+
return new Cog(id);
|
|
88
|
+
};
|
|
89
|
+
ApplicationManager.prototype.createNewMarty = function (id) {
|
|
90
|
+
return new Marty(id);
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Generic Connect method
|
|
94
|
+
* This method is called from various environments (connection button, blocksjr, blocks etc.)
|
|
95
|
+
* Known issue: connecting to a raft from within a platform won't add the newly connected raft to the connectedRafts hook
|
|
96
|
+
*/
|
|
97
|
+
ApplicationManager.prototype.connectGeneric = function (afterRaftConnectedCb) {
|
|
98
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
99
|
+
var e_1, newRaft, e_2;
|
|
100
|
+
var _this = this;
|
|
101
|
+
return __generator(this, function (_a) {
|
|
102
|
+
switch (_a.label) {
|
|
103
|
+
case 0:
|
|
104
|
+
if (!isPhoneApp()) return [3 /*break*/, 5];
|
|
105
|
+
_a.label = 1;
|
|
106
|
+
case 1:
|
|
107
|
+
_a.trys.push([1, 3, , 4]);
|
|
108
|
+
return [4 /*yield*/, window.applicationManager.startDiscovery(function (newRaft) {
|
|
109
|
+
_this.connectedRaftContextMethods.addConnectedRaft({ id: newRaft.id, name: newRaft.getFriendlyName() || "", isSelected: true });
|
|
110
|
+
afterRaftConnectedCb(newRaft);
|
|
111
|
+
})];
|
|
112
|
+
case 2:
|
|
113
|
+
_a.sent();
|
|
114
|
+
return [3 /*break*/, 4];
|
|
115
|
+
case 3:
|
|
116
|
+
e_1 = _a.sent();
|
|
117
|
+
Logger.error(SHOW_LOGS, TAG, "Failed to start discovery: ".concat(e_1));
|
|
118
|
+
return [3 /*break*/, 4];
|
|
119
|
+
case 4: return [3 /*break*/, 8];
|
|
120
|
+
case 5:
|
|
121
|
+
_a.trys.push([5, 7, , 8]);
|
|
122
|
+
return [4 /*yield*/, window.applicationManager.connectToRIC(RaftConnectionMethod.WEB_BLE)];
|
|
123
|
+
case 6:
|
|
124
|
+
newRaft = _a.sent();
|
|
125
|
+
if (newRaft) {
|
|
126
|
+
this.connectedRaftContextMethods.addConnectedRaft({ id: newRaft.id, name: newRaft.getFriendlyName() || "", isSelected: true });
|
|
127
|
+
afterRaftConnectedCb(newRaft);
|
|
128
|
+
}
|
|
129
|
+
return [3 /*break*/, 8];
|
|
130
|
+
case 7:
|
|
131
|
+
e_2 = _a.sent();
|
|
132
|
+
Logger.error(SHOW_LOGS, TAG, "Failed to connect to new robot: ".concat(e_2));
|
|
133
|
+
return [3 /*break*/, 8];
|
|
134
|
+
case 8: return [2 /*return*/];
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Disconnect from RAFT generic
|
|
141
|
+
* This method is called from various environments (connection button, blocksjr, blocks etc.)
|
|
142
|
+
*/
|
|
143
|
+
ApplicationManager.prototype.disconnectGeneric = function (raft) {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
145
|
+
var confirmDisconnect, e_3;
|
|
146
|
+
return __generator(this, function (_a) {
|
|
147
|
+
switch (_a.label) {
|
|
148
|
+
case 0:
|
|
149
|
+
_a.trys.push([0, 3, , 4]);
|
|
150
|
+
return [4 /*yield*/, modalState.setModal(createElement(DisconnectConfirmationModal, { connectedRaft: window.applicationManager.connectedRafts[raft.id] }), "Are you sure you want to disconnect from your ".concat(raft.getFriendlyName(), "?"))];
|
|
151
|
+
case 1:
|
|
152
|
+
confirmDisconnect = _a.sent();
|
|
153
|
+
if (!confirmDisconnect) {
|
|
154
|
+
return [2 /*return*/];
|
|
155
|
+
}
|
|
156
|
+
return [4 /*yield*/, window.applicationManager.disconnectFromRaft(raft.id)];
|
|
157
|
+
case 2:
|
|
158
|
+
_a.sent();
|
|
159
|
+
return [3 /*break*/, 4];
|
|
160
|
+
case 3:
|
|
161
|
+
e_3 = _a.sent();
|
|
162
|
+
Logger.error(SHOW_LOGS, TAG, "Failed to disconnect from robot: ".concat(e_3));
|
|
163
|
+
return [3 /*break*/, 4];
|
|
164
|
+
case 4: return [2 /*return*/];
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* Selects a RAFT in Phone's verification modal
|
|
171
|
+
*/
|
|
172
|
+
ApplicationManager.prototype.selectRaft = function (ricToConnectTo, method) {
|
|
173
|
+
var _a, _b;
|
|
174
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
175
|
+
var selectResults, raftId, raftType, raft;
|
|
176
|
+
return __generator(this, function (_c) {
|
|
177
|
+
switch (_c.label) {
|
|
178
|
+
case 0: return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.RAFT_SELECT, { discoveredRIC: ricToConnectTo, method: method })];
|
|
179
|
+
case 1:
|
|
180
|
+
selectResults = _c.sent();
|
|
181
|
+
if (!selectResults.success) return [3 /*break*/, 3];
|
|
182
|
+
raftId = (_a = selectResults.data) === null || _a === void 0 ? void 0 : _a.raftId;
|
|
183
|
+
raftType = (_b = selectResults.data) === null || _b === void 0 ? void 0 : _b.raftType;
|
|
184
|
+
if (!raftId || !raftType) {
|
|
185
|
+
throw new Error("RAFT ID or RAFT Type is missing: ".concat(raftId, " ").concat(raftType));
|
|
186
|
+
}
|
|
187
|
+
raft = void 0;
|
|
188
|
+
switch (raftType) {
|
|
189
|
+
case RaftTypeE.MARTY:
|
|
190
|
+
raft = this.createNewMarty(raftId);
|
|
191
|
+
break;
|
|
192
|
+
case RaftTypeE.COG:
|
|
193
|
+
raft = this.createNewCog(raftId);
|
|
194
|
+
break;
|
|
195
|
+
default:
|
|
196
|
+
throw new Error("Unknown RAFT type");
|
|
197
|
+
}
|
|
198
|
+
this.connectedRafts[raftId] = raft;
|
|
199
|
+
// get missed Connect event
|
|
200
|
+
window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.GET_MISSED_CONN_EVENT, { raftId: raftId });
|
|
201
|
+
// Note: we're verifying the RAFT from the place this functions is called
|
|
202
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 200); })];
|
|
203
|
+
case 2:
|
|
204
|
+
// Note: we're verifying the RAFT from the place this functions is called
|
|
205
|
+
_c.sent();
|
|
206
|
+
if (this.ricSelectedCb) {
|
|
207
|
+
this.ricSelectedCb(raft);
|
|
208
|
+
}
|
|
209
|
+
return [2 /*return*/, raft];
|
|
210
|
+
case 3:
|
|
211
|
+
Logger.warn(SHOW_LOGS, TAG, "Failed to select RAFT with id: ".concat(ricToConnectTo._id));
|
|
212
|
+
_c.label = 4;
|
|
213
|
+
case 4: return [2 /*return*/, null];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
ApplicationManager.prototype.connectToRIC = function (method) {
|
|
219
|
+
var _a, _b;
|
|
220
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
221
|
+
var wasConnectedObj, raftId, raftType, raft;
|
|
222
|
+
return __generator(this, function (_c) {
|
|
223
|
+
switch (_c.label) {
|
|
224
|
+
case 0: return [4 /*yield*/, RAFT.connect(method)];
|
|
225
|
+
case 1:
|
|
226
|
+
wasConnectedObj = _c.sent();
|
|
227
|
+
if (!wasConnectedObj.success) return [3 /*break*/, 3];
|
|
228
|
+
raftId = (_a = wasConnectedObj.data) === null || _a === void 0 ? void 0 : _a.raftId;
|
|
229
|
+
raftType = (_b = wasConnectedObj.data) === null || _b === void 0 ? void 0 : _b.raftType;
|
|
230
|
+
if (!raftId || !raftType) {
|
|
231
|
+
throw new Error("RAFT ID or RAFT Type is missing: ".concat(raftId, " ").concat(raftType));
|
|
232
|
+
}
|
|
233
|
+
raft = void 0;
|
|
234
|
+
switch (raftType) {
|
|
235
|
+
case RaftTypeE.MARTY:
|
|
236
|
+
raft = this.createNewMarty(raftId);
|
|
237
|
+
break;
|
|
238
|
+
case RaftTypeE.COG:
|
|
239
|
+
raft = this.createNewCog(raftId);
|
|
240
|
+
break;
|
|
241
|
+
default:
|
|
242
|
+
throw new Error("Unknown RAFT type");
|
|
243
|
+
}
|
|
244
|
+
this.connectedRafts[raftId] = raft;
|
|
245
|
+
// get missed Connect event
|
|
246
|
+
window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.GET_MISSED_CONN_EVENT, { raftId: raftId });
|
|
247
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 200); })];
|
|
248
|
+
case 2:
|
|
249
|
+
_c.sent();
|
|
250
|
+
// start verification process
|
|
251
|
+
modalState.setModal(createElement(VerificationModal, { connectedRAFT_: raft }), "Looking for ".concat(raft.type));
|
|
252
|
+
return [2 /*return*/, raft];
|
|
253
|
+
case 3: return [2 /*return*/, null];
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
};
|
|
258
|
+
/**
|
|
259
|
+
* Disconnect from RAFT
|
|
260
|
+
*/
|
|
261
|
+
ApplicationManager.prototype.disconnectFromRaft = function (raftId) {
|
|
262
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
263
|
+
var raft;
|
|
264
|
+
return __generator(this, function (_a) {
|
|
265
|
+
switch (_a.label) {
|
|
266
|
+
case 0:
|
|
267
|
+
this.connectedRaftContextMethods.removeConnectedRaft(raftId);
|
|
268
|
+
raft = this.connectedRafts[raftId];
|
|
269
|
+
if (!raft) {
|
|
270
|
+
return [2 /*return*/];
|
|
271
|
+
}
|
|
272
|
+
return [4 /*yield*/, raft.disconnect()];
|
|
273
|
+
case 1:
|
|
274
|
+
_a.sent();
|
|
275
|
+
this._removeRIC(raftId, 11000);
|
|
276
|
+
return [2 /*return*/];
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* Removes raft after a certain time
|
|
283
|
+
* Removes from the rics list after x seconds so that we can still get the last event
|
|
284
|
+
*/
|
|
285
|
+
ApplicationManager.prototype._removeRIC = function (raftId, timeout) {
|
|
286
|
+
var _this = this;
|
|
287
|
+
var ricRemovalTimeout = setTimeout(function () {
|
|
288
|
+
delete _this.connectedRafts[raftId];
|
|
289
|
+
clearTimeout(ricRemovalTimeout);
|
|
290
|
+
}, timeout);
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* Start looking for rics to connect to
|
|
294
|
+
* This is used from the Phone App only
|
|
295
|
+
*/
|
|
296
|
+
ApplicationManager.prototype.startDiscovery = function (ricSelectedCb) {
|
|
297
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
298
|
+
var foundRICs, wasDiscoveryStarted;
|
|
299
|
+
return __generator(this, function (_a) {
|
|
300
|
+
switch (_a.label) {
|
|
301
|
+
case 0:
|
|
302
|
+
this.ricSelectedCb = ricSelectedCb;
|
|
303
|
+
foundRICs = [];
|
|
304
|
+
raftFoundSubscriptionHelper().subscribe(function (_a) {
|
|
305
|
+
var discoveredRIC = _a.discoveredRIC;
|
|
306
|
+
// if the discovered RAFT is already in the list, don't add it, just update the rssi
|
|
307
|
+
var foundRICIdx = foundRICs.findIndex(function (ric_) { return ric_._id === discoveredRIC._id; });
|
|
308
|
+
if (foundRICIdx !== -1) {
|
|
309
|
+
foundRICs[foundRICIdx] = discoveredRIC;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
foundRICs.push(discoveredRIC);
|
|
313
|
+
}
|
|
314
|
+
// foundRICs.sort((a, b) => b._rssi - a._rssi);
|
|
315
|
+
modalState.setModal(createElement(VerificationModalPhoneApp, { foundRICs: foundRICs }), "Looking for RAFT");
|
|
316
|
+
});
|
|
317
|
+
return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.RAFT_START_DISCOVERY)];
|
|
318
|
+
case 1:
|
|
319
|
+
wasDiscoveryStarted = _a.sent();
|
|
320
|
+
if (!wasDiscoveryStarted) {
|
|
321
|
+
return [2 /*return*/, raftFoundSubscriptionHelper().unsubscribe()];
|
|
322
|
+
}
|
|
323
|
+
return [4 /*yield*/, modalState.setModal(createElement(VerificationModalPhoneApp, { foundRICs: [] }), "Looking for RAFT")];
|
|
324
|
+
case 2:
|
|
325
|
+
_a.sent();
|
|
326
|
+
raftFoundSubscriptionHelper().unsubscribe();
|
|
327
|
+
return [2 /*return*/];
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
};
|
|
332
|
+
/**
|
|
333
|
+
* Stop verifying raft
|
|
334
|
+
*/
|
|
335
|
+
ApplicationManager.prototype.stopVerifyingRaft = function (raftId, isCorrectRIC) {
|
|
336
|
+
var _a;
|
|
337
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
338
|
+
return __generator(this, function (_b) {
|
|
339
|
+
switch (_b.label) {
|
|
340
|
+
case 0: return [4 /*yield*/, ((_a = this.connectedRafts[raftId]) === null || _a === void 0 ? void 0 : _a.stopVerifyingRaft(isCorrectRIC))];
|
|
341
|
+
case 1:
|
|
342
|
+
_b.sent();
|
|
343
|
+
this._removeRIC(raftId, 11000);
|
|
344
|
+
return [2 /*return*/];
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
};
|
|
349
|
+
/**
|
|
350
|
+
* Publishing events to observers
|
|
351
|
+
* It could be either events we get from RAFT, or custom events related to the app
|
|
352
|
+
*/
|
|
353
|
+
ApplicationManager.prototype.publish = function (eventType, eventEnum, eventName, eventData) {
|
|
354
|
+
if (this._observers.hasOwnProperty(eventType)) {
|
|
355
|
+
for (var _i = 0, _a = this._observers[eventType]; _i < _a.length; _i++) {
|
|
356
|
+
var observer = _a[_i];
|
|
357
|
+
observer.notify(eventType, eventEnum, eventName, eventData);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
// observer
|
|
362
|
+
ApplicationManager.prototype.subscribe = function (observer, topics) {
|
|
363
|
+
for (var _i = 0, topics_1 = topics; _i < topics_1.length; _i++) {
|
|
364
|
+
var topic = topics_1[_i];
|
|
365
|
+
if (!this._observers[topic]) {
|
|
366
|
+
this._observers[topic] = [];
|
|
367
|
+
}
|
|
368
|
+
if (this._observers[topic].indexOf(observer) === -1) {
|
|
369
|
+
this._observers[topic].push(observer);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
ApplicationManager.prototype.unsubscribe = function (observer) {
|
|
374
|
+
for (var topic in this._observers) {
|
|
375
|
+
if (this._observers.hasOwnProperty(topic)) {
|
|
376
|
+
var index = this._observers[topic].indexOf(observer);
|
|
377
|
+
if (index !== -1) {
|
|
378
|
+
this._observers[topic].splice(index, 1);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
ApplicationManager.prototype.receivedRICEvent = function (raftId, eventType, eventEnum, eventName, eventData) {
|
|
384
|
+
var _a;
|
|
385
|
+
if (raftId === "scanner") {
|
|
386
|
+
this.publish(eventType, eventEnum, eventName, eventData);
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
(_a = this.connectedRafts[raftId]) === null || _a === void 0 ? void 0 : _a.receivedRICEvent(eventType, eventEnum, eventName, eventData);
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
//======================//
|
|
393
|
+
/* NATIVE COMMANDS ONLY */
|
|
394
|
+
//======================//
|
|
395
|
+
/**
|
|
396
|
+
* Save the file on the device
|
|
397
|
+
*/
|
|
398
|
+
ApplicationManager.prototype.saveFileOnDevice = function (fileName, base64) {
|
|
399
|
+
if (!fileName || !base64) {
|
|
400
|
+
return Logger.error(SHOW_LOGS, TAG, "fileName or base64 is missing: fileName: ".concat(fileName, ", base64: ").concat(base64));
|
|
401
|
+
}
|
|
402
|
+
return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.SAVE_FILE_ON_DEVICE, { fileName: fileName, base64: base64 });
|
|
403
|
+
};
|
|
404
|
+
/**
|
|
405
|
+
* Save the file on the device's local storage
|
|
406
|
+
*/
|
|
407
|
+
ApplicationManager.prototype.saveFileOnDeviceLocalStorage = function (dirname, fileName, base64) {
|
|
408
|
+
if (!fileName || !base64) {
|
|
409
|
+
return Logger.error(SHOW_LOGS, TAG, "fileName or base64 is missing: fileName: ".concat(fileName, ", base64: ").concat(base64));
|
|
410
|
+
}
|
|
411
|
+
return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.SAVE_FILE_ON_DEVICE_LOCAL_STORAGE, { dirname: dirname, fileName: fileName, base64: base64 });
|
|
412
|
+
};
|
|
413
|
+
/**
|
|
414
|
+
* Load the file from the device's local storage
|
|
415
|
+
*/
|
|
416
|
+
ApplicationManager.prototype.loadFileFromDeviceLocalStorage = function (dirname, fileName) {
|
|
417
|
+
if (!fileName) {
|
|
418
|
+
return Logger.error(SHOW_LOGS, TAG, "fileName is missing: fileName: ".concat(fileName));
|
|
419
|
+
}
|
|
420
|
+
return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.LOAD_FILE_FROM_DEVICE_LOCAL_STORAGE, { dirname: dirname, fileName: fileName });
|
|
421
|
+
};
|
|
422
|
+
/**
|
|
423
|
+
* Delete the file from the device's local storage
|
|
424
|
+
*/
|
|
425
|
+
ApplicationManager.prototype.deleteFileFromDeviceLocalStorage = function (dirname, fileName) {
|
|
426
|
+
if (!fileName) {
|
|
427
|
+
return Logger.error(SHOW_LOGS, TAG, "fileName is missing: fileName: ".concat(fileName));
|
|
428
|
+
}
|
|
429
|
+
return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.DELETE_FILE_FROM_DEVICE_LOCAL_STORAGE, { dirname: dirname, fileName: fileName });
|
|
430
|
+
};
|
|
431
|
+
/**
|
|
432
|
+
* List the files from the device's local storage
|
|
433
|
+
*/
|
|
434
|
+
ApplicationManager.prototype.listFilesFromDeviceLocalStorage = function (dirname) {
|
|
435
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
436
|
+
return __generator(this, function (_a) {
|
|
437
|
+
switch (_a.label) {
|
|
438
|
+
case 0: return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.LIST_FILES_FROM_DEVICE_LOCAL_STORAGE, { dirname: dirname })];
|
|
439
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
};
|
|
444
|
+
// Communicator to the wrapper app
|
|
445
|
+
ApplicationManager.wrapperAppCommunicator = new WebAppCommunicator();
|
|
446
|
+
return ApplicationManager;
|
|
447
|
+
}());
|
|
448
|
+
export default ApplicationManager;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import RAFT from "../RAFT";
|
|
2
|
+
import RICInterface from "../RAFTInterface";
|
|
3
|
+
import { RaftTypeE } from "../../../types/raft";
|
|
4
|
+
import { CogStateInfo, RICLedLcdColours } from "@robotical/roboticaljs";
|
|
5
|
+
import { RaftConnEvent, RaftPublishEvent, RaftUpdateEvent } from "@robdobsn/raftjs";
|
|
6
|
+
import { RaftInfoEvents } from "../../../types/events/raft-info";
|
|
7
|
+
export declare class Cog extends RAFT implements RICInterface {
|
|
8
|
+
id: string;
|
|
9
|
+
type: RaftTypeE;
|
|
10
|
+
_ledLcdColours: RICLedLcdColours;
|
|
11
|
+
raftStateInfo: CogStateInfo | null;
|
|
12
|
+
constructor(id: string);
|
|
13
|
+
get ledLcdColours(): RICLedLcdColours;
|
|
14
|
+
/**
|
|
15
|
+
* Gets the RSSI of the RAFT
|
|
16
|
+
*/
|
|
17
|
+
getRSSI(): number;
|
|
18
|
+
/**
|
|
19
|
+
* Gets the battery strength of the RAFT
|
|
20
|
+
*/
|
|
21
|
+
getBatteryStrength(): number;
|
|
22
|
+
/**
|
|
23
|
+
* This methods handles RAFT events coming from the RICConnector of the wrapper
|
|
24
|
+
*/
|
|
25
|
+
handleRaftEvent(eventType: string, eventEnum: RaftConnEvent | RaftUpdateEvent | RaftPublishEvent | RaftInfoEvents, eventName: string, eventData: any): void;
|
|
26
|
+
/**
|
|
27
|
+
* Pub Event Handler
|
|
28
|
+
*/
|
|
29
|
+
pubEventHandler(eventEnum: RaftPublishEvent, eventName: string, data: any): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Highlights the COG by flashing the LED and playing a tune
|
|
32
|
+
*/
|
|
33
|
+
highlight(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Raft Info Event Handler
|
|
36
|
+
*/
|
|
37
|
+
raftInfoEventHandler(eventEnum: RaftInfoEvents, eventName: string, data: any): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
export default Cog;
|