@hla4ts/create-spacekit 0.1.0 → 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.
@@ -1,98 +1,98 @@
1
- import {
2
- createSpaceFomConfig,
3
- type MissingReferenceFrameMode,
4
- type SpacekitAppOptions,
5
- } from "@hla4ts/spacekit";
6
-
7
- export interface LunarRoverConfig {
8
- app: SpacekitAppOptions;
9
- roverName: string;
10
- roverType: string;
11
- roverStatus: string;
12
- parentReferenceFrame: string;
13
- roverSpeedMetersPerSec: number;
14
- startPosition: [number, number, number];
15
- }
16
-
17
- export function loadConfig(): LunarRoverConfig {
18
- const config = createSpaceFomConfig({
19
- envDefaults: {
20
- federationName: "{{FEDERATION_NAME}}",
21
- federateName: "{{FEDERATE_NAME}}",
22
- federateType: "{{FEDERATE_TYPE}}",
23
- rtiHost: "{{RTI_HOST}}",
24
- rtiPort: parseNumber("{{RTI_PORT}}", 15164),
25
- rtiUseTls: parseBoolean("{{RTI_USE_TLS}}", false),
26
- lookaheadMicros: parseBigInt("{{LOOKAHEAD_MICROS}}", 1000000n),
27
- updatePeriodMicros: parseBigInt("{{UPDATE_PERIOD_MICROS}}", 1000000n),
28
- referenceFrameTimeoutMs: parseNumber("{{REFERENCE_FRAME_TIMEOUT_MS}}", 30000),
29
- },
30
- extras: (env) => ({
31
- roverName: env.ROVER_NAME ?? "{{ROVER_NAME}}",
32
- roverType: env.ROVER_TYPE ?? "{{ROVER_TYPE}}",
33
- roverStatus: env.ROVER_STATUS ?? "ACTIVE",
34
- parentReferenceFrame: env.PARENT_REFERENCE_FRAME ?? "{{PARENT_REFERENCE_FRAME}}",
35
- roverSpeedMetersPerSec: parseNumber(
36
- env.ROVER_SPEED_MPS,
37
- parseNumber("{{ROVER_SPEED_MPS}}", 0.5)
38
- ),
39
- startPosition: [
40
- parseNumber(env.ROVER_START_X, 0),
41
- parseNumber(env.ROVER_START_Y, 0),
42
- parseNumber(env.ROVER_START_Z, 0),
43
- ] as [number, number, number],
44
- }),
45
- });
46
- config.app.missingReferenceFrameMode = parseReferenceFrameMissingMode(
47
- process.env.REFERENCE_FRAME_MISSING_MODE ?? "{{REFERENCE_FRAME_MISSING_MODE}}"
48
- );
49
- return config;
50
- }
51
-
52
- function parseNumber(value: string | undefined, fallback: number): number {
53
- if (value === undefined || value.trim() === "") {
54
- return fallback;
55
- }
56
- const parsed = Number(value);
57
- if (!Number.isFinite(parsed)) {
58
- throw new Error(`Invalid numeric environment value: ${value}`);
59
- }
60
- return parsed;
61
- }
62
-
63
- function parseBigInt(value: string | undefined, fallback: bigint): bigint {
64
- if (value === undefined || value.trim() === "") {
65
- return fallback;
66
- }
67
- try {
68
- return BigInt(value);
69
- } catch {
70
- throw new Error(`Invalid bigint environment value: ${value}`);
71
- }
72
- }
73
-
74
- function parseBoolean(value: string | undefined, fallback: boolean): boolean {
75
- if (value === undefined || value.trim() === "") {
76
- return fallback;
77
- }
78
- const normalized = value.toLowerCase();
79
- if (["true", "1", "yes", "y"].includes(normalized)) {
80
- return true;
81
- }
82
- if (["false", "0", "no", "n"].includes(normalized)) {
83
- return false;
84
- }
85
- throw new Error(`Invalid boolean environment value: ${value}`);
86
- }
87
-
88
- function parseReferenceFrameMissingMode(
89
- value: string | undefined
90
- ): MissingReferenceFrameMode {
91
- if (!value || value.trim() === "") {
92
- return "continue";
93
- }
94
- if (value === "error" || value === "continue") {
95
- return value;
96
- }
97
- throw new Error(`Invalid reference frame missing mode: ${value}`);
98
- }
1
+ import {
2
+ createSpaceFomConfig,
3
+ type MissingReferenceFrameMode,
4
+ type SpacekitAppOptions,
5
+ } from "@hla4ts/spacekit";
6
+
7
+ export interface LunarRoverConfig {
8
+ app: SpacekitAppOptions;
9
+ roverName: string;
10
+ roverType: string;
11
+ roverStatus: string;
12
+ parentReferenceFrame: string;
13
+ roverSpeedMetersPerSec: number;
14
+ startPosition: [number, number, number];
15
+ }
16
+
17
+ export function loadConfig(): LunarRoverConfig {
18
+ const config = createSpaceFomConfig({
19
+ envDefaults: {
20
+ federationName: "{{FEDERATION_NAME}}",
21
+ federateName: "{{FEDERATE_NAME}}",
22
+ federateType: "{{FEDERATE_TYPE}}",
23
+ rtiHost: "{{RTI_HOST}}",
24
+ rtiPort: parseNumber("{{RTI_PORT}}", 15164),
25
+ rtiUseTls: parseBoolean("{{RTI_USE_TLS}}", false),
26
+ lookaheadMicros: parseBigInt("{{LOOKAHEAD_MICROS}}", 1000000n),
27
+ updatePeriodMicros: parseBigInt("{{UPDATE_PERIOD_MICROS}}", 1000000n),
28
+ referenceFrameTimeoutMs: parseNumber("{{REFERENCE_FRAME_TIMEOUT_MS}}", 30000),
29
+ },
30
+ extras: (env) => ({
31
+ roverName: env.ROVER_NAME ?? "{{ROVER_NAME}}",
32
+ roverType: env.ROVER_TYPE ?? "{{ROVER_TYPE}}",
33
+ roverStatus: env.ROVER_STATUS ?? "ACTIVE",
34
+ parentReferenceFrame: env.PARENT_REFERENCE_FRAME ?? "{{PARENT_REFERENCE_FRAME}}",
35
+ roverSpeedMetersPerSec: parseNumber(
36
+ env.ROVER_SPEED_MPS,
37
+ parseNumber("{{ROVER_SPEED_MPS}}", 0.5)
38
+ ),
39
+ startPosition: [
40
+ parseNumber(env.ROVER_START_X, 0),
41
+ parseNumber(env.ROVER_START_Y, 0),
42
+ parseNumber(env.ROVER_START_Z, 0),
43
+ ] as [number, number, number],
44
+ }),
45
+ });
46
+ config.app.missingReferenceFrameMode = parseReferenceFrameMissingMode(
47
+ process.env.REFERENCE_FRAME_MISSING_MODE ?? "{{REFERENCE_FRAME_MISSING_MODE}}"
48
+ );
49
+ return config;
50
+ }
51
+
52
+ function parseNumber(value: string | undefined, fallback: number): number {
53
+ if (value === undefined || value.trim() === "") {
54
+ return fallback;
55
+ }
56
+ const parsed = Number(value);
57
+ if (!Number.isFinite(parsed)) {
58
+ throw new Error(`Invalid numeric environment value: ${value}`);
59
+ }
60
+ return parsed;
61
+ }
62
+
63
+ function parseBigInt(value: string | undefined, fallback: bigint): bigint {
64
+ if (value === undefined || value.trim() === "") {
65
+ return fallback;
66
+ }
67
+ try {
68
+ return BigInt(value);
69
+ } catch {
70
+ throw new Error(`Invalid bigint environment value: ${value}`);
71
+ }
72
+ }
73
+
74
+ function parseBoolean(value: string | undefined, fallback: boolean): boolean {
75
+ if (value === undefined || value.trim() === "") {
76
+ return fallback;
77
+ }
78
+ const normalized = value.toLowerCase();
79
+ if (["true", "1", "yes", "y"].includes(normalized)) {
80
+ return true;
81
+ }
82
+ if (["false", "0", "no", "n"].includes(normalized)) {
83
+ return false;
84
+ }
85
+ throw new Error(`Invalid boolean environment value: ${value}`);
86
+ }
87
+
88
+ function parseReferenceFrameMissingMode(
89
+ value: string | undefined
90
+ ): MissingReferenceFrameMode {
91
+ if (!value || value.trim() === "") {
92
+ return "continue";
93
+ }
94
+ if (value === "error" || value === "continue") {
95
+ return value;
96
+ }
97
+ throw new Error(`Invalid reference frame missing mode: ${value}`);
98
+ }
@@ -1,57 +1,57 @@
1
- import { PhysicalEntity, SpacekitApp, type SpaceTimeCoordinateState } from "@hla4ts/spacekit";
2
- import { loadConfig } from "./config.ts";
3
-
4
- async function main(): Promise<void> {
5
- const config = loadConfig();
6
- const app = new SpacekitApp(config.app);
7
- const rover = new PhysicalEntity(config.roverName, {
8
- type: config.roverType,
9
- status: config.roverStatus,
10
- parent_reference_frame: config.parentReferenceFrame,
11
- });
12
-
13
- await app.run({
14
- entities: [rover],
15
- onTick: ({ initial, tick, timeMicros, timeSeconds, sendTimeMicros }) => {
16
- if (initial) return;
17
-
18
- rover.name = config.roverName;
19
- rover.type = config.roverType;
20
- rover.status = config.roverStatus;
21
- rover.parent_reference_frame = config.parentReferenceFrame;
22
- rover.state = buildRoverState(config, timeSeconds);
23
-
24
- if (!app.shouldLogTick(tick)) return;
25
-
26
- app.logger.info("Rover tick.", {
27
- tick,
28
- logicalTimeMicros: timeMicros.toString(),
29
- sendTimeMicros: (sendTimeMicros ?? timeMicros).toString(),
30
- position: rover.state.translation.position.map((value) => value.toFixed(3)),
31
- velocity: rover.state.translation.velocity.map((value) => value.toFixed(3)),
32
- });
33
- },
34
- });
35
- }
36
-
37
- function buildRoverState(
38
- config: ReturnType<typeof loadConfig>,
39
- timeSeconds: number
40
- ): SpaceTimeCoordinateState {
41
- const [startX, startY, startZ] = config.startPosition;
42
- const positionX = startX + config.roverSpeedMetersPerSec * timeSeconds;
43
-
44
- return {
45
- translation: {
46
- position: [positionX, startY, startZ],
47
- velocity: [config.roverSpeedMetersPerSec, 0, 0],
48
- },
49
- rotation: {
50
- attitude: { scalar: 1, vector: [0, 0, 0] },
51
- angularVelocity: [0, 0, 0],
52
- },
53
- time: timeSeconds,
54
- };
55
- }
56
-
57
- void main();
1
+ import { PhysicalEntity, SpacekitApp, type SpaceTimeCoordinateState } from "@hla4ts/spacekit";
2
+ import { loadConfig } from "./config.ts";
3
+
4
+ async function main(): Promise<void> {
5
+ const config = loadConfig();
6
+ const app = new SpacekitApp(config.app);
7
+ const rover = new PhysicalEntity(config.roverName, {
8
+ type: config.roverType,
9
+ status: config.roverStatus,
10
+ parent_reference_frame: config.parentReferenceFrame,
11
+ });
12
+
13
+ await app.run({
14
+ entities: [rover],
15
+ onTick: ({ initial, tick, timeMicros, timeSeconds, sendTimeMicros }) => {
16
+ if (initial) return;
17
+
18
+ rover.name = config.roverName;
19
+ rover.type = config.roverType;
20
+ rover.status = config.roverStatus;
21
+ rover.parent_reference_frame = config.parentReferenceFrame;
22
+ rover.state = buildRoverState(config, timeSeconds);
23
+
24
+ if (!app.shouldLogTick(tick)) return;
25
+
26
+ app.logger.info("Rover tick.", {
27
+ tick,
28
+ logicalTimeMicros: timeMicros.toString(),
29
+ sendTimeMicros: (sendTimeMicros ?? timeMicros).toString(),
30
+ position: rover.state.translation.position.map((value) => value.toFixed(3)),
31
+ velocity: rover.state.translation.velocity.map((value) => value.toFixed(3)),
32
+ });
33
+ },
34
+ });
35
+ }
36
+
37
+ function buildRoverState(
38
+ config: ReturnType<typeof loadConfig>,
39
+ timeSeconds: number
40
+ ): SpaceTimeCoordinateState {
41
+ const [startX, startY, startZ] = config.startPosition;
42
+ const positionX = startX + config.roverSpeedMetersPerSec * timeSeconds;
43
+
44
+ return {
45
+ translation: {
46
+ position: [positionX, startY, startZ],
47
+ velocity: [config.roverSpeedMetersPerSec, 0, 0],
48
+ },
49
+ rotation: {
50
+ attitude: { scalar: 1, vector: [0, 0, 0] },
51
+ angularVelocity: [0, 0, 0],
52
+ },
53
+ time: timeSeconds,
54
+ };
55
+ }
56
+
57
+ void main();
@@ -1,24 +1,24 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "bundler",
6
- "lib": ["ES2022"],
7
- "types": ["bun-types"],
8
- "strict": true,
9
- "esModuleInterop": true,
10
- "skipLibCheck": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "resolveJsonModule": true,
13
- "isolatedModules": true,
14
- "noEmit": true,
15
- "noUnusedLocals": true,
16
- "noUnusedParameters": true,
17
- "noImplicitReturns": true,
18
- "noFallthroughCasesInSwitch": true,
19
- "allowImportingTsExtensions": true,
20
- "experimentalDecorators": true,
21
- "verbatimModuleSyntax": true
22
- },
23
- "include": ["src/**/*"]
24
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "lib": ["ES2022"],
7
+ "types": ["bun-types"],
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "noEmit": true,
15
+ "noUnusedLocals": true,
16
+ "noUnusedParameters": true,
17
+ "noImplicitReturns": true,
18
+ "noFallthroughCasesInSwitch": true,
19
+ "allowImportingTsExtensions": true,
20
+ "experimentalDecorators": true,
21
+ "verbatimModuleSyntax": true
22
+ },
23
+ "include": ["src/**/*"]
24
+ }