Make machine configuration authoritative and restore native checkpoints exactly
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static float get_float(const char *name) {
|
||||
sim_hal_value value = {0};
|
||||
@@ -32,6 +34,19 @@ int sim_hal_test_run(void) {
|
||||
assert(sim_hal_register_function("missing", "bad") == SIM_HAL_ERR_NOT_FOUND);
|
||||
assert(sim_hal_step(5) == SIM_HAL_OK);
|
||||
assert(sim_hal_tick() == 5 && sim_hal_function_calls("update") == 2);
|
||||
const uint32_t saved_size = sim_hal_checkpoint_size();
|
||||
uint8_t *saved = malloc(saved_size), *restored = malloc(saved_size);
|
||||
assert(saved && restored);
|
||||
assert(sim_hal_checkpoint_export(saved, saved_size) == SIM_HAL_OK);
|
||||
assert(sim_hal_step(3) == SIM_HAL_OK);
|
||||
assert(sim_hal_tick() == 8 && sim_hal_function_calls("update") == 4);
|
||||
assert(sim_hal_checkpoint_restore(saved, saved_size - 1) == SIM_HAL_ERR_ARGUMENT);
|
||||
assert(sim_hal_tick() == 8);
|
||||
assert(sim_hal_checkpoint_restore(saved, saved_size) == SIM_HAL_OK);
|
||||
assert(sim_hal_tick() == 5 && sim_hal_function_calls("update") == 2);
|
||||
assert(sim_hal_checkpoint_export(restored, saved_size) == SIM_HAL_OK);
|
||||
assert(memcmp(saved, restored, saved_size) == 0);
|
||||
free(saved); free(restored);
|
||||
assert(sim_hal_set_function_failure("update", 1) == SIM_HAL_OK);
|
||||
assert(sim_hal_step(1) == SIM_HAL_ERR_FUNCTION);
|
||||
assert(sim_hal_tick() == 5);
|
||||
|
||||
@@ -18,6 +18,26 @@ int main(void) {
|
||||
sim_posemath_pose first = pose(0, 0, 10);
|
||||
sim_posemath_pose second = pose(20, 20, 10);
|
||||
assert(planner != NULL);
|
||||
assert(sim_linuxcnc_tp_init(planner, .001, 35, 300) == 0);
|
||||
assert(sim_linuxcnc_tp_set_axis_dynamics(planner, 0, 7, 40) == 0);
|
||||
assert(fabs(sim_linuxcnc_tp_jog_velocity(planner, 0) - 7) < 1e-9);
|
||||
assert(sim_linuxcnc_tp_set_axis_dynamics(planner, 4, 11, 20) == 0);
|
||||
assert(fabs(sim_linuxcnc_tp_jog_velocity(planner, 4) - 11) < 1e-9);
|
||||
assert(sim_linuxcnc_tp_set_axis_dynamics(planner, 9, 7, 40) != 0);
|
||||
assert(sim_linuxcnc_tp_set_axis_dynamics(planner, 0, NAN, 40) != 0);
|
||||
assert(sim_linuxcnc_tp_set_axis_dynamics(planner, 0, 7, 0) != 0);
|
||||
assert(sim_linuxcnc_tp_set_feed_limit(planner, 1.3) == 0);
|
||||
assert(sim_linuxcnc_tp_set_feed_override(planner, 1.3) == 0);
|
||||
assert(sim_linuxcnc_tp_set_feed_override(planner, 1.31) != 0);
|
||||
assert(sim_linuxcnc_tp_set_scale_minimum(planner, .02) == 0);
|
||||
assert(sim_linuxcnc_tp_set_jog_scale(planner, .02) == 0);
|
||||
assert(sim_linuxcnc_tp_set_velocity_scale(planner, .02) == 0);
|
||||
assert(sim_linuxcnc_tp_set_jog_scale(planner, .01) != 0);
|
||||
assert(sim_linuxcnc_tp_set_scale_minimum(planner, NAN) != 0);
|
||||
assert(sim_linuxcnc_tp_set_blend(planner, 1, 0, 25, 3, 50, .2) == 0);
|
||||
assert(sim_linuxcnc_tp_set_blend(planner, 2, 0, 25, 3, 50, .2) != 0);
|
||||
assert(sim_linuxcnc_tp_set_blend(planner, 1, 0, 0, 3, 50, .2) != 0);
|
||||
assert(sim_linuxcnc_tp_set_blend(planner, 1, 0, 25, 3, NAN, .2) != 0);
|
||||
assert(sim_linuxcnc_tp_init(planner, 0.001, 35.0, 300.0) == 0);
|
||||
assert(sim_linuxcnc_tp_queue_capacity(planner) > 0);
|
||||
assert(sim_linuxcnc_tp_velocity_mm_min(planner) == 0.0);
|
||||
@@ -25,6 +45,28 @@ int main(void) {
|
||||
assert(sim_linuxcnc_tp_set_profile(planner, 0, 0.0) == 0);
|
||||
assert(sim_linuxcnc_tp_add_line(planner, &first, 20.0, 300.0, 16, 1) == 0);
|
||||
assert(sim_linuxcnc_tp_add_line(planner, &second, 35.0, 300.0, 18, 1) == 0);
|
||||
for (int index = 0; index < 20; ++index) assert(sim_linuxcnc_tp_step(planner) == 0);
|
||||
uint32_t checkpoint_size = sim_linuxcnc_tp_checkpoint_size();
|
||||
uint8_t *checkpoint = malloc(checkpoint_size);
|
||||
uint64_t continuation[100];
|
||||
assert(checkpoint != NULL);
|
||||
assert(sim_linuxcnc_tp_checkpoint_export(planner, checkpoint, checkpoint_size) == 0);
|
||||
for (int index = 0; index < 100; ++index) {
|
||||
assert(sim_linuxcnc_tp_step(planner) == 0);
|
||||
continuation[index] = sim_linuxcnc_tp_state_hash(planner);
|
||||
}
|
||||
const uint64_t before_invalid = sim_linuxcnc_tp_state_hash(planner);
|
||||
assert(sim_linuxcnc_tp_checkpoint_restore(planner, checkpoint, checkpoint_size - 1) != 0);
|
||||
checkpoint[0] ^= 1;
|
||||
assert(sim_linuxcnc_tp_checkpoint_restore(planner, checkpoint, checkpoint_size) != 0);
|
||||
assert(sim_linuxcnc_tp_state_hash(planner) == before_invalid);
|
||||
checkpoint[0] ^= 1;
|
||||
assert(sim_linuxcnc_tp_checkpoint_restore(planner, checkpoint, checkpoint_size) == 0);
|
||||
for (int index = 0; index < 100; ++index) {
|
||||
assert(sim_linuxcnc_tp_step(planner) == 0);
|
||||
assert(sim_linuxcnc_tp_state_hash(planner) == continuation[index]);
|
||||
}
|
||||
free(checkpoint);
|
||||
for (int index = 0; index < 5000; ++index) {
|
||||
int result = sim_linuxcnc_tp_step(planner);
|
||||
if (result != 0) fprintf(stderr, "tp_step[%d]=%d\\n", index, result);
|
||||
|
||||
Reference in New Issue
Block a user