int8_t test_sensor_msg_handler(void *state, Message *msg) { test_sensor_state_t *s = (test_sensor_state_t *)state; switch (msg->type) { case MSG_INIT: { LED_DBG(LED_RED_OFF); LED_DBG(LED_GREEN_OFF); LED_DBG(LED_YELLOW_OFF); s->sequence = 0; s->ctx[0].delay = 0; // The sensors connected to the internal ADC use the ticks from the 32KHz clock s->ctx[0].period = 32768; // this is in ticks from a 32kHz clock s->ctx[0].samples = 0; // samples=0 means collect an infinite number of samples s->ctx[0].event_samples = 1; //event_samples=1 means send out one sample per buffer s->ctx[1].delay = 200; // the temperature sensor needs 200ms of warmup // The SHT1x sensors use the ticks from the 1024Hz SOS timer s->ctx[1].period = 512; // this is in ticks from the sos timer, e.g. 1024=1second s->ctx[1].samples = 64; s->ctx[1].event_samples = 32; s->ctx[2].delay = 0; // Module starts sampling when the user button is pressed if (sys_register_isr(PORT2_INTERRUPT, USER_INT_FID) == 0) { LED_DBG(LED_RED_TOGGLE); } break; } case MSG_TIMER_TIMEOUT: { break; } case MSG_DATA_READY: { size_t len = msg->len; sensor_data_msg_t *b = (sensor_data_msg_t *)sys_msg_take_data(msg); sys_post_uart(TEST_SENSOR_PID, 0x81, len, b, SOS_MSG_RELEASE, BCAST_ADDRESS); LED_DBG(LED_YELLOW_TOGGLE); break; } case MSG_FINAL: { sys_sensor_stop_sampling(LIGHT_PAR_SENSOR); sys_sensor_stop_sampling(TEMPERATURE_SENSOR); sys_deregister_isr(PORT2_INTERRUPT); //sys_timer_stop(0); break; } default: return -EINVAL; } return SOS_OK; }
static int8_t test_tpsn_net_module_handler(void *state, Message *msg) { app_state_t *s = (app_state_t *) state; MsgParam *p = (MsgParam*)(msg->data); switch (msg->type) { case MSG_INIT: { s->pid = msg->did; sys_register_isr(0, USERINT_FID); s->state = 0; // If master node, start the transmit_timer if(sys_id() == 0) sys_timer_start(TRANSMIT_TIMER, TRANSMIT_INTERVAL, TIMER_REPEAT); sys_led(LED_RED_OFF); sys_led(LED_GREEN_OFF); sys_led(LED_YELLOW_OFF); break; } case MSG_GLOBAL_TIME_REPLY: { msg_global_time_t* msg_global_time = (msg_global_time_t*)msg->data; s->time = msg_global_time->time; s->refreshed = msg_global_time->refreshed; sys_timer_start(DELAY_TIMER, sys_rand()%256, TIMER_ONE_SHOT); break; } case MSG_GLOBAL_TIME_SEND: { msg_global_time_send_t* datamsg = (msg_global_time_send_t*) sys_msg_take_data(msg); //sys_led(LED_YELLOW_TOGGLE); sys_post_uart(s->pid, MSG_GLOBAL_TIME_SEND, sizeof(msg_global_time_send_t), datamsg, SOS_MSG_RELEASE, BCAST_ADDRESS); break; } case MSG_TIMER_TIMEOUT: { switch(p->byte) { case TRANSMIT_TIMER: { if (s->state){ sys_led(LED_GREEN_OFF); SETBITLOW(P2OUT, 3); s->state = 0; } else { uint32_t timestamp; msg_global_time_send_t* msg_global_time_send; sys_led(LED_GREEN_ON); SETBITHIGH(P2OUT, 3); timestamp = sys_time32(); // Construct the packet and send it over uart msg_global_time_send = (msg_global_time_send_t*)sys_malloc(sizeof(msg_global_time_send_t)); msg_global_time_send->addr = sys_id(); msg_global_time_send->time = timestamp; msg_global_time_send->refreshed = 0; sys_post_uart(s->pid, MSG_GLOBAL_TIME_SEND, sizeof(msg_global_time_send_t), msg_global_time_send, SOS_MSG_RELEASE, BCAST_ADDRESS); s->state = 1; } break; } case DELAY_TIMER: { msg_global_time_send_t* msg_global_time_send = (msg_global_time_send_t*)sys_malloc(sizeof(msg_global_time_send_t)); sys_led(LED_GREEN_TOGGLE); msg_global_time_send->addr = sys_id(); msg_global_time_send->time = s->time; msg_global_time_send->refreshed = s->refreshed; sys_post_net(s->pid, MSG_GLOBAL_TIME_SEND, sizeof(msg_global_time_send_t), msg_global_time_send, SOS_MSG_RELEASE, 0); break; } } break; } default: return -EINVAL; } /** * Return SOS_OK for those handlers that have successfully been handled. */ return SOS_OK; }
void _start(void) { ticks = 0; sys_register_isr(36, &user_isr); while (1); }