covenant-bridge 0.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/dist/backend.d.ts +8 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +19 -0
- package/dist/backend.js.map +1 -0
- package/dist/bridge.edenite +0 -0
- package/dist/services/gcode.d.ts +11 -0
- package/dist/services/gcode.d.ts.map +1 -0
- package/dist/services/gcode.js +55 -0
- package/dist/services/gcode.js.map +1 -0
- package/dist/services/hal.d.ts +12 -0
- package/dist/services/hal.d.ts.map +1 -0
- package/dist/services/hal.js +342 -0
- package/dist/services/hal.js.map +1 -0
- package/dist/services/linuxcnc.d.ts +11 -0
- package/dist/services/linuxcnc.d.ts.map +1 -0
- package/dist/services/linuxcnc.js +246 -0
- package/dist/services/linuxcnc.js.map +1 -0
- package/dist/services/position-logger.d.ts +11 -0
- package/dist/services/position-logger.d.ts.map +1 -0
- package/dist/services/position-logger.js +148 -0
- package/dist/services/position-logger.js.map +1 -0
- package/manifest.json +28 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/backend.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Covenant Bridge Backend
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for the LinuxCNC-Eden bridge.
|
|
5
|
+
* Initializes and exposes all AppBus services.
|
|
6
|
+
*/
|
|
7
|
+
import { initLinuxCNCService } from "./services/linuxcnc.js";
|
|
8
|
+
import { initGCodeService } from "./services/gcode.js";
|
|
9
|
+
import { initHalService } from "./services/hal.js";
|
|
10
|
+
import { initPositionLoggerService } from "./services/position-logger.js";
|
|
11
|
+
const appId = process.env.EDEN_APP_ID;
|
|
12
|
+
console.log(`[Covenant Bridge] Starting for ${appId}`);
|
|
13
|
+
// Initialize all services
|
|
14
|
+
initLinuxCNCService();
|
|
15
|
+
initGCodeService();
|
|
16
|
+
initHalService();
|
|
17
|
+
initPositionLoggerService();
|
|
18
|
+
console.log("[Covenant Bridge] All services initialized");
|
|
19
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;AAEvD,0BAA0B;AAC1B,mBAAmB,EAAE,CAAC;AACtB,gBAAgB,EAAE,CAAC;AACnB,cAAc,EAAE,CAAC;AACjB,yBAAyB,EAAE,CAAC;AAE5B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC"}
|
|
Binary file
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* G-Code Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes G-code parsing via AppBus using LinuxCNC's rs274ngc interpreter.
|
|
5
|
+
* Implements GCodeProtocol from covenant-protocol.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Initialize the G-code service
|
|
9
|
+
*/
|
|
10
|
+
export declare function initGCodeService(): void;
|
|
11
|
+
//# sourceMappingURL=gcode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcode.d.ts","sourceRoot":"","sources":["../../src/services/gcode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAqDvC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* G-Code Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes G-code parsing via AppBus using LinuxCNC's rs274ngc interpreter.
|
|
5
|
+
* Implements GCodeProtocol from covenant-protocol.
|
|
6
|
+
*/
|
|
7
|
+
import { parseGCode } from "@linuxcnc-node/gcode";
|
|
8
|
+
const SERVICE_NAME = "gcode";
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the G-code service
|
|
11
|
+
*/
|
|
12
|
+
export function initGCodeService() {
|
|
13
|
+
worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
|
|
14
|
+
console.log(`[GCode] Client connected: ${clientAppId}`);
|
|
15
|
+
const typedConn = connection;
|
|
16
|
+
// Handle disconnect
|
|
17
|
+
connection.onClose(() => {
|
|
18
|
+
console.log(`[GCode] Client disconnected: ${clientAppId}`);
|
|
19
|
+
});
|
|
20
|
+
// Parse handler
|
|
21
|
+
typedConn.handle("parse", async ({ filepath, iniPath, progressUpdates }) => {
|
|
22
|
+
try {
|
|
23
|
+
const result = await parseGCode(filepath, {
|
|
24
|
+
iniPath,
|
|
25
|
+
progressUpdates: progressUpdates ?? 40,
|
|
26
|
+
onProgress: (progress) => {
|
|
27
|
+
// Stream progress updates to the client
|
|
28
|
+
try {
|
|
29
|
+
typedConn.send("parse-progress", progress);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
// Client may have disconnected
|
|
33
|
+
console.error("[GCode] Error sending progress:", err);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
// Send error message
|
|
41
|
+
typedConn.send("error", {
|
|
42
|
+
code: "PARSE_ERROR",
|
|
43
|
+
message: err instanceof Error ? err.message : String(err),
|
|
44
|
+
});
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// Ping handler
|
|
49
|
+
typedConn.handle("ping", () => {
|
|
50
|
+
return { timestamp: Date.now() };
|
|
51
|
+
});
|
|
52
|
+
}, { description: "G-code file parsing using LinuxCNC interpreter" });
|
|
53
|
+
console.log(`[GCode] Service exposed as '${SERVICE_NAME}'`);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=gcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcode.js","sourceRoot":"","sources":["../../src/services/gcode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,YAAY,GAAG,OAAO,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAO,CAAC,MAAM,CAAC,aAAa,CAC1B,YAAY,EACZ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,UAA2C,CAAC;QAE9D,oBAAoB;QACpB,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,gCAAgC,WAAW,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,SAAS,CAAC,MAAM,CACd,OAAO,EACP,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE;oBACxC,OAAO;oBACP,eAAe,EAAE,eAAe,IAAI,EAAE;oBACtC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACvB,wCAAwC;wBACxC,IAAI,CAAC;4BACH,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;wBAC7C,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,+BAA+B;4BAC/B,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC;iBACF,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAqB;gBACrB,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE;oBACtB,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBAC1D,CAAC,CAAC;gBACH,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,eAAe;QACf,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE;YAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAClE,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,+BAA+B,YAAY,GAAG,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HAL Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes HAL component management and I/O access via AppBus.
|
|
5
|
+
* Each connection gets its own HalComponent lifecycle.
|
|
6
|
+
* Implements HalProtocol from covenant-protocol.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the HAL service
|
|
10
|
+
*/
|
|
11
|
+
export declare function initHalService(): void;
|
|
12
|
+
//# sourceMappingURL=hal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hal.d.ts","sourceRoot":"","sources":["../../src/services/hal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAoXrC"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HAL Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes HAL component management and I/O access via AppBus.
|
|
5
|
+
* Each connection gets its own HalComponent lifecycle.
|
|
6
|
+
* Implements HalProtocol from covenant-protocol.
|
|
7
|
+
*/
|
|
8
|
+
import { HalComponent, getMsgLevel, setMsgLevel, getValue, getInfoPins, getInfoSignals, getInfoParams, newSignal, pinHasWriter, setSignalValue, } from "@linuxcnc-node/hal";
|
|
9
|
+
import picomatch from "picomatch";
|
|
10
|
+
const SERVICE_NAME = "hal";
|
|
11
|
+
/**
|
|
12
|
+
* Initialize the HAL service
|
|
13
|
+
*/
|
|
14
|
+
export function initHalService() {
|
|
15
|
+
worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
|
|
16
|
+
console.log(`[HAL] Client connected: ${clientAppId}`);
|
|
17
|
+
const typedConn = connection;
|
|
18
|
+
// Per-connection state
|
|
19
|
+
const state = {
|
|
20
|
+
component: null,
|
|
21
|
+
pins: new Map(),
|
|
22
|
+
params: new Map(),
|
|
23
|
+
lastValues: new Map(),
|
|
24
|
+
cursor: 0,
|
|
25
|
+
pollInterval: null,
|
|
26
|
+
};
|
|
27
|
+
// Clean up on disconnect
|
|
28
|
+
connection.onClose(() => {
|
|
29
|
+
console.log(`[HAL] Client disconnected: ${clientAppId}`);
|
|
30
|
+
if (state.pollInterval) {
|
|
31
|
+
clearInterval(state.pollInterval);
|
|
32
|
+
}
|
|
33
|
+
if (state.component) {
|
|
34
|
+
state.component.dispose();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
// Start polling for value changes
|
|
38
|
+
function startPolling() {
|
|
39
|
+
if (state.pollInterval)
|
|
40
|
+
return;
|
|
41
|
+
state.pollInterval = setInterval(() => {
|
|
42
|
+
if (!state.component)
|
|
43
|
+
return;
|
|
44
|
+
const changes = [];
|
|
45
|
+
// Check all pins and params for changes
|
|
46
|
+
for (const [name, pin] of state.pins) {
|
|
47
|
+
const value = pin.getValue();
|
|
48
|
+
const lastValue = state.lastValues.get(name);
|
|
49
|
+
if (value !== lastValue) {
|
|
50
|
+
changes.push({ name, value });
|
|
51
|
+
state.lastValues.set(name, value);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
for (const [name, param] of state.params) {
|
|
55
|
+
const value = param.getValue();
|
|
56
|
+
const lastValue = state.lastValues.get(name);
|
|
57
|
+
if (value !== lastValue) {
|
|
58
|
+
changes.push({ name, value });
|
|
59
|
+
state.lastValues.set(name, value);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (changes.length > 0) {
|
|
63
|
+
state.cursor++;
|
|
64
|
+
const delta = {
|
|
65
|
+
changes,
|
|
66
|
+
cursor: state.cursor,
|
|
67
|
+
timestamp: Date.now(),
|
|
68
|
+
};
|
|
69
|
+
try {
|
|
70
|
+
typedConn.send("items-delta", delta);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
console.error("[HAL] Error sending delta:", err);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}, 10); // 10ms polling interval
|
|
77
|
+
}
|
|
78
|
+
// === COMPONENT HANDLERS ===
|
|
79
|
+
typedConn.handle("component/init", ({ name, prefix }) => {
|
|
80
|
+
if (state.component) {
|
|
81
|
+
return {
|
|
82
|
+
success: false,
|
|
83
|
+
componentName: "",
|
|
84
|
+
error: "Component already initialized for this connection",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
state.component = new HalComponent(name, prefix);
|
|
89
|
+
return {
|
|
90
|
+
success: true,
|
|
91
|
+
componentName: state.component.name,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
componentName: "",
|
|
98
|
+
error: err instanceof Error ? err.message : String(err),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
typedConn.handle("component/ready", () => {
|
|
103
|
+
if (!state.component) {
|
|
104
|
+
return { success: false, error: "Component not initialized" };
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
state.component.ready();
|
|
108
|
+
startPolling();
|
|
109
|
+
typedConn.send("hal-ready", {
|
|
110
|
+
componentName: state.component.name,
|
|
111
|
+
prefix: state.component.prefix,
|
|
112
|
+
});
|
|
113
|
+
return { success: true };
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
return {
|
|
117
|
+
success: false,
|
|
118
|
+
error: err instanceof Error ? err.message : String(err),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
typedConn.handle("component/unready", () => {
|
|
123
|
+
if (!state.component) {
|
|
124
|
+
return { success: false, error: "Component not initialized" };
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
state.component.unready();
|
|
128
|
+
return { success: true };
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
error: err instanceof Error ? err.message : String(err),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// === PIN/PARAM HANDLERS ===
|
|
138
|
+
typedConn.handle("pin/create", ({ name, type, direction }) => {
|
|
139
|
+
if (!state.component) {
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
fullName: "",
|
|
143
|
+
error: "Component not initialized",
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const pin = state.component.newPin(name, type, direction);
|
|
148
|
+
state.pins.set(name, pin);
|
|
149
|
+
state.lastValues.set(name, pin.getValue());
|
|
150
|
+
return {
|
|
151
|
+
success: true,
|
|
152
|
+
fullName: `${state.component.prefix}.${pin.name}`,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return {
|
|
157
|
+
success: false,
|
|
158
|
+
fullName: "",
|
|
159
|
+
error: err instanceof Error ? err.message : String(err),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
typedConn.handle("param/create", ({ name, type, direction }) => {
|
|
164
|
+
if (!state.component) {
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
fullName: "",
|
|
168
|
+
error: "Component not initialized",
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const param = state.component.newParam(name, type, direction);
|
|
173
|
+
state.params.set(name, param);
|
|
174
|
+
state.lastValues.set(name, param.getValue());
|
|
175
|
+
return {
|
|
176
|
+
success: true,
|
|
177
|
+
fullName: `${state.component.prefix}.${param.name}`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
return {
|
|
182
|
+
success: false,
|
|
183
|
+
fullName: "",
|
|
184
|
+
error: err instanceof Error ? err.message : String(err),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
typedConn.handle("item/get-value", ({ name }) => {
|
|
189
|
+
if (!state.component) {
|
|
190
|
+
throw new Error("Component not initialized");
|
|
191
|
+
}
|
|
192
|
+
const value = state.component.getValue(name);
|
|
193
|
+
return { value };
|
|
194
|
+
});
|
|
195
|
+
typedConn.handle("item/set-value", ({ name, value }) => {
|
|
196
|
+
if (!state.component) {
|
|
197
|
+
return { success: false, error: "Component not initialized" };
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
state.component.setValue(name, value);
|
|
201
|
+
state.lastValues.set(name, value);
|
|
202
|
+
return { success: true };
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
return {
|
|
206
|
+
success: false,
|
|
207
|
+
error: err instanceof Error ? err.message : String(err),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
typedConn.handle("items/sync", () => {
|
|
212
|
+
if (!state.component) {
|
|
213
|
+
throw new Error("Component not initialized");
|
|
214
|
+
}
|
|
215
|
+
// Build current items snapshot
|
|
216
|
+
const items = {};
|
|
217
|
+
for (const [name, pin] of state.pins) {
|
|
218
|
+
items[name] = pin.getValue();
|
|
219
|
+
}
|
|
220
|
+
for (const [name, param] of state.params) {
|
|
221
|
+
items[name] = param.getValue();
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
items,
|
|
225
|
+
cursor: state.cursor,
|
|
226
|
+
};
|
|
227
|
+
});
|
|
228
|
+
// === GLOBAL HANDLERS ===
|
|
229
|
+
typedConn.handle("global/component-exists", ({ componentName }) => {
|
|
230
|
+
return { exists: HalComponent.exists(componentName) };
|
|
231
|
+
});
|
|
232
|
+
typedConn.handle("global/component-is-ready", ({ componentName }) => {
|
|
233
|
+
return { ready: HalComponent.isReady(componentName) };
|
|
234
|
+
});
|
|
235
|
+
typedConn.handle("global/signal-create", ({ name, type }) => {
|
|
236
|
+
try {
|
|
237
|
+
newSignal(name, type);
|
|
238
|
+
return { success: true };
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
return {
|
|
242
|
+
success: false,
|
|
243
|
+
error: err instanceof Error ? err.message : String(err),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
typedConn.handle("global/signal-get-value", ({ signalName }) => {
|
|
248
|
+
const value = getValue(signalName);
|
|
249
|
+
return { value };
|
|
250
|
+
});
|
|
251
|
+
typedConn.handle("global/signal-set-value", ({ signalName, value }) => {
|
|
252
|
+
try {
|
|
253
|
+
setSignalValue(signalName, value);
|
|
254
|
+
return { success: true };
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
return {
|
|
258
|
+
success: false,
|
|
259
|
+
error: err instanceof Error ? err.message : String(err),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
typedConn.handle("global/signal-connect", ({ pinName, signalName }) => {
|
|
264
|
+
// This would need net/connect functionality from hal
|
|
265
|
+
// For now, return not implemented
|
|
266
|
+
return { success: false, error: "Not implemented - use halcmd net" };
|
|
267
|
+
});
|
|
268
|
+
typedConn.handle("global/signal-disconnect", ({ pinName }) => {
|
|
269
|
+
// This would need disconnect functionality from hal
|
|
270
|
+
return {
|
|
271
|
+
success: false,
|
|
272
|
+
error: "Not implemented - use halcmd unlinkp",
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
typedConn.handle("global/pin-has-writer", ({ pinName }) => {
|
|
276
|
+
return { hasWriter: pinHasWriter(pinName) };
|
|
277
|
+
});
|
|
278
|
+
typedConn.handle("global/get-value", ({ name }) => {
|
|
279
|
+
const value = getValue(name);
|
|
280
|
+
// Determine type based on whether it's a pin, param, or signal
|
|
281
|
+
// For simplicity, return "pin" - could be enhanced with proper detection
|
|
282
|
+
return { value, type: "pin" };
|
|
283
|
+
});
|
|
284
|
+
typedConn.handle("global/list-pins", ({ filter }) => {
|
|
285
|
+
let pins = getInfoPins();
|
|
286
|
+
if (filter) {
|
|
287
|
+
const isMatch = picomatch(filter);
|
|
288
|
+
pins = pins.filter((p) => isMatch(p.name));
|
|
289
|
+
}
|
|
290
|
+
return { pins };
|
|
291
|
+
});
|
|
292
|
+
typedConn.handle("global/list-params", ({ filter }) => {
|
|
293
|
+
let params = getInfoParams();
|
|
294
|
+
if (filter) {
|
|
295
|
+
const isMatch = picomatch(filter);
|
|
296
|
+
params = params.filter((p) => isMatch(p.name));
|
|
297
|
+
}
|
|
298
|
+
return { params };
|
|
299
|
+
});
|
|
300
|
+
typedConn.handle("global/list-signals", ({ filter }) => {
|
|
301
|
+
let signals = getInfoSignals();
|
|
302
|
+
if (filter) {
|
|
303
|
+
const isMatch = picomatch(filter);
|
|
304
|
+
signals = signals.filter((s) => isMatch(s.name));
|
|
305
|
+
}
|
|
306
|
+
return { signals };
|
|
307
|
+
});
|
|
308
|
+
typedConn.handle("global/list-all", () => {
|
|
309
|
+
return {
|
|
310
|
+
pins: getInfoPins(),
|
|
311
|
+
params: getInfoParams(),
|
|
312
|
+
signals: getInfoSignals(),
|
|
313
|
+
};
|
|
314
|
+
});
|
|
315
|
+
typedConn.handle("global/msg-level-get", () => {
|
|
316
|
+
return { level: getMsgLevel() };
|
|
317
|
+
});
|
|
318
|
+
typedConn.handle("global/msg-level-set", ({ level }) => {
|
|
319
|
+
const previousLevel = getMsgLevel();
|
|
320
|
+
setMsgLevel(level);
|
|
321
|
+
return { success: true, previousLevel };
|
|
322
|
+
});
|
|
323
|
+
// === CONNECTION HANDLERS ===
|
|
324
|
+
typedConn.handle("ping", () => {
|
|
325
|
+
return { timestamp: Date.now() };
|
|
326
|
+
});
|
|
327
|
+
typedConn.handle("get-status", () => {
|
|
328
|
+
return {
|
|
329
|
+
connected: true,
|
|
330
|
+
componentName: state.component?.name ?? "",
|
|
331
|
+
componentReady: state.component
|
|
332
|
+
? HalComponent.isReady(state.component.name)
|
|
333
|
+
: false,
|
|
334
|
+
pinCount: state.pins.size,
|
|
335
|
+
paramCount: state.params.size,
|
|
336
|
+
uptime: process.uptime(),
|
|
337
|
+
};
|
|
338
|
+
});
|
|
339
|
+
}, { description: "HAL component management and I/O access" });
|
|
340
|
+
console.log(`[HAL] Service exposed as '${SERVICE_NAME}'`);
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=hal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hal.js","sourceRoot":"","sources":["../../src/services/hal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LinuxCNC Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes LinuxCNC status monitoring and command execution via AppBus.
|
|
5
|
+
* Implements LinuxCNCProtocol from covenant-protocol.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Initialize the LinuxCNC service
|
|
9
|
+
*/
|
|
10
|
+
export declare function initLinuxCNCService(): void;
|
|
11
|
+
//# sourceMappingURL=linuxcnc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linuxcnc.d.ts","sourceRoot":"","sources":["../../src/services/linuxcnc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsCH;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAiS1C"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LinuxCNC Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes LinuxCNC status monitoring and command execution via AppBus.
|
|
5
|
+
* Implements LinuxCNCProtocol from covenant-protocol.
|
|
6
|
+
*/
|
|
7
|
+
import { StatChannel, CommandChannel, ErrorChannel } from "@linuxcnc-node/core";
|
|
8
|
+
import delve from "dlv";
|
|
9
|
+
const SERVICE_NAME = "linuxcnc";
|
|
10
|
+
// Shared state across all connections
|
|
11
|
+
let statChannel = null;
|
|
12
|
+
let commandChannel = null;
|
|
13
|
+
let errorChannel = null;
|
|
14
|
+
// Connected clients
|
|
15
|
+
const connections = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* Broadcast stat delta to all connected clients
|
|
18
|
+
*/
|
|
19
|
+
function broadcastDelta(changes) {
|
|
20
|
+
if (changes.length === 0 || !statChannel)
|
|
21
|
+
return;
|
|
22
|
+
const message = {
|
|
23
|
+
changes,
|
|
24
|
+
cursor: statChannel.getCursor(),
|
|
25
|
+
timestamp: Date.now(),
|
|
26
|
+
};
|
|
27
|
+
for (const conn of connections.values()) {
|
|
28
|
+
try {
|
|
29
|
+
conn.send("stat-delta", message);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.error("[LinuxCNC] Error sending delta:", err);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize the LinuxCNC service
|
|
38
|
+
*/
|
|
39
|
+
export function initLinuxCNCService() {
|
|
40
|
+
// Create channels (shared across all connections)
|
|
41
|
+
statChannel = new StatChannel({ pollInterval: 50 });
|
|
42
|
+
commandChannel = new CommandChannel();
|
|
43
|
+
errorChannel = new ErrorChannel({ pollInterval: 100 });
|
|
44
|
+
// Listen to native delta updates from StatChannel
|
|
45
|
+
statChannel.on("delta", broadcastDelta);
|
|
46
|
+
// Forward error channel events
|
|
47
|
+
errorChannel.on("message", (error) => {
|
|
48
|
+
for (const conn of connections.values()) {
|
|
49
|
+
try {
|
|
50
|
+
conn.send("error-channel-event", error);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
console.error("[LinuxCNC] Error forwarding error event:", err);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Expose the service
|
|
58
|
+
worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
|
|
59
|
+
console.log(`[LinuxCNC] Client connected: ${clientAppId}`);
|
|
60
|
+
const typedConn = connection;
|
|
61
|
+
connections.set(clientAppId, typedConn);
|
|
62
|
+
// Handle disconnect
|
|
63
|
+
connection.onClose(() => {
|
|
64
|
+
console.log(`[LinuxCNC] Client disconnected: ${clientAppId}`);
|
|
65
|
+
connections.delete(clientAppId);
|
|
66
|
+
});
|
|
67
|
+
// === STAT HANDLERS ===
|
|
68
|
+
typedConn.handle("stat/sync", () => {
|
|
69
|
+
const stat = statChannel.get();
|
|
70
|
+
if (!stat) {
|
|
71
|
+
throw new Error("StatChannel not ready");
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
stat,
|
|
75
|
+
cursor: statChannel.getCursor(),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
typedConn.handle("stat/get-value", ({ path }) => {
|
|
79
|
+
const stat = statChannel.get();
|
|
80
|
+
if (!stat) {
|
|
81
|
+
throw new Error("StatChannel not ready");
|
|
82
|
+
}
|
|
83
|
+
return { value: delve(stat, path) };
|
|
84
|
+
});
|
|
85
|
+
// === COMMAND HANDLERS ===
|
|
86
|
+
typedConn.handle("cmd/set-task-mode", async ({ mode }) => {
|
|
87
|
+
return commandChannel.setTaskMode(mode);
|
|
88
|
+
});
|
|
89
|
+
typedConn.handle("cmd/set-state", async ({ state }) => {
|
|
90
|
+
return commandChannel.setState(state);
|
|
91
|
+
});
|
|
92
|
+
typedConn.handle("cmd/mdi", async ({ command }) => {
|
|
93
|
+
return commandChannel.mdi(command);
|
|
94
|
+
});
|
|
95
|
+
typedConn.handle("cmd/abort", async () => {
|
|
96
|
+
return commandChannel.abortTask();
|
|
97
|
+
});
|
|
98
|
+
typedConn.handle("cmd/task-plan-synch", async () => {
|
|
99
|
+
return commandChannel.taskPlanSynch();
|
|
100
|
+
});
|
|
101
|
+
typedConn.handle("cmd/reset-interpreter", async () => {
|
|
102
|
+
return commandChannel.resetInterpreter();
|
|
103
|
+
});
|
|
104
|
+
// Program control
|
|
105
|
+
typedConn.handle("cmd/program-open", async ({ filePath }) => {
|
|
106
|
+
return commandChannel.programOpen(filePath);
|
|
107
|
+
});
|
|
108
|
+
typedConn.handle("cmd/program-run", async ({ startLine }) => {
|
|
109
|
+
return commandChannel.runProgram(startLine ?? 0);
|
|
110
|
+
});
|
|
111
|
+
typedConn.handle("cmd/program-pause", async () => {
|
|
112
|
+
return commandChannel.pauseProgram();
|
|
113
|
+
});
|
|
114
|
+
typedConn.handle("cmd/program-resume", async () => {
|
|
115
|
+
return commandChannel.resumeProgram();
|
|
116
|
+
});
|
|
117
|
+
typedConn.handle("cmd/program-step", async () => {
|
|
118
|
+
return commandChannel.stepProgram();
|
|
119
|
+
});
|
|
120
|
+
typedConn.handle("cmd/program-reverse", async () => {
|
|
121
|
+
return commandChannel.reverseProgram();
|
|
122
|
+
});
|
|
123
|
+
typedConn.handle("cmd/program-forward", async () => {
|
|
124
|
+
return commandChannel.forwardProgram();
|
|
125
|
+
});
|
|
126
|
+
// Motion control
|
|
127
|
+
typedConn.handle("cmd/set-feed-rate", async ({ scale }) => {
|
|
128
|
+
return commandChannel.setFeedRate(scale);
|
|
129
|
+
});
|
|
130
|
+
typedConn.handle("cmd/set-rapid-rate", async ({ scale }) => {
|
|
131
|
+
return commandChannel.setRapidRate(scale);
|
|
132
|
+
});
|
|
133
|
+
typedConn.handle("cmd/set-max-velocity", async ({ velocity }) => {
|
|
134
|
+
return commandChannel.setMaxVelocity(velocity);
|
|
135
|
+
});
|
|
136
|
+
typedConn.handle("cmd/set-traj-mode", async ({ mode }) => {
|
|
137
|
+
return commandChannel.setTrajMode(mode);
|
|
138
|
+
});
|
|
139
|
+
typedConn.handle("cmd/teleop-enable", async ({ enable }) => {
|
|
140
|
+
return commandChannel.teleopEnable(enable);
|
|
141
|
+
});
|
|
142
|
+
typedConn.handle("cmd/set-feed-override-enable", async ({ enable }) => {
|
|
143
|
+
return commandChannel.setFeedOverrideEnable(enable);
|
|
144
|
+
});
|
|
145
|
+
typedConn.handle("cmd/set-feed-hold-enable", async ({ enable }) => {
|
|
146
|
+
return commandChannel.setFeedHoldEnable(enable);
|
|
147
|
+
});
|
|
148
|
+
typedConn.handle("cmd/set-adaptive-feed-enable", async ({ enable }) => {
|
|
149
|
+
return commandChannel.setAdaptiveFeedEnable(enable);
|
|
150
|
+
});
|
|
151
|
+
// Jogging - note: CommandChannel uses (axis, isJoint, speed) order
|
|
152
|
+
typedConn.handle("cmd/jog-continuous", async ({ axis, speed, isJoint }) => {
|
|
153
|
+
return commandChannel.jogContinuous(axis, isJoint ?? false, speed);
|
|
154
|
+
});
|
|
155
|
+
typedConn.handle("cmd/jog-increment", async ({ axis, speed, increment, isJoint }) => {
|
|
156
|
+
return commandChannel.jogIncrement(axis, isJoint ?? false, speed, increment);
|
|
157
|
+
});
|
|
158
|
+
typedConn.handle("cmd/jog-stop", async ({ axis, isJoint }) => {
|
|
159
|
+
return commandChannel.jogStop(axis, isJoint ?? false);
|
|
160
|
+
});
|
|
161
|
+
// Homing
|
|
162
|
+
typedConn.handle("cmd/home", async ({ joint }) => {
|
|
163
|
+
return commandChannel.homeJoint(joint);
|
|
164
|
+
});
|
|
165
|
+
typedConn.handle("cmd/unhome", async ({ joint }) => {
|
|
166
|
+
return commandChannel.unhomeJoint(joint);
|
|
167
|
+
});
|
|
168
|
+
typedConn.handle("cmd/set-min-position-limit", async ({ joint, limit }) => {
|
|
169
|
+
return commandChannel.setMinPositionLimit(joint, limit);
|
|
170
|
+
});
|
|
171
|
+
typedConn.handle("cmd/set-max-position-limit", async ({ joint, limit }) => {
|
|
172
|
+
return commandChannel.setMaxPositionLimit(joint, limit);
|
|
173
|
+
});
|
|
174
|
+
// Spindle
|
|
175
|
+
typedConn.handle("cmd/spindle-on", async ({ speed, spindle, wait }) => {
|
|
176
|
+
return commandChannel.spindleOn(speed, spindle ?? 0, wait ?? false);
|
|
177
|
+
});
|
|
178
|
+
typedConn.handle("cmd/spindle-off", async ({ spindle }) => {
|
|
179
|
+
return commandChannel.spindleOff(spindle ?? 0);
|
|
180
|
+
});
|
|
181
|
+
typedConn.handle("cmd/spindle-override", async ({ scale, spindle }) => {
|
|
182
|
+
return commandChannel.setSpindleOverride(scale, spindle ?? 0);
|
|
183
|
+
});
|
|
184
|
+
typedConn.handle("cmd/spindle-brake", async ({ engage, spindle }) => {
|
|
185
|
+
return commandChannel.spindleBrake(engage, spindle ?? 0);
|
|
186
|
+
});
|
|
187
|
+
typedConn.handle("cmd/spindle-increase", async ({ spindle }) => {
|
|
188
|
+
return commandChannel.spindleIncrease(spindle ?? 0);
|
|
189
|
+
});
|
|
190
|
+
typedConn.handle("cmd/spindle-decrease", async ({ spindle }) => {
|
|
191
|
+
return commandChannel.spindleDecrease(spindle ?? 0);
|
|
192
|
+
});
|
|
193
|
+
typedConn.handle("cmd/set-spindle-override-enable", async ({ enable, spindle }) => {
|
|
194
|
+
return commandChannel.setSpindleOverrideEnable(enable, spindle ?? 0);
|
|
195
|
+
});
|
|
196
|
+
// Coolant
|
|
197
|
+
typedConn.handle("cmd/set-mist", async ({ on }) => {
|
|
198
|
+
return commandChannel.setMist(on);
|
|
199
|
+
});
|
|
200
|
+
typedConn.handle("cmd/set-flood", async ({ on }) => {
|
|
201
|
+
return commandChannel.setFlood(on);
|
|
202
|
+
});
|
|
203
|
+
// Tool
|
|
204
|
+
typedConn.handle("cmd/load-tool-table", async () => {
|
|
205
|
+
return commandChannel.loadToolTable();
|
|
206
|
+
});
|
|
207
|
+
typedConn.handle("cmd/set-tool", async ({ tool }) => {
|
|
208
|
+
return commandChannel.setTool(tool);
|
|
209
|
+
});
|
|
210
|
+
// I/O
|
|
211
|
+
typedConn.handle("cmd/set-digital-output", async ({ index, value }) => {
|
|
212
|
+
return commandChannel.setDigitalOutput(index, value);
|
|
213
|
+
});
|
|
214
|
+
typedConn.handle("cmd/set-analog-output", async ({ index, value }) => {
|
|
215
|
+
return commandChannel.setAnalogOutput(index, value);
|
|
216
|
+
});
|
|
217
|
+
// Misc
|
|
218
|
+
typedConn.handle("cmd/override-limits", async () => {
|
|
219
|
+
return commandChannel.overrideLimits();
|
|
220
|
+
});
|
|
221
|
+
typedConn.handle("cmd/set-optional-stop", async ({ enable }) => {
|
|
222
|
+
return commandChannel.setOptionalStop(enable);
|
|
223
|
+
});
|
|
224
|
+
typedConn.handle("cmd/set-block-delete", async ({ enable }) => {
|
|
225
|
+
return commandChannel.setBlockDelete(enable);
|
|
226
|
+
});
|
|
227
|
+
typedConn.handle("cmd/set-debug-level", async ({ level }) => {
|
|
228
|
+
return commandChannel.setDebugLevel(level);
|
|
229
|
+
});
|
|
230
|
+
typedConn.handle("cmd/send-operator-error", async ({ message }) => {
|
|
231
|
+
return commandChannel.sendOperatorError(message);
|
|
232
|
+
});
|
|
233
|
+
typedConn.handle("cmd/send-operator-text", async ({ message }) => {
|
|
234
|
+
return commandChannel.sendOperatorText(message);
|
|
235
|
+
});
|
|
236
|
+
typedConn.handle("cmd/send-operator-display", async ({ message }) => {
|
|
237
|
+
return commandChannel.sendOperatorDisplay(message);
|
|
238
|
+
});
|
|
239
|
+
// Connection
|
|
240
|
+
typedConn.handle("ping", () => {
|
|
241
|
+
return { timestamp: Date.now() };
|
|
242
|
+
});
|
|
243
|
+
}, { description: "LinuxCNC status monitoring and command execution" });
|
|
244
|
+
console.log(`[LinuxCNC] Service exposed as '${SERVICE_NAME}'`);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=linuxcnc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linuxcnc.js","sourceRoot":"","sources":["../../src/services/linuxcnc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIhF,OAAO,KAAK,MAAM,KAAK,CAAC;AACxB,MAAM,YAAY,GAAG,UAAU,CAAC;AAEhC,sCAAsC;AACtC,IAAI,WAAW,GAAuB,IAAI,CAAC;AAC3C,IAAI,cAAc,GAA0B,IAAI,CAAC;AACjD,IAAI,YAAY,GAAwB,IAAI,CAAC;AAE7C,oBAAoB;AACpB,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4C,CAAC;AAExE;;GAEG;AACH,SAAS,cAAc,CAAC,OAAqB;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO;IAEjD,MAAM,OAAO,GAAG;QACd,OAAO;QACP,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;QAC/B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,kDAAkD;IAClD,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAEvD,kDAAkD;IAClD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAExC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAO,CAAC,MAAM,CAAC,aAAa,CAC1B,YAAY,EACZ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,gCAAgC,WAAW,EAAE,CAAC,CAAC;QAE3D,MAAM,SAAS,GAAG,UAA8C,CAAC;QACjE,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAExC,oBAAoB;QACpB,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAC;YAC9D,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,wBAAwB;QAExB,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,WAAY,CAAC,GAAG,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,WAAY,CAAC,SAAS,EAAE;aACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAC9C,MAAM,IAAI,GAAG,WAAY,CAAC,GAAG,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAE3B,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YACvD,OAAO,cAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACpD,OAAO,cAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAChD,OAAO,cAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACvC,OAAO,cAAe,CAAC,SAAS,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACjD,OAAO,cAAe,CAAC,aAAa,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACnD,OAAO,cAAe,CAAC,gBAAgB,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC1D,OAAO,cAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;YAC1D,OAAO,cAAe,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YAC/C,OAAO,cAAe,CAAC,YAAY,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAChD,OAAO,cAAe,CAAC,aAAa,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAC9C,OAAO,cAAe,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACjD,OAAO,cAAe,CAAC,cAAc,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACjD,OAAO,cAAe,CAAC,cAAc,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACxD,OAAO,cAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACzD,OAAO,cAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC9D,OAAO,cAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YACvD,OAAO,cAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACzD,OAAO,cAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,8BAA8B,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACpE,OAAO,cAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,0BAA0B,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAChE,OAAO,cAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,8BAA8B,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACpE,OAAO,cAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,mEAAmE;QACnE,SAAS,CAAC,MAAM,CACd,oBAAoB,EACpB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;YACjC,OAAO,cAAe,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC,CACF,CAAC;QAEF,SAAS,CAAC,MAAM,CACd,mBAAmB,EACnB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;YAC5C,OAAO,cAAe,CAAC,YAAY,CACjC,IAAI,EACJ,OAAO,IAAI,KAAK,EAChB,KAAK,EACL,SAAS,CACV,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YAC3D,OAAO,cAAe,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,SAAS;QACT,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC/C,OAAO,cAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACjD,OAAO,cAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CACd,4BAA4B,EAC5B,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,OAAO,cAAe,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,SAAS,CAAC,MAAM,CACd,4BAA4B,EAC5B,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,OAAO,cAAe,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,UAAU;QACV,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YACpE,OAAO,cAAe,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACxD,OAAO,cAAe,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;YACpE,OAAO,cAAe,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YAClE,OAAO,cAAe,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7D,OAAO,cAAe,CAAC,eAAe,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7D,OAAO,cAAe,CAAC,eAAe,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CACd,iCAAiC,EACjC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YAC5B,OAAO,cAAe,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC,CACF,CAAC;QAEF,UAAU;QACV,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YAChD,OAAO,cAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YACjD,OAAO,cAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,OAAO;QACP,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACjD,OAAO,cAAe,CAAC,aAAa,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAClD,OAAO,cAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,MAAM;QACN,SAAS,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YACpE,OAAO,cAAe,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YACnE,OAAO,cAAe,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,OAAO;QACP,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACjD,OAAO,cAAe,CAAC,cAAc,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC7D,OAAO,cAAe,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5D,OAAO,cAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC1D,OAAO,cAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,yBAAyB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAChE,OAAO,cAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC/D,OAAO,cAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,2BAA2B,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAClE,OAAO,cAAe,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,aAAa;QACb,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE;YAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,WAAW,EAAE,kDAAkD,EAAE,CACpE,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,kCAAkC,YAAY,GAAG,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Position Logger Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes machine position logging and history streaming via AppBus.
|
|
5
|
+
* Implements PositionLoggerProtocol from covenant-protocol.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Initialize the Position Logger service
|
|
9
|
+
*/
|
|
10
|
+
export declare function initPositionLoggerService(): void;
|
|
11
|
+
//# sourceMappingURL=position-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-logger.d.ts","sourceRoot":"","sources":["../../src/services/position-logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqEH;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CA4GhD"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Position Logger Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes machine position logging and history streaming via AppBus.
|
|
5
|
+
* Implements PositionLoggerProtocol from covenant-protocol.
|
|
6
|
+
*/
|
|
7
|
+
import { PositionLogger } from "@linuxcnc-node/core";
|
|
8
|
+
import { POSITION_STRIDE } from "@linuxcnc-node/types";
|
|
9
|
+
const SERVICE_NAME = "position-logger";
|
|
10
|
+
const UPDATE_INTERVAL_MS = 50;
|
|
11
|
+
// Shared position logger instance
|
|
12
|
+
let logger = null;
|
|
13
|
+
// Cursor tracking
|
|
14
|
+
let cursor = 0;
|
|
15
|
+
let lastHistoryCount = 0;
|
|
16
|
+
// Connected clients
|
|
17
|
+
const connections = new Map();
|
|
18
|
+
// Update interval for pushing position updates
|
|
19
|
+
let updateInterval = null;
|
|
20
|
+
/**
|
|
21
|
+
* Start the update loop for pushing position deltas to clients
|
|
22
|
+
*/
|
|
23
|
+
function startUpdateLoop() {
|
|
24
|
+
if (updateInterval)
|
|
25
|
+
return;
|
|
26
|
+
updateInterval = setInterval(() => {
|
|
27
|
+
if (!logger || connections.size === 0)
|
|
28
|
+
return;
|
|
29
|
+
const currentCount = logger.getHistoryCount();
|
|
30
|
+
if (currentCount <= lastHistoryCount)
|
|
31
|
+
return;
|
|
32
|
+
// Get new points since last update
|
|
33
|
+
const newPointCount = currentCount - lastHistoryCount;
|
|
34
|
+
const newPoints = logger.getMotionHistory(lastHistoryCount, newPointCount);
|
|
35
|
+
cursor++;
|
|
36
|
+
lastHistoryCount = currentCount;
|
|
37
|
+
// Push to all connected clients - cast to any to handle type conflicts
|
|
38
|
+
const message = {
|
|
39
|
+
points: newPoints,
|
|
40
|
+
count: newPointCount,
|
|
41
|
+
cursor,
|
|
42
|
+
};
|
|
43
|
+
for (const conn of connections.values()) {
|
|
44
|
+
try {
|
|
45
|
+
conn.send("position-update", message);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error("[PositionLogger] Error sending update:", err);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}, UPDATE_INTERVAL_MS);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Stop the update loop
|
|
55
|
+
*/
|
|
56
|
+
function stopUpdateLoop() {
|
|
57
|
+
if (updateInterval) {
|
|
58
|
+
clearInterval(updateInterval);
|
|
59
|
+
updateInterval = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Initialize the Position Logger service
|
|
64
|
+
*/
|
|
65
|
+
export function initPositionLoggerService() {
|
|
66
|
+
// Create shared logger instance
|
|
67
|
+
logger = new PositionLogger();
|
|
68
|
+
worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
|
|
69
|
+
console.log(`[PositionLogger] Client connected: ${clientAppId}`);
|
|
70
|
+
const typedConn = connection;
|
|
71
|
+
connections.set(clientAppId, typedConn);
|
|
72
|
+
// Handle disconnect
|
|
73
|
+
connection.onClose(() => {
|
|
74
|
+
console.log(`[PositionLogger] Client disconnected: ${clientAppId}`);
|
|
75
|
+
connections.delete(clientAppId);
|
|
76
|
+
// Stop update loop if no clients
|
|
77
|
+
if (connections.size === 0) {
|
|
78
|
+
stopUpdateLoop();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
// Start handler
|
|
82
|
+
typedConn.handle("start", ({ interval, maxHistory }) => {
|
|
83
|
+
if (!logger) {
|
|
84
|
+
return { success: false, cursor: 0 };
|
|
85
|
+
}
|
|
86
|
+
logger.start({
|
|
87
|
+
interval: interval ?? 0.01,
|
|
88
|
+
maxHistorySize: maxHistory ?? 10000,
|
|
89
|
+
});
|
|
90
|
+
lastHistoryCount = 0;
|
|
91
|
+
cursor++;
|
|
92
|
+
// Start update loop if not running
|
|
93
|
+
startUpdateLoop();
|
|
94
|
+
return { success: true, cursor };
|
|
95
|
+
});
|
|
96
|
+
// Stop handler
|
|
97
|
+
typedConn.handle("stop", () => {
|
|
98
|
+
if (!logger) {
|
|
99
|
+
return { success: false };
|
|
100
|
+
}
|
|
101
|
+
logger.stop();
|
|
102
|
+
return { success: true };
|
|
103
|
+
});
|
|
104
|
+
// Clear handler
|
|
105
|
+
typedConn.handle("clear", () => {
|
|
106
|
+
if (!logger) {
|
|
107
|
+
return { success: false };
|
|
108
|
+
}
|
|
109
|
+
logger.clear();
|
|
110
|
+
lastHistoryCount = 0;
|
|
111
|
+
cursor++;
|
|
112
|
+
return { success: true };
|
|
113
|
+
});
|
|
114
|
+
typedConn.handle("sync", () => {
|
|
115
|
+
if (!logger) {
|
|
116
|
+
return {
|
|
117
|
+
history: new Float64Array(0),
|
|
118
|
+
count: 0,
|
|
119
|
+
cursor: 0,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const currentCount = logger.getHistoryCount();
|
|
123
|
+
const history = logger.getMotionHistory(0, currentCount);
|
|
124
|
+
return {
|
|
125
|
+
history,
|
|
126
|
+
count: history.length / POSITION_STRIDE,
|
|
127
|
+
cursor,
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
typedConn.handle("get-current", () => {
|
|
131
|
+
if (!logger) {
|
|
132
|
+
return { position: null };
|
|
133
|
+
}
|
|
134
|
+
const position = logger.getCurrentPosition();
|
|
135
|
+
return { position };
|
|
136
|
+
});
|
|
137
|
+
// Get cursor
|
|
138
|
+
typedConn.handle("get-cursor", () => {
|
|
139
|
+
return { cursor };
|
|
140
|
+
});
|
|
141
|
+
// Ping
|
|
142
|
+
typedConn.handle("ping", () => {
|
|
143
|
+
return { timestamp: Date.now() };
|
|
144
|
+
});
|
|
145
|
+
}, { description: "Machine position logging and history streaming" });
|
|
146
|
+
console.log(`[PositionLogger] Service exposed as '${SERVICE_NAME}'`);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=position-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-logger.js","sourceRoot":"","sources":["../../src/services/position-logger.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "com.covenant.bridge",
|
|
3
|
+
"name": "Covenant Bridge",
|
|
4
|
+
"version": "0.1.1",
|
|
5
|
+
"description": "LinuxCNC to Eden bridge - exposes LinuxCNC functionality via AppBus services",
|
|
6
|
+
"author": "Dariusz Majnert",
|
|
7
|
+
"backend": {
|
|
8
|
+
"entry": "dist/backend.js"
|
|
9
|
+
},
|
|
10
|
+
"services": [
|
|
11
|
+
{
|
|
12
|
+
"name": "linuxcnc",
|
|
13
|
+
"description": "LinuxCNC status monitoring and command execution"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "gcode",
|
|
17
|
+
"description": "G-code file parsing using LinuxCNC interpreter"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "hal",
|
|
21
|
+
"description": "HAL component management and I/O access"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "position-logger",
|
|
25
|
+
"description": "Machine position logging and history streaming"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "covenant-bridge",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "LinuxCNC to Eden bridge worker",
|
|
5
|
+
"main": "dist/backend.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"manifest.json"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc && genesis build . -o dist/bridge.edenite",
|
|
13
|
+
"clean": "rm -rf dist",
|
|
14
|
+
"rebuild": "npm run clean && npm run build",
|
|
15
|
+
"prepublishOnly": "npm run rebuild"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"linuxcnc",
|
|
19
|
+
"eden",
|
|
20
|
+
"cnc",
|
|
21
|
+
"bridge"
|
|
22
|
+
],
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"covenant-protocol": "^0.1.0",
|
|
26
|
+
"@edenapp/types": "^0.2.1",
|
|
27
|
+
"@linuxcnc-node/core": "^2.1.3",
|
|
28
|
+
"@linuxcnc-node/gcode": "^2.1.2",
|
|
29
|
+
"@linuxcnc-node/hal": "^2.1.2",
|
|
30
|
+
"@linuxcnc-node/types": "^2.1.1",
|
|
31
|
+
"dlv": "^1.1.3",
|
|
32
|
+
"picomatch": "^4.0.3"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@edenapp/genesis": "^0.2.2",
|
|
36
|
+
"@types/dlv": "^1.1.5",
|
|
37
|
+
"@types/node": "^20.0.0",
|
|
38
|
+
"@types/picomatch": "^4.0.2",
|
|
39
|
+
"typescript": "^5.0.0"
|
|
40
|
+
}
|
|
41
|
+
}
|