#include "sim_task.h" #include #include #include int main(void) { sim_task task = {0}; sim_task baseline = {0}; sim_task_state state = {0}; char canonical[SIM_TASK_CANONICAL_CAPACITY] = {0}; uint32_t required; uint64_t hash; assert(sim_task_init(&task, "linuxcnc-2.10.0-pre0-wasm-m1-py-c1", "native-task") == SIM_TASK_OK); assert(sim_task_set_command(&task, 1, 0) == SIM_TASK_OK); assert(sim_task_attach(&task) == SIM_TASK_OK); assert(sim_task_set_command(&task, 3, 0) == SIM_TASK_ERR_SEQUENCE); assert(sim_task_set_command(&task, 2, 0) == SIM_TASK_OK); assert(sim_task_command_gate(&task, SIM_TASK_GATE_PROGRAM_LOAD, 0, 0, 0, 0, 0, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_command_gate(&task, SIM_TASK_GATE_RUN, 0, 0, 0, 0, 0, 10) == SIM_TASK_GATE_MACHINE_OFF); assert(sim_task_command_gate(&task, SIM_TASK_GATE_POWER, 1, 0, 0, 0, 0, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_command_gate(&task, SIM_TASK_GATE_POWER, 0, 0, 0, 0, 0, 10) == SIM_TASK_GATE_MACHINE_OFF); assert(sim_task_set_program(&task, SIM_TASK_PROGRAM_LOADED, 0) == SIM_TASK_OK); assert(sim_task_command_gate(&task, SIM_TASK_GATE_RUN, 0, 1, 0, 1, 1, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_transition(&task, SIM_TASK_RUNNING) == SIM_TASK_OK); assert(sim_task_set_program(&task, SIM_TASK_PROGRAM_RUNNING, 1) == SIM_TASK_OK); assert(sim_task_command_gate(&task, SIM_TASK_GATE_PAUSE, 0, 1, 0, 1, 0, 10) == SIM_TASK_GATE_PAUSE_STATE); assert(sim_task_set_mode(&task, SIM_TASK_MODE_AUTO) == SIM_TASK_OK); assert(sim_task_command_gate(&task, SIM_TASK_GATE_PAUSE, 0, 1, 0, 1, 0, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_command_gate(&task, SIM_TASK_GATE_OVERRIDE, 0, 1, 0, 1, 0, 10) == SIM_TASK_GATE_ALLOWED); /* axis.tcl sliders are available in OFF and ESTOP as well as AUTO. */ assert(sim_task_command_gate(&task, SIM_TASK_GATE_OVERRIDE, 0, 0, 0, 1, 0, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_command_gate(&task, SIM_TASK_GATE_OVERRIDE, 0, 1, 1, 1, 0, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_command_gate(&task, SIM_TASK_GATE_POWER, 0, 1, 0, 1, 0, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_command_gate(&task, SIM_TASK_GATE_SET_MODE, SIM_TASK_MODE_MANUAL, 1, 0, 1, 0, 10) == SIM_TASK_GATE_MODE_AUTO_ACTIVE); assert(sim_task_command_gate(&task, SIM_TASK_GATE_ESTOP, 1, 1, 0, 1, 0, 10) == SIM_TASK_GATE_ALLOWED); assert(sim_task_set_command(&task, 3, 4) == SIM_TASK_OK); assert(sim_task_transition(&task, SIM_TASK_PAUSED) == SIM_TASK_OK); assert(sim_task_set_command(&task, 4, 3) == SIM_TASK_ERR_TICK); assert(sim_task_set_command(&task, 4, 5) == SIM_TASK_OK); assert(sim_task_transition(&task, SIM_TASK_RUNNING) == SIM_TASK_OK); assert(sim_task_fault(&task, -77) == SIM_TASK_OK); assert(sim_task_recover(&task) == SIM_TASK_OK); assert(sim_task_read_state(&task, &state) == SIM_TASK_OK && state.state == SIM_TASK_READY); required = sim_task_canonical(&task, NULL, 0); assert(required > 1 && required < SIM_TASK_CANONICAL_CAPACITY); assert(sim_task_canonical(&task, canonical, sizeof(canonical)) == required); assert(strstr(canonical, "\"schema\":\"sim_task.v1\"") != NULL); hash = sim_task_state_hash(&task); assert(hash != 0 && hash == sim_task_state_hash(&task)); assert(sim_task_canonical(&task, canonical, required - 1) == required); assert(sim_task_init(&task, "bad\"context", "session") == SIM_TASK_ERR_ARGUMENT); assert(sim_task_init(&task, "context", "session") == SIM_TASK_OK); assert(sim_task_transition(&task, SIM_TASK_PAUSED) == SIM_TASK_ERR_TRANSITION); assert(sim_task_set_mode(&task, 99) == SIM_TASK_ERR_ARGUMENT); assert(sim_task_set_program(&task, 99, 0) == SIM_TASK_ERR_ARGUMENT); assert(sim_task_set_command(&task, 1, 0) == SIM_TASK_OK); assert(sim_task_attach(&task) == SIM_TASK_OK); assert(sim_task_transition(&task, SIM_TASK_DESTROYED) == SIM_TASK_OK); assert(sim_task_set_command(&task, 2, 0) == SIM_TASK_ERR_DESTROYED); assert(sim_task_init(&baseline, "linuxcnc-2.10.0-pre0-wasm-m1-py-c1", "task-a") == SIM_TASK_OK); assert(sim_task_set_command(&baseline, 1, 0) == SIM_TASK_OK); assert(sim_task_attach(&baseline) == SIM_TASK_OK); assert(sim_task_set_command(&baseline, 2, 0) == SIM_TASK_OK); assert(sim_task_set_command(&baseline, 3, 0) == SIM_TASK_OK); assert(sim_task_set_command(&baseline, 4, 0) == SIM_TASK_OK); assert(sim_task_set_program(&baseline, SIM_TASK_PROGRAM_LOADED, 0) == SIM_TASK_OK); assert(sim_task_set_command(&baseline, 5, 0) == SIM_TASK_OK); assert(sim_task_transition(&baseline, SIM_TASK_RUNNING) == SIM_TASK_OK); assert(sim_task_set_mode(&baseline, SIM_TASK_MODE_AUTO) == SIM_TASK_OK); assert(sim_task_set_program(&baseline, SIM_TASK_PROGRAM_RUNNING, 1) == SIM_TASK_OK); assert(sim_task_set_command(&baseline, 6, 1) == SIM_TASK_OK); printf("{\"schema\":\"sim-task-samples.v1\",\"state\":\"READY\",\"seq\":%u,\"tick\":%u,\"state_hash\":\"fnv1a64:%016llx\",\"baseline_hash\":\"fnv1a64:%016llx\",\"canonical\":%s}\n", state.seq, state.simulation_tick, (unsigned long long)hash, (unsigned long long)sim_task_state_hash(&baseline), canonical); return 0; }