int main(void) { mcusr_save = MCUSR; MCUSR = 0; wdt_disable(); if (!(mcusr_save & WDRF)) { seqnum = 0; } #ifdef SN_TEMP_DDR // configure pin for analog SN_TEMP_DDR &= ~SN_TEMP_MASK; // set as input SN_TEMP_PORT &= ~SN_TEMP_MASK; // pull-ups off DIDR0 |= SN_TEMP_MASK; // disable digital input buffer #endif SN_LED_DDR |= SN_LED_MASK; // set as output SN_LED_PORT &= ~SN_LED_MASK; vw_setup(); #ifdef SN_RX_CAPABLE vw_rx_start(); #endif for (int i=0;i<3;i++) { send_status(SN_ADDRESS_BROADCAST); vw_wait_tx(); } for (;;) { #ifdef SN_RX_CAPABLE if (vw_have_message()) { uint8_t len = sizeof(msg); if (vw_get_message((uint8_t *)&msg, &len)) { if (msg.header.destination == SN_ADDRESS_ME|| msg.header.destination == SN_ADDRESS_BROADCAST) { process_msg(); } else { // TODO - consider routing here } } else { // bad message } } #endif #ifdef SN_TX_CAPABLE // Process any outgoing stuff if (millis() - last_status > STATUS_PERIOD) { send_status(SN_ADDRESS_BROADCAST); } if (millis() - last_sensor_data > SENSOR_PERIOD) { send_sensor_data(SN_ADDRESS_BROADCAST); } #endif // SN_TX_CAPABLE #ifdef USE_MILLIS //set_sleep_mode(SLEEP_MODE_IDLE); //sleep_enable(); //sleep_cpu(); //sleep_disable(); #endif } }
//----------------------------------------------------- //处理接收到的数据 //return:1-收到命令正确;0-收到命令错误 void rece_dispatch() { uint8_t len=buffer[0]; uint8_t error=0;; if(buffer[1]!=0xfe || buffer[2]!=0x04 || (buffer[len]!=check_sum(&buffer[1],len-1)) ) { //收到错误命令回复 send_shakehand(0); } //解析命令 switch(buffer[3]) { case 0x01://确认命令 break; case 0x02://初始化flash存储区 flash_init(); break; case 0x03://收到时间设置命令 RTC_Set_datetime(&buffer[5]); RTC_AlarmConfig(buffer[8],buffer[9]+1); //SEGGER_RTT_printf(0,"set_time=%02d-%02d-%02d;%02d-%02d-%02d;\r\n",buffer[5],buffer[6],buffer[7],buffer[8],buffer[9],buffer[10]); break; case 0x04://step length sys_para.step_len=buffer[5]; sys_para.height=*(uint16_t *)(&buffer[6]); //flash_erase_para_sector(); break; case 0x05://return serial number send_version_info(); break; case 0x0a://模式切换 if(buffer[5]>0x03) error=1; else curr_mode=buffer[5]; break; case 0x06://read now sports data send_sensor_data(); break; case 0x09://中断批量传输 bat_upload=0; break; default: send_shakehand(0);//收到异常命令S return; }; SEGGER_RTT_printf(0,"rece comm=%x;\r\n",buffer[3]); if(buffer[3]!=0x01) { //回复确认收到 if(error==0) send_shakehand(1); else send_shakehand(0); } }
void run_commands(void) { if (send_now) send_response(); if (send_hk) send_housekeeping(); if (send_data) send_sensor_data(); if (msg_received) send_coms_packet(); if (read_response) send_read_response(); if (write_response) send_write_response(); if (set_sens_h) set_sensor_high(); if (set_sens_l) set_sensor_low(); if (set_varf) set_var(); if (new_tm_msgf) receive_tm_msg(); if (tc_packet_readyf) send_pus_packet_tc(); if (event_readyf) send_event(); if (ask_alive) send_ask_alive(); if (enter_low_powerf) enter_low_power(); if (exit_low_powerf) exit_low_power(); if (enter_take_overf) enter_take_over(); if (exit_take_overf) exit_take_over(); if (pause_operationsf) pause_operations(); if (resume_operationsf) resume_operations(); return; }
/* Processes COMM_SENSOR_DATA messages */ void process_sensor_data( const uint8_t *data, uint8_t size ) { static uint8_t delay = 0; /* notify that a new request has been received */ flag_new_request = 1; /* extract motor signals ID */ javiator_data.id = (data[ size-3 ] << 8) | data[ size-2 ]; /* update sensor status */ enable_sensors( data[ size-1 ] ); /* send sensor data to Robostix 1 */ send_sensor_data( ); if( ++delay % 10 == 0 ) { LED_TOGGLE( YELLOW ); } }