Example #1
0
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); 
}  
Example #2
0
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);
}
Example #3
0
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);
}        
Example #4
0
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);
}
Example #5
0
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);
	}

}
Example #6
0
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);
}
Example #7
0
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);
}