void openserial_handleCommands(void){ uint8_t input_buffer[20]; uint8_t numDataBytes; uint8_t commandId; uint8_t commandLen; uint8_t comandParam_8; uint16_t comandParam_16; uint8_t code,cellOptions,numCell,listOffset,maxListLen; uint8_t ptr; cellInfo_ht celllist_add[CELLLIST_MAX_LEN]; cellInfo_ht celllist_delete[CELLLIST_MAX_LEN]; open_addr_t neighbor; bool foundNeighbor; ptr = 0; memset(celllist_add,0,CELLLIST_MAX_LEN*sizeof(cellInfo_ht)); memset(celllist_delete,0,CELLLIST_MAX_LEN*sizeof(cellInfo_ht)); numDataBytes = openserial_getInputBufferFillLevel(); //copying the buffer openserial_getInputBuffer(&(input_buffer[ptr]),numDataBytes); ptr++; commandId = openserial_vars.inputBuf[ptr]; ptr++; commandLen = openserial_vars.inputBuf[ptr]; ptr++; switch(commandId) { case COMMAND_SET_EBPERIOD: comandParam_8 = openserial_vars.inputBuf[ptr]; sixtop_setEBPeriod(comandParam_8); // one byte, in seconds break; case COMMAND_SET_CHANNEL: comandParam_8 = openserial_vars.inputBuf[ptr]; // set communication channel for protocol stack ieee154e_setSingleChannel(comandParam_8); // one byte break; case COMMAND_SET_KAPERIOD: // two bytes, in slots comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); sixtop_setKaPeriod(comandParam_16); break; case COMMAND_SET_DIOPERIOD: // two bytes, in mili-seconds comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); icmpv6rpl_setDIOPeriod(comandParam_16); break; case COMMAND_SET_DAOPERIOD: // two bytes, in mili-seconds comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); icmpv6rpl_setDAOPeriod(comandParam_16); break; case COMMAND_SET_DAGRANK: // two bytes comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); icmpv6rpl_setMyDAGrank(comandParam_16); break; case COMMAND_SET_SECURITY_STATUS: // one byte comandParam_8 = openserial_vars.inputBuf[ptr]; ieee154e_setIsSecurityEnabled(comandParam_8); break; case COMMAND_SET_SLOTFRAMELENGTH: // two bytes comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); schedule_setFrameLength(comandParam_16); break; case COMMAND_SET_ACK_STATUS: comandParam_8 = openserial_vars.inputBuf[ptr]; ieee154e_setIsAckEnabled(comandParam_8); break; case COMMAND_SET_6P_ADD: case COMMAND_SET_6P_DELETE: case COMMAND_SET_6P_RELOCATE: case COMMAND_SET_6P_COUNT: case COMMAND_SET_6P_LIST: case COMMAND_SET_6P_CLEAR: // get preferred parent foundNeighbor =icmpv6rpl_getPreferredParentEui64(&neighbor); if (foundNeighbor==FALSE) { break; } // the following sequence of bytes are, slotframe, cellOption, numCell, celllist openserial_get6pInfo(commandId,&code,&cellOptions,&numCell,celllist_add,celllist_delete,&listOffset,&maxListLen,ptr,commandLen); sixtop_request( code, // code &neighbor, // neighbor numCell, // number cells cellOptions, // cellOptions celllist_add, // celllist to add celllist_delete, // celllist to delete (not used) msf_getsfid(), // sfid listOffset, // list command offset (not used) maxListLen // list command maximum celllist (not used) ); break; case COMMAND_SET_SLOTDURATION: comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); ieee154e_setSlotDuration(comandParam_16); break; case COMMAND_SET_6PRESPONSE: comandParam_8 = openserial_vars.inputBuf[ptr]; if (comandParam_8 ==1) { sixtop_setIsResponseEnabled(TRUE); } else { if (comandParam_8 == 0) { sixtop_setIsResponseEnabled(FALSE); } else { // security only can be 1 or 0 break; } } break; case COMMAND_SET_UINJECTPERIOD: comandParam_8 = openserial_vars.inputBuf[ptr]; msf_appPktPeriod(comandParam_8); break; case COMMAND_SET_ECHO_REPLY_STATUS: comandParam_8 = openserial_vars.inputBuf[ptr]; if (comandParam_8 == 1) { icmpv6echo_setIsReplyEnabled(TRUE); } else { if (comandParam_8 == 0) { icmpv6echo_setIsReplyEnabled(FALSE); } else { // ack reply break; } } break; case COMMAND_SET_JOIN_KEY: if (commandLen != 16) { break; } idmanager_setJoinKey(&openserial_vars.inputBuf[ptr]); break; default: // wrong command ID break; } }
void schedule_init() { uint8_t i; slotOffset_t running_slotOffset; open_addr_t temp_neighbor; // reset local variables memset(&schedule_vars,0,sizeof(schedule_vars_t)); for (i=0;i<MAXACTIVESLOTS;i++) { schedule_resetEntry(&schedule_vars.scheduleBuf[i]); } schedule_vars.backoffExponent = MINBE-1; memset(&schedule_dbg, 0,sizeof(schedule_dbg_t)); // set frame length schedule_setFrameLength(SUPERFRAME_LENGTH); // start at slot 0 running_slotOffset = 0; // advertisement slot(s) memset(&temp_neighbor,0,sizeof(temp_neighbor)); for (i=0;i<NUMADVSLOTS;i++) { schedule_addActiveSlot( running_slotOffset, // slot offset CELLTYPE_ADV, // type of slot FALSE, // shared? 0, // channel offset &temp_neighbor, // neighbor FALSE //no update but insert ); running_slotOffset++; } // shared TXRX anycast slot(s) memset(&temp_neighbor,0,sizeof(temp_neighbor)); temp_neighbor.type = ADDR_ANYCAST; for (i=0;i<NUMSHAREDTXRX;i++) { schedule_addActiveSlot( running_slotOffset, // slot offset CELLTYPE_TXRX, // type of slot TRUE, // shared? 0, // channel offset &temp_neighbor, // neighbor FALSE //no update but insert ); running_slotOffset++; } /* for (i=0;i<NUMSERIALRX-1;i++) { schedule_addActiveSlot( running_slotOffset, // slot offset CELLTYPE_MORESERIALRX, // type of slot FALSE, // shared? 0, // channel offset &temp_neighbor // neighbor ); running_slotOffset++; } */ /*if(NUMNODE == 0){//DAG ROOT // shared TXRX anycast slot(s) memset(&temp_neighbor,0,sizeof(temp_neighbor)); temp_neighbor.type = ADDR_ANYCAST; for (i=0;i<NUMRX;i++) { schedule_addActiveSlot( running_slotOffset, // slot offset CELLTYPE_RX, // type of slot FALSE, // shared? 0, // channel offset &temp_neighbor, // neighbor FALSE //no update but insert ); running_slotOffset++; } }else{//other node running_slotOffset += (NUMNODE-1); memset(&temp_neighbor,0,sizeof(temp_neighbor)); temp_neighbor.type = ADDR_ANYCAST; schedule_addActiveSlot( running_slotOffset, // slot offset CELLTYPE_TX, // type of slot FALSE, // shared? 0, // channel offset &temp_neighbor, // neighbor FALSE //no update but insert ); running_slotOffset++; }*/ // serial RX slot(s) memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot( running_slotOffset, // slot offset CELLTYPE_SERIALRX, // type of slot FALSE, // shared? 0, // channel offset &temp_neighbor, // neighbor FALSE //no update but insert ); running_slotOffset++; }
/* piggy902: addr-specific schedule */ void schedule_init() { uint8_t i; open_addr_t temp_neighbor; // reset local variables memset(&schedule_vars,0,sizeof(schedule_vars_t)); memset(&schedule_dbg, 0,sizeof(schedule_dbg_t)); for (i=0;i<MAXACTIVESLOTS;i++){ schedule_resetEntry(&schedule_vars.scheduleBuf[i]); } // set frame length schedule_setFrameLength(11); // slot 0 is advertisement slot i = 0; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_ADV, FALSE, 0, &temp_neighbor); switch(idmanager_getMyID(ADDR_16B)->addr_16b[1]){ case DEBUG_MOTEID_MASTER: // slot 1 is shared TXRX, but with specific neighbour rather than anycast i = 1; memset(&temp_neighbor,0,sizeof(temp_neighbor)); temp_neighbor.type = ADDR_64B; temp_neighbor.addr_64b[6] = 0xED; temp_neighbor.addr_64b[7] = DEBUG_MOTEID_2; schedule_addActiveSlot(i, CELLTYPE_TXRX, FALSE, 0, &temp_neighbor); // slot 2 is shared TXRX, but with specific neighbour rather than anycast i = 2; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_MORESERIALRX, FALSE, 0, &temp_neighbor); i = 3; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_MORESERIALRX, FALSE, 0, &temp_neighbor); break; case DEBUG_MOTEID_2: // slot 1 is shared TXRX, but with specific neighbour rather than anycast i = 1; memset(&temp_neighbor,0,sizeof(temp_neighbor)); temp_neighbor.type = ADDR_64B; temp_neighbor.addr_64b[6] = 0xED; temp_neighbor.addr_64b[7] = DEBUG_MOTEID_MASTER; schedule_addActiveSlot(i, CELLTYPE_TXRX, FALSE, 0, &temp_neighbor); i = 2; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_MORESERIALRX, FALSE, 0, &temp_neighbor); i = 3; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_MORESERIALRX, FALSE, 0, &temp_neighbor); break; default: break; } // slot 4 is SERIALRX i = 4; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_SERIALRX, FALSE, 0, &temp_neighbor); // slot 5 is MORESERIALRX i = 5; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_MORESERIALRX, FALSE, 0, &temp_neighbor); // Noise Floor Probe i = 6; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_NF, FALSE, 0, &temp_neighbor); i = 7; memset(&temp_neighbor,0,sizeof(temp_neighbor)); schedule_addActiveSlot(i, CELLTYPE_NF, FALSE, 0, &temp_neighbor); //for RPL DIOs? i = 8; memset(&temp_neighbor,0,sizeof(temp_neighbor)); temp_neighbor.type = ADDR_64B; temp_neighbor.addr_64b[0] = 0xff; temp_neighbor.addr_64b[1] = 0xff; temp_neighbor.addr_64b[2] = 0xff; temp_neighbor.addr_64b[3] = 0xff; temp_neighbor.addr_64b[4] = 0xff; temp_neighbor.addr_64b[5] = 0xff; temp_neighbor.addr_64b[6] = 0xff; temp_neighbor.addr_64b[7] = 0xff; schedule_addActiveSlot(i, CELLTYPE_TXRX, FALSE, 0, &temp_neighbor); }