void GCS_MAVLINK::handle_param_set(mavlink_message_t *msg, DataFlash_Class *DataFlash) { mavlink_param_set_t packet; mavlink_msg_param_set_decode(msg, &packet); enum ap_var_type var_type; // set parameter AP_Param *vp; char key[AP_MAX_NAME_SIZE+1]; strncpy(key, (char *)packet.param_id, AP_MAX_NAME_SIZE); key[AP_MAX_NAME_SIZE] = 0; // find existing param so we can get the old value vp = AP_Param::find(key, &var_type); if (vp == NULL) { return; } float old_value = vp->cast_to_float(var_type); // set the value vp->set_float(packet.param_value, var_type); /* we force the save if the value is not equal to the old value. This copes with the use of override values in constructors, such as PID elements. Otherwise a set to the default value which differs from the constructor value doesn't save the change */ bool force_save = !is_equal(packet.param_value, old_value); // save the change vp->save(force_save); // Report back the new value if we accepted the change // we send the value we actually set, which could be // different from the value sent, in case someone sent // a fractional value to an integer type mavlink_msg_param_value_send_buf( msg, chan, key, vp->cast_to_float(var_type), mav_var_type(var_type), _count_parameters(), -1); // XXX we don't actually know what its index is... if (DataFlash != NULL) { DataFlash->Log_Write_Parameter(key, vp->cast_to_float(var_type)); } }
void GCS_MAVLINK::handle_param_set(mavlink_message_t *msg, DataFlash_Class *DataFlash) { mavlink_param_set_t packet; mavlink_msg_param_set_decode(msg, &packet); enum ap_var_type var_type; // set parameter AP_Param *vp; char key[AP_MAX_NAME_SIZE+1]; strncpy(key, (char *)packet.param_id, AP_MAX_NAME_SIZE); key[AP_MAX_NAME_SIZE] = 0; // find existing param so we can get the old value vp = AP_Param::find(key, &var_type); if (vp == NULL) { return; } float old_value = vp->cast_to_float(var_type); // set the value vp->set_float(packet.param_value, var_type); /* we force the save if the value is not equal to the old value. This copes with the use of override values in constructors, such as PID elements. Otherwise a set to the default value which differs from the constructor value doesn't save the change */ bool force_save = !is_equal(packet.param_value, old_value); // save the change vp->save(force_save); if (DataFlash != NULL) { DataFlash->Log_Write_Parameter(key, vp->cast_to_float(var_type)); } }
/* load a default set of parameters from a file */ bool AP_Param::load_defaults_file(const char *filename) { FILE *f = fopen(filename, "r"); if (f == NULL) { return false; } char line[100]; /* work out how many parameter default structures to allocate */ uint16_t num_defaults = 0; while (fgets(line, sizeof(line)-1, f)) { char *pname; float value; if (!parse_param_line(line, &pname, value)) { continue; } if (!find_def_value_ptr(pname)) { fclose(f); return false; } num_defaults++; } fclose(f); if (param_overrides != NULL) { free(param_overrides); } num_param_overrides = 0; param_overrides = new param_override[num_defaults]; if (param_overrides == NULL) { return false; } /* re-open to avoid possible seek issues with NuttX */ f = fopen(filename, "r"); if (f == NULL) { return false; } uint16_t idx = 0; while (fgets(line, sizeof(line)-1, f)) { char *pname; float value; if (!parse_param_line(line, &pname, value)) { continue; } const float *def_value_ptr = find_def_value_ptr(pname); if (!def_value_ptr) { fclose(f); return false; } param_overrides[idx].def_value_ptr = def_value_ptr; param_overrides[idx].value = value; idx++; enum ap_var_type var_type; AP_Param *vp = AP_Param::find(pname, &var_type); if (!vp) { fclose(f); return false; } vp->set_float(value, var_type); } fclose(f); num_param_overrides = num_defaults; return true; }