diff --git a/confgenerator.c b/confgenerator.c index 072a6cc7..04f8349a 100644 --- a/confgenerator.c +++ b/confgenerator.c @@ -204,6 +204,7 @@ int32_t confgenerator_serialize_appconf(uint8_t *buffer, const app_configuration buffer[ind++] = conf->can_mode; buffer[ind++] = (uint8_t)conf->uavcan_esc_index; buffer[ind++] = conf->uavcan_raw_mode; + buffer_append_float32_auto(buffer, conf->uavcan_raw_rpm_max, &ind); buffer[ind++] = conf->servo_out_enable; buffer[ind++] = conf->kill_sw_mode; buffer[ind++] = conf->app_to_use; @@ -223,7 +224,7 @@ int32_t confgenerator_serialize_appconf(uint8_t *buffer, const app_configuration buffer[ind++] = conf->app_ppm_conf.multi_esc; buffer[ind++] = conf->app_ppm_conf.tc; buffer_append_float32_auto(buffer, conf->app_ppm_conf.tc_max_diff, &ind); - buffer_append_float32_auto(buffer, conf->app_ppm_conf.max_erpm_for_dir, &ind); + buffer_append_float16(buffer, conf->app_ppm_conf.max_erpm_for_dir, 1, &ind); buffer_append_float32_auto(buffer, conf->app_ppm_conf.smart_rev_max_duty, &ind); buffer_append_float32_auto(buffer, conf->app_ppm_conf.smart_rev_ramp_time, &ind); buffer[ind++] = conf->app_adc_conf.ctrl_type; @@ -574,6 +575,7 @@ bool confgenerator_deserialize_appconf(const uint8_t *buffer, app_configuration conf->can_mode = buffer[ind++]; conf->uavcan_esc_index = buffer[ind++]; conf->uavcan_raw_mode = buffer[ind++]; + conf->uavcan_raw_rpm_max = buffer_get_float32_auto(buffer, &ind); conf->servo_out_enable = buffer[ind++]; conf->kill_sw_mode = buffer[ind++]; conf->app_to_use = buffer[ind++]; @@ -593,7 +595,7 @@ bool confgenerator_deserialize_appconf(const uint8_t *buffer, app_configuration conf->app_ppm_conf.multi_esc = buffer[ind++]; conf->app_ppm_conf.tc = buffer[ind++]; conf->app_ppm_conf.tc_max_diff = buffer_get_float32_auto(buffer, &ind); - conf->app_ppm_conf.max_erpm_for_dir = buffer_get_float32_auto(buffer, &ind); + conf->app_ppm_conf.max_erpm_for_dir = buffer_get_float16(buffer, 1, &ind); conf->app_ppm_conf.smart_rev_max_duty = buffer_get_float32_auto(buffer, &ind); conf->app_ppm_conf.smart_rev_ramp_time = buffer_get_float32_auto(buffer, &ind); conf->app_adc_conf.ctrl_type = buffer[ind++]; @@ -928,6 +930,7 @@ void confgenerator_set_defaults_appconf(app_configuration *conf) { conf->can_mode = APPCONF_CAN_MODE; conf->uavcan_esc_index = APPCONF_UAVCAN_ESC_INDEX; conf->uavcan_raw_mode = APPCONF_UAVCAN_RAW_MODE; + conf->uavcan_raw_rpm_max = APPCONF_UAVCAN_RAW_RPM_MAX; conf->servo_out_enable = APPCONF_SERVO_OUT_ENABLE; conf->kill_sw_mode = APPCONF_KILL_SW_MODE; conf->app_to_use = APPCONF_APP_TO_USE; diff --git a/confgenerator.h b/confgenerator.h index 8a9b4bb0..f05729f2 100644 --- a/confgenerator.h +++ b/confgenerator.h @@ -9,7 +9,7 @@ // Constants #define MCCONF_SIGNATURE 2686986464 -#define APPCONF_SIGNATURE 763356168 +#define APPCONF_SIGNATURE 3733512279 // Functions int32_t confgenerator_serialize_mcconf(uint8_t *buffer, const mc_configuration *conf); diff --git a/datatypes.h b/datatypes.h index 1e2f7a25..ee8dfca2 100644 --- a/datatypes.h +++ b/datatypes.h @@ -854,7 +854,8 @@ typedef enum { typedef enum { UAVCAN_RAW_MODE_CURRENT = 0, UAVCAN_RAW_MODE_CURRENT_NO_REV_BRAKE, - UAVCAN_RAW_MODE_DUTY + UAVCAN_RAW_MODE_DUTY, + UAVCAN_RAW_MODE_RPM } UAVCAN_RAW_MODE; typedef enum { @@ -883,6 +884,7 @@ typedef struct { CAN_MODE can_mode; uint8_t uavcan_esc_index; UAVCAN_RAW_MODE uavcan_raw_mode; + float uavcan_raw_rpm_max; // Application to use app_use app_to_use; diff --git a/libcanard/canard_driver.c b/libcanard/canard_driver.c index 0c1b4ad8..e04c6f5f 100755 --- a/libcanard/canard_driver.c +++ b/libcanard/canard_driver.c @@ -510,7 +510,9 @@ static void handle_esc_raw_command(CanardInstance* ins, CanardRxTransfer* transf if (cmd.cmd.len > app_get_configuration()->uavcan_esc_index) { float raw_val = ((float)cmd.cmd.data[app_get_configuration()->uavcan_esc_index]) / 8192.0; - switch (app_get_configuration()->uavcan_raw_mode) { + volatile const app_configuration *conf = app_get_configuration(); + + switch (conf->uavcan_raw_mode) { case UAVCAN_RAW_MODE_CURRENT: mc_interface_set_current_rel(raw_val); break; @@ -527,6 +529,10 @@ static void handle_esc_raw_command(CanardInstance* ins, CanardRxTransfer* transf mc_interface_set_duty(raw_val); break; + case UAVCAN_RAW_MODE_RPM: + mc_interface_set_pid_speed(raw_val * conf->uavcan_raw_rpm_max); + break; + default: break; }