static int8_t handle_init() { ker_permanent_timer_init((&st.tou_timer), KER_DFT_LOADER_PID, TOU_TID, TIMER_ONE_SHOT); ker_permanent_timer_init((&st.tran_timer), KER_DFT_LOADER_PID, TRAN_TID, TIMER_ONE_SHOT); ker_permanent_timer_init((&st.data_timer), KER_DFT_LOADER_PID, DATA_TID, TIMER_ONE_SHOT); st.net_state = MAINTAIN; st.tran_count = 0; st.data_count = 0; st.blocked = 0; st.recent_neighbor = 0; st.version_data = ker_malloc(sizeof(msg_version_data_t), KER_DFT_LOADER_PID); if(st.version_data == NULL) return -ENOMEM; memset((uint8_t *) st.version_data, 0, sizeof(msg_version_data_t)); /* * Use default version to be 1 so that loader_pc can probe loaded data */ st.version_data->version = 1; restartInterval( 0 ); return SOS_OK; }
/************************************************************************* * Initiate the radio and mac * *************************************************************************/ void mac_init() { Radio_Init(); #ifdef RADIO_CHANNEL Radio_Set_Channel(RADIO_CHANNEL); #else Radio_Set_Channel(13); #endif #ifdef SOS_USE_PREEMPTION ker_register_module(sos_get_header_address(mod_header)); #else sched_register_kernel_module(&vmac_module, sos_get_header_address(mod_header), NULL); #endif // Timer needs to be done after reigsteration ker_permanent_timer_init(&wakeup_timer, RADIO_PID, WAKEUP_TIMER_TID, TIMER_ONE_SHOT); mq_init(&vmac_pq); //! Initialize sending queue resetSeq(); //set seq_count 0 resetRetries(); //set retries 0 //enable interrupt for receiving data Radio_SetPackRecvedCallBack(_MacRecvCallBack); Radio_Enable_Interrupt(); }
static int8_t fetcher_handler(void *state, Message *msg) { switch (msg->type) { case MSG_FETCHER_FRAGMENT: { fetcher_fragment_t *f; f = (fetcher_fragment_t*)msg->data; f->key = entohs( f->key ); f->frag_id = entohs(f->frag_id); DEBUG_PID(KER_FETCHER_PID,"MSG_FETCHER_FRAGMENT:\n"); handle_overheard_fragment(msg); if(fst == NULL) { DEBUG_PID(KER_FETCHER_PID, "NO Request!!!\n"); return SOS_OK; //!< no request } //DEBUG_PID(KER_FETCHER_PID,"calling restart_request_timer()\n"); restart_request_timer(); fst->retx = 0; //DEBUG_PID(KER_FETCHER_PID,"calling handle_data()\n"); return handle_data(msg); } case MSG_FETCHER_REQUEST: { fetcher_bitmap_t *bmap = (fetcher_bitmap_t *) msg->data; bmap->key = entohs( bmap->key ); //! received request from neighbors DEBUG("handling request to %d from %d\n", msg->daddr, msg->saddr); if(msg->daddr == ker_id()) { return handle_request(msg); } if(fst == NULL) return SOS_OK; //!< no request restart_request_timer(); fst->retx = 0; return SOS_OK; } case MSG_TIMER_TIMEOUT: { MsgParam *params = (MsgParam*)(msg->data); if(params->byte == FETCHER_REQUEST_TID) { //DEBUG("request timeout\n"); if( no_mem_retry ) { send_fetcher_done(); return SOS_OK; } handle_request_timeout(); } else if(params->byte == FETCHER_TRANSMIT_TID) { //DEBUG("send fragment timeout\n"); if( send_state.num_msg_in_queue < FETCHER_MAX_MSG_IN_QUEUE ) { send_fragment(); } } return SOS_OK; } case MSG_PKT_SENDDONE: { if( send_state.num_msg_in_queue > 0 ) { send_state.num_msg_in_queue--; } return SOS_OK; } #ifdef SOS_HAS_EXFLASH case MSG_EXFLASH_WRITEDONE: { ker_free(send_state.fragr); send_state.fragr = NULL; check_map_and_post(); return SOS_OK; } case MSG_EXFLASH_READDONE: { post_auto(KER_FETCHER_PID, KER_FETCHER_PID, MSG_FETCHER_FRAGMENT, sizeof(fetcher_fragment_t), send_state.frag, SOS_MSG_RELEASE, send_state.dest); send_state.frag = NULL; return SOS_OK; } #endif case MSG_INIT: { send_state.map = NULL; send_state.frag = NULL; send_state.fragr = NULL; send_state.num_msg_in_queue = 0; ker_msg_change_rules(KER_FETCHER_PID, SOS_MSG_RULES_PROMISCUOUS); ker_permanent_timer_init(&(send_state.timer), KER_FETCHER_PID, FETCHER_TRANSMIT_TID, TIMER_REPEAT); ker_timer_init(KER_FETCHER_PID, FETCHER_REQUEST_TID, TIMER_ONE_SHOT); return SOS_OK; } } return -EINVAL; }