static hal_result_t s_cmd_set_curr_tare(uint8_t *data_in, uint8_t *data_out, uint8_t *len_data_out) // CAN_CMD_SET_CURR_TARE { hal_result_t res = hal_res_OK; int16_t sender_status; adc_state_t adc_st; //****************************************************************************** //********************* IMPORTANTE*********************************************** //ferma la spediziobne di messaggi perchè la current tare è coinvolta nei calcoli sender_status = sender_is_running(); sender_stop(); switch(data_in[1]) { case 0: { calc_current_tare_init(); } break; case 1: { /* In this case I must stop adc because new tare values depend on adc values.*/ adc_st = adc_is_running(); adc_stop(); calc_current_tare_reset(); if(adc_st_started == adc_st) { adc_start(); } } break; case 2: { res = calc_current_tare_set_value(data_in[2], (data_in[3]<<8 | data_in[4])); } break; #warning -> acemor: nei default si devono mettere i break. default: { res = hal_res_NOK_wrongparam; } break; } if(sender_status) { sender_start(); } if(hal_res_OK != res) { return(hal_res_NOK_wrongparam); } *len_data_out = 0; return(res); }
static hal_result_t s_cmd_set_can_data_rate(uint8_t *data_in, uint8_t *data_out, uint8_t *len_data_out) // CAN_CMD_SET_CANDATARATE: // set datarate for transmission in milliseconds { uint16_t sender_status; if( (data_in[1] < 1) || (data_in[1] > 210) ) //Todo: rivedere tempo massimo { return(hal_res_NOK_wrongparam); } parser_data.ee_data_is_saved = 0; sender_status = sender_is_running(); sender_stop(); CFG_6SG_EEDATA.can_msg_datarate = data_in[1]; #ifdef _TIMER_HW_ sender_config_datarate(); #endif if(sender_status) { sender_start(); } *len_data_out = 0; return(hal_res_OK); }
static hal_result_t s_cmd_set_matrix_rc(uint8_t *data_in, uint8_t *data_out, uint8_t *len_data_out) // CAN_CMD_SET_MATRIX_RC: //set i,j value of transform. matrix: { int16_t sender_status; if( (data_in[1] >= AN_CHANNEL_NUM) || (data_in[2] >= AN_CHANNEL_NUM) ) { return(hal_res_NOK_wrongparam); } parser_data.ee_data_is_saved = 0; sender_status = sender_is_running(); sender_stop(); CFG_6SG_EEDATA.tr_matrix[data_in[1]][data_in[2]] = data_in[3]<<8 | data_in[4]; if(sender_status) { sender_start(); } *len_data_out = 0; return(hal_res_OK); }
static hal_result_t s_cmd_set_tx_mode(uint8_t *data_in, uint8_t *data_out, uint8_t *len_data_out) // CAN_CMD_SET_TXMODE: // set continuous or on demand tx 0x205 len 2 data 7 0/1 { sender_stop(); adc_stop(); switch(data_in[1]) { case 0://transmit calibrated data { CFG_6SG_BEHAV.tx_outMsg_mode = tx_outMsg_torqueData_on; s_tx_mode_check(); adc_start(); sender_start(); } break; case 1: //do acquisition, but do not transmit { CFG_6SG_BEHAV.tx_outMsg_mode = tx_outMsg_readOnly; adc_start(); } break; case 2: //debug mode { CFG_6SG_BEHAV.tx_outMsg_mode = tx_outMsg_off; } break; case 3: //TODO: transmit not calibrated data { CFG_6SG_BEHAV.tx_outMsg_mode = tx_outMsg_uncalibData_on; sendAmsg = 1; sendBmsg = 1; adc_start(); sender_start(); } break; case 4: //TODO: transmit calibrated and not calibrated { } break; } *len_data_out = 0; return(hal_res_OK); }
void allocator_stop_senders(struct allocator *allocator) { struct le *le; if (!allocator) return; tmr_cancel(&allocator->tmr_ui); tmr_cancel(&allocator->tmr_pace); for (le = allocator->allocl.head; le; le = le->next) { struct allocation *alloc = le->data; sender_stop(alloc->sender); } }
static hal_result_t s_cmd_set_calib_tare(uint8_t *data_in, uint8_t *data_out, uint8_t *len_data_out) // CAN_CMD_SET_CALIB_TARE: { uint8_t i; int16_t ch_values[AN_CHANNEL_NUM]; hal_result_t res = hal_res_OK; int16_t sender_status; adc_state_t adc_st; sender_status = sender_is_running(); sender_stop(); switch(data_in[1]) { case 0: { memset( CFG_6SG_EEDATA.calibration_tare, 0, (sizeof(uint16_t)*AN_CHANNEL_NUM) ); } break; case 1: { adc_st =adc_is_running(); adc_stop(); adc_get_data(ch_values); ; if(adc_st_started == adc_st) { adc_start(); } for (i=0; i<AN_CHANNEL_NUM; i++) { CFG_6SG_EEDATA.calibration_tare[i]= -(ch_values[i]); } } break; case 2: { if(data_in[2] >= AN_CHANNEL_NUM) { res= hal_res_NOK_wrongparam; break; } CFG_6SG_EEDATA.calibration_tare[data_in[2]] = (data_in[3]<<8) | data_in[4]; } break; default: { res= hal_res_NOK_wrongparam; } break; } if(sender_status) { sender_start(); } if(hal_res_OK != res) { parser_data.ee_data_is_saved = 0; } *len_data_out = 0; return(res); }
static hal_result_t s_parse_can_loaderMsg(uint8_t *data_in, uint8_t *data_out, uint8_t *len_data_out) { uint8_t num_msg; static uint8_t addinfo_part=0; hal_can_frame_t frame; hal_result_t res = hal_res_OK; srcCode_version_info_t* src_ver_ptr = &(parser_data.SIXsg_config_ptr->gen_ee_data.verinfo); switch (data_in[0]) { #warning -> acemor: qui al CMD_BROADCAST si risponde con tre bytes: version, release, build mentre nel bootloader con due. ??? case CMD_BROADCAST: { CFG_6SG_BEHAV.tx_outMsg_mode = tx_outMsg_off; sender_stop(); adc_stop(); data_out[0] = CMD_BROADCAST; data_out[1] = BOARD_TYPE_6SG; data_out[2] = src_ver_ptr->exe_file.major; //Firmware version number for BOOTLOADER data_out[3] = src_ver_ptr->exe_file.minor; data_out[4] = 0; // data_out[4] = src_ver_ptr->exe_file.build; //Firmware build number. #warning VALE: --> cosa metto nel ver build??? *len_data_out = 5; } break; case CMD_BOARD: { hal_sys_systemreset(); //asm ("reset"); // Jump to bootloader code } break; case CMD_GET_ADDITIONAL_INFO: { frame.id = CAN_MSG_CLASS_LOADER | ( CFG_GEN_EEDATA.board_address << 4 ) | (0);; frame.id_type = hal_can_frameID_std; frame.frame_type = hal_can_frame_data; frame.size = 6; #warning -> acemor: cosa e' la additional info? sta nella parte rw comune sia a bootloader che ad applicazione? frame.data[0] = CMD_GET_ADDITIONAL_INFO; //since additional_info's length is 32 bytes and in each message write 4 bytes of additional_info, // i have to send 8 message for (num_msg = 0; num_msg< 8; num_msg++) { frame.data[1] = num_msg; memcpy(&frame.data[2], &CFG_6SG_EEDATA.additional_info[num_msg*4], 4); res = hal_can_put(hal_can_port1, &frame, hal_can_send_normprio_now); while(hal_res_NOK_busy == res) { res = hal_can_put(hal_can_port1, &frame, hal_can_send_normprio_now); } } *len_data_out = 255; } break; case CMD_SET_ADDITIONAL_INFO: { addinfo_part = data_in[1]; memcpy(&(CFG_6SG_EEDATA.additional_info[addinfo_part*4]), &data_in[2], 4); if (7 == addinfo_part) { addinfo_part=0; SIXsg_config_save_to_eeprom(parser_data.SIXsg_config_ptr); } else { addinfo_part++; } *len_data_out = 0; } break; default: { return(hal_res_NOK_wrongparam); } break; } //end switch return(res); }