/** * Process a received buffer with commands and data. * * @param data * The buffer to process. * * @param len * The length of the buffer. */ void bldc_interface_process_packet(unsigned char *data, unsigned int len) { if (!len) { return; } if (forward_func) { forward_func(data, len); return; } int32_t ind = 0; int i = 0; unsigned char id = data[0]; data++; len--; switch (id) { case COMM_FW_VERSION: if (len == 2) { ind = 0; fw_major = data[ind++]; fw_minor = data[ind++]; } else { fw_major = -1; fw_minor = -1; } break; case COMM_ERASE_NEW_APP: case COMM_WRITE_NEW_APP_DATA: // TODO break; case COMM_GET_VALUES: ind = 0; values.temp_mos1 = buffer_get_float16(data, 10.0, &ind); values.temp_mos2 = buffer_get_float16(data, 10.0, &ind); values.temp_mos3 = buffer_get_float16(data, 10.0, &ind); values.temp_mos4 = buffer_get_float16(data, 10.0, &ind); values.temp_mos5 = buffer_get_float16(data, 10.0, &ind); values.temp_mos6 = buffer_get_float16(data, 10.0, &ind); values.temp_pcb = buffer_get_float16(data, 10.0, &ind); values.current_motor = buffer_get_float32(data, 100.0, &ind); values.current_in = buffer_get_float32(data, 100.0, &ind); values.duty_now = buffer_get_float16(data, 1000.0, &ind); values.rpm = buffer_get_float32(data, 1.0, &ind); values.v_in = buffer_get_float16(data, 10.0, &ind); values.amp_hours = buffer_get_float32(data, 10000.0, &ind); values.amp_hours_charged = buffer_get_float32(data, 10000.0, &ind); values.watt_hours = buffer_get_float32(data, 10000.0, &ind); values.watt_hours_charged = buffer_get_float32(data, 10000.0, &ind); values.tachometer = buffer_get_int32(data, &ind); values.tachometer_abs = buffer_get_int32(data, &ind); values.fault_code = (mc_fault_code)data[ind++]; if (rx_value_func) { rx_value_func(&values); } break; case COMM_PRINT: // TODO break; case COMM_SAMPLE_PRINT: // TODO break; case COMM_ROTOR_POSITION: ind = 0; rotor_pos = buffer_get_float32(data, 100000.0, &ind); if (rx_rotor_pos_func) { rx_rotor_pos_func(rotor_pos); } break; case COMM_EXPERIMENT_SAMPLE: // TODO break; case COMM_GET_MCCONF: ind = 0; mcconf.pwm_mode = (mc_pwm_mode)data[ind++]; mcconf.comm_mode = (mc_comm_mode)data[ind++]; mcconf.motor_type = (mc_motor_type)data[ind++]; mcconf.sensor_mode = (mc_sensor_mode)data[ind++]; mcconf.l_current_max = buffer_get_float32(data, 1000.0, &ind); mcconf.l_current_min = buffer_get_float32(data, 1000.0, &ind); mcconf.l_in_current_max = buffer_get_float32(data, 1000.0, &ind); mcconf.l_in_current_min = buffer_get_float32(data, 1000.0, &ind); mcconf.l_abs_current_max = buffer_get_float32(data, 1000.0, &ind); mcconf.l_min_erpm = buffer_get_float32(data, 1000.0, &ind); mcconf.l_max_erpm = buffer_get_float32(data, 1000.0, &ind); mcconf.l_max_erpm_fbrake = buffer_get_float32(data, 1000.0, &ind); mcconf.l_max_erpm_fbrake_cc = buffer_get_float32(data, 1000.0, &ind); mcconf.l_min_vin = buffer_get_float32(data, 1000.0, &ind); mcconf.l_max_vin = buffer_get_float32(data, 1000.0, &ind); mcconf.l_battery_cut_start = buffer_get_float32(data, 1000.0, &ind); mcconf.l_battery_cut_end = buffer_get_float32(data, 1000.0, &ind); mcconf.l_slow_abs_current = data[ind++]; mcconf.l_rpm_lim_neg_torque = data[ind++]; mcconf.l_temp_fet_start = buffer_get_float32(data, 1000.0, &ind); mcconf.l_temp_fet_end = buffer_get_float32(data, 1000.0, &ind); mcconf.l_temp_motor_start = buffer_get_float32(data, 1000.0, &ind); mcconf.l_temp_motor_end = buffer_get_float32(data, 1000.0, &ind); mcconf.l_min_duty = buffer_get_float32(data, 1000000.0, &ind); mcconf.l_max_duty = buffer_get_float32(data, 1000000.0, &ind); mcconf.sl_min_erpm = buffer_get_float32(data, 1000.0, &ind); mcconf.sl_min_erpm_cycle_int_limit = buffer_get_float32(data, 1000.0, &ind); mcconf.sl_max_fullbreak_current_dir_change = buffer_get_float32(data, 1000.0, &ind); mcconf.sl_cycle_int_limit = buffer_get_float32(data, 1000.0, &ind); mcconf.sl_phase_advance_at_br = buffer_get_float32(data, 1000.0, &ind); mcconf.sl_cycle_int_rpm_br = buffer_get_float32(data, 1000.0, &ind); mcconf.sl_bemf_coupling_k = buffer_get_float32(data, 1000.0, &ind); memcpy(mcconf.hall_table, data + ind, 8); ind += 8; mcconf.hall_sl_erpm = buffer_get_float32(data, 1000.0, &ind); mcconf.s_pid_kp = buffer_get_float32(data, 1000000.0, &ind); mcconf.s_pid_ki = buffer_get_float32(data, 1000000.0, &ind); mcconf.s_pid_kd = buffer_get_float32(data, 1000000.0, &ind); mcconf.s_pid_min_erpm = buffer_get_float32(data, 1000.0, &ind); mcconf.p_pid_kp = buffer_get_float32(data, 1000000.0, &ind); mcconf.p_pid_ki = buffer_get_float32(data, 1000000.0, &ind); mcconf.p_pid_kd = buffer_get_float32(data, 1000000.0, &ind); mcconf.cc_startup_boost_duty = buffer_get_float32(data, 1000000.0, &ind); mcconf.cc_min_current = buffer_get_float32(data, 1000.0, &ind); mcconf.cc_gain = buffer_get_float32(data, 1000000.0, &ind); mcconf.cc_ramp_step_max = buffer_get_float32(data, 1000000.0, &ind); mcconf.m_fault_stop_time_ms = buffer_get_int32(data, &ind); mcconf.m_duty_ramp_step = buffer_get_float32(data, 1000000.0, &ind); mcconf.m_duty_ramp_step_rpm_lim = buffer_get_float32(data, 1000000.0, &ind); mcconf.m_current_backoff_gain = buffer_get_float32(data, 1000000.0, &ind); if (rx_mcconf_func) { rx_mcconf_func(&mcconf); } break; case COMM_GET_APPCONF: ind = 0; appconf.controller_id = data[ind++]; appconf.timeout_msec = buffer_get_uint32(data, &ind); appconf.timeout_brake_current = buffer_get_float32(data, 1000.0, &ind); appconf.send_can_status = data[ind++]; appconf.send_can_status_rate_hz = buffer_get_uint16(data, &ind); appconf.app_to_use = (app_use)data[ind++]; appconf.app_ppm_conf.ctrl_type = (ppm_control_type)data[ind++]; appconf.app_ppm_conf.pid_max_erpm = buffer_get_float32(data, 1000.0, &ind); appconf.app_ppm_conf.hyst = buffer_get_float32(data, 1000.0, &ind); appconf.app_ppm_conf.pulse_start = buffer_get_float32(data, 1000.0, &ind); appconf.app_ppm_conf.pulse_end = buffer_get_float32(data, 1000.0, &ind); appconf.app_ppm_conf.median_filter = data[ind++]; appconf.app_ppm_conf.safe_start = data[ind++]; appconf.app_ppm_conf.rpm_lim_start = buffer_get_float32(data, 1000.0, &ind); appconf.app_ppm_conf.rpm_lim_end = buffer_get_float32(data, 1000.0, &ind); appconf.app_ppm_conf.multi_esc = data[ind++]; appconf.app_ppm_conf.tc = data[ind++]; appconf.app_ppm_conf.tc_max_diff = buffer_get_float32(data, 1000.0, &ind); appconf.app_adc_conf.ctrl_type = (adc_control_type)data[ind++]; appconf.app_adc_conf.hyst = buffer_get_float32(data, 1000.0, &ind); appconf.app_adc_conf.voltage_start = buffer_get_float32(data, 1000.0, &ind); appconf.app_adc_conf.voltage_end = buffer_get_float32(data, 1000.0, &ind); appconf.app_adc_conf.use_filter = data[ind++]; appconf.app_adc_conf.safe_start = data[ind++]; appconf.app_adc_conf.cc_button_inverted = data[ind++]; appconf.app_adc_conf.rev_button_inverted = data[ind++]; appconf.app_adc_conf.voltage_inverted = data[ind++]; appconf.app_adc_conf.rpm_lim_start = buffer_get_float32(data, 1000.0, &ind); appconf.app_adc_conf.rpm_lim_end = buffer_get_float32(data, 1000.0, &ind); appconf.app_adc_conf.multi_esc = data[ind++]; appconf.app_adc_conf.tc = data[ind++]; appconf.app_adc_conf.tc_max_diff = buffer_get_float32(data, 1000.0, &ind); appconf.app_adc_conf.update_rate_hz = buffer_get_uint16(data, &ind); appconf.app_uart_baudrate = buffer_get_uint32(data, &ind); appconf.app_chuk_conf.ctrl_type = (chuk_control_type)data[ind++]; appconf.app_chuk_conf.hyst = buffer_get_float32(data, 1000.0, &ind); appconf.app_chuk_conf.rpm_lim_start = buffer_get_float32(data, 1000.0, &ind); appconf.app_chuk_conf.rpm_lim_end = buffer_get_float32(data, 1000.0, &ind); appconf.app_chuk_conf.ramp_time_pos = buffer_get_float32(data, 1000.0, &ind); appconf.app_chuk_conf.ramp_time_neg = buffer_get_float32(data, 1000.0, &ind); appconf.app_chuk_conf.stick_erpm_per_s_in_cc = buffer_get_float32(data, 1000.0, &ind); appconf.app_chuk_conf.multi_esc = data[ind++]; appconf.app_chuk_conf.tc = data[ind++]; appconf.app_chuk_conf.tc_max_diff = buffer_get_float32(data, 1000.0, &ind); if (rx_appconf_func) { rx_appconf_func(&appconf); } break; case COMM_DETECT_MOTOR_PARAM: ind = 0; detect_cycle_int_limit = buffer_get_float32(data, 1000.0, &ind); detect_coupling_k = buffer_get_float32(data, 1000.0, &ind); for (i = 0;i < 8;i++) { detect_hall_table[i] = (const signed char)(data[ind++]); } detect_hall_res = (const signed char)(data[ind++]); if (rx_detect_func) { rx_detect_func(detect_cycle_int_limit, detect_coupling_k, detect_hall_table, detect_hall_res); } break; case COMM_GET_DECODED_PPM: ind = 0; dec_ppm = buffer_get_float32(data, 1000000.0, &ind); dec_ppm_len = buffer_get_float32(data, 1000000.0, &ind); if (rx_dec_ppm_func) { rx_dec_ppm_func(dec_ppm, dec_ppm_len); } break; case COMM_GET_DECODED_ADC: ind = 0; dec_adc = buffer_get_float32(data, 1000000.0, &ind); dec_adc_voltage = buffer_get_float32(data, 1000000.0, &ind); if (rx_dec_adc_func) { rx_dec_adc_func(dec_adc, dec_adc_voltage); } break; case COMM_GET_DECODED_CHUK: ind = 0; dec_chuk = buffer_get_float32(data, 1000000.0, &ind); if (rx_dec_chuk_func) { rx_dec_chuk_func(dec_chuk); } break; case COMM_SET_MCCONF: // This is a confirmation that the new mcconf is received. if (rx_mcconf_received_func) { rx_mcconf_received_func(); } break; case COMM_SET_APPCONF: // This is a confirmation that the new appconf is received. if (rx_appconf_received_func) { rx_appconf_received_func(); } break; default: break; } }
int main() { std::cout<<"test move constructor:\n"; std::allocator<std::string> alloc; size_t size = 5; auto old_strs = alloc.allocate(size); for(size_t i = 0; i < size; i++) { alloc.construct(old_strs + i, "abcde"); } std::cout<<"old_strs[0]: "<<old_strs[0]<<std::endl; auto new_strs = alloc.allocate(size); for(size_t i = 0; i < size; i++) { alloc.construct(new_strs + i, std::move(*(old_strs + i))); } std::cout<<"new_strs[0]: "<<new_strs[0]<<std::endl; std::cout<<"old_strs[0]: "<<old_strs[0]<<std::endl; for(size_t i = 0; i < size; i++) { alloc.destroy(old_strs + i); } alloc.deallocate(old_strs, size); std::cout<<"test move constructor done.\n"<<std::endl; std::cout<<"test rvalue reference:\n"; int j = 42; int &lr = j; //int &&rr = j; // Wrong. Can't bind a rvalue ref to a lvalue. //int &lr2 = i * 42; // Wrong. Can't bind a lvalue ref to a rvalue. const int &lr3 = j * 42; int &&rr2 = j * 42; //int &&rr3 = rr2; // Wrong. rr2 is a rvalue ref and rvalue ref is a lvalue. int &lr4 = rr2; std::cout<<j<<'\t'<<lr<<'\t'<<lr3<<'\t'<<rr2<<'\t'<<lr4<<std::endl; std::cout<<"test rvalue ref done.\n"<<std::endl; std::cout<<"test std::move:\n"; std::string str5 = "asdf"; std::string &lr5 = str5; std::string &&rr5 = std::move(str5); rr5[0] = 'b'; lr5[1] = 'z'; std::cout<<rr5<<'\t'<<lr5<<'\t'<<str5<<std::endl; std::cout<<"test std::move done.\n"<<std::endl; std::cout<<"test custom move copy constructor/move assign operator.\n"; IntVec iv1(10); for(size_t i = 0; i < 5; i++) iv1.push_back(i); std::cout<<"-------iv1:\n"; iv1.print_info(); IntVec iv2(std::move(iv1)); std::cout<<"-------iv2:\n"; iv2.print_info(); std::cout<<"-------iv1:\n"; iv1.print_info(); IntVec iv3 = iv2; std::cout<<"-------iv3:\n"; iv3.print_info(); std::cout<<"-------iv2:\n"; iv2.print_info(); IntVec iv4(5); std::cout<<"-------iv4:\n"; iv4.print_info(); iv4 = std::move(iv2); std::cout<<"-------iv4:\n"; iv4.print_info(); std::cout<<"-------iv2:\n"; iv2.print_info(); std::cout<<"test custom move copy constructor/move assign operator done.\n"<<std::endl; std::cout<<"test move iterator:\n"; auto new_strs2 = alloc.allocate(size); std::uninitialized_copy(std::make_move_iterator(new_strs), std::make_move_iterator(new_strs + size), new_strs2); std::cout<<"new_strs[0]: "<<new_strs[0]<<std::endl; std::cout<<"new_strs2[0]: "<<new_strs2[0]<<std::endl; for(size_t i = 0; i < size; i++) { alloc.destroy(new_strs + i); } alloc.deallocate(new_strs, size); std::cout<<"test move iterator done.\n"<<std::endl; std::cout<<"test ref folding:\n"; int val = 2; int &lref = val; int &&rref = 2; std::cout<<"-------with val:\n"; vague_func(2); std::cout<<"-------with lref:\n"; vague_func(lref); std::cout<<"-------with rref:\n"; vague_func(rref); vague_func(std::move(val)); std::cout<<"test ref done.\n"<<std::endl; std::cout<<"test forward:\n"; forward_func(f, 5); forward_func(g, rref); forward_func(g, val); std::cout<<"test forward done.\n"<<std::endl; }