Beispiel #1
0
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
	}
}
Beispiel #2
0
//-----------------------------------------------------
//处理接收到的数据
//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;	
}
Beispiel #4
0
/* 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 );
    }
}