void rt_timer() { OpenQueueEntry_t* pkt; error_t outcome; uint8_t numOptions; uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; // create a CoAP RD packet pkt = openqueue_getFreePacketBuffer(COMPONENT_RT); if (pkt==NULL) { openserial_printError(COMPONENT_RT,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(pkt); return; } // take ownership over that packet pkt->creator = COMPONENT_RT; pkt->owner = COMPONENT_RT; // CoAP payload (2 bytes of temperature data) packetfunctions_reserveHeaderSize(pkt,2); sensitive_accel_temperature_get_measurement(&rawdata[0]); pkt->payload[0] = rawdata[8]; pkt->payload[1] = rawdata[9]; numOptions = 0; // location-path option packetfunctions_reserveHeaderSize(pkt,sizeof(rt_path0)-1); memcpy(&pkt->payload[0],&rt_path0,sizeof(rt_path0)-1); packetfunctions_reserveHeaderSize(pkt,1); pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | sizeof(rt_path0)-1; numOptions++; // content-type option packetfunctions_reserveHeaderSize(pkt,2); pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | 1; pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; numOptions++; // metadata pkt->l4_destination_port = WKP_UDP_COAP; pkt->l3_destinationAdd.type = ADDR_128B; memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); // send outcome = opencoap_send(pkt, COAP_TYPE_NON, COAP_CODE_REQ_PUT, numOptions, &rt_vars.desc); // avoid overflowing the queue if fails if (outcome==E_FAIL) { openqueue_freePacketBuffer(pkt); } return; }
void cexample_task_cb() { OpenQueueEntry_t* pkt; owerror_t outcome; uint8_t numOptions; uint8_t i; uint16_t x_int = 0; uint16_t sum = 0; uint16_t avg = 0; uint8_t N_avg = 10; // don't run if not synch if (ieee154e_isSynch() == FALSE) return; // don't run on dagroot if (idmanager_getIsDAGroot()) { opentimers_stop(cexample_vars.timerId); return; } for (i = 0; i < N_avg; i++) { sum += x_int; } avg = sum/N_avg; // create a CoAP RD packet pkt = openqueue_getFreePacketBuffer(COMPONENT_CEXAMPLE); if (pkt==NULL) { openserial_printError( COMPONENT_CEXAMPLE, ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0 ); openqueue_freePacketBuffer(pkt); return; } // take ownership over that packet pkt->creator = COMPONENT_CEXAMPLE; pkt->owner = COMPONENT_CEXAMPLE; // CoAP payload packetfunctions_reserveHeaderSize(pkt,PAYLOADLEN); for (i=0;i<PAYLOADLEN;i++) { pkt->payload[i] = i; } avg = openrandom_get16b(); pkt->payload[0] = (avg>>8)&0xff; pkt->payload[1] = (avg>>0)&0xff; numOptions = 0; // location-path option packetfunctions_reserveHeaderSize(pkt,sizeof(cexample_path0)-1); memcpy(&pkt->payload[0],&cexample_path0,sizeof(cexample_path0)-1); packetfunctions_reserveHeaderSize(pkt,1); pkt->payload[0] = ((COAP_OPTION_NUM_URIPATH) << 4) | (sizeof(cexample_path0)-1); numOptions++; // content-type option packetfunctions_reserveHeaderSize(pkt,2); pkt->payload[0] = (COAP_OPTION_NUM_CONTENTFORMAT << 4) | 1; pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; numOptions++; // metadata pkt->l4_destination_port = WKP_UDP_COAP; pkt->l3_destinationAdd.type = ADDR_128B; memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); // send outcome = opencoap_send( pkt, COAP_TYPE_NON, COAP_CODE_REQ_PUT, numOptions, &cexample_vars.desc ); // avoid overflowing the queue if fails if (outcome==E_FAIL) { openqueue_freePacketBuffer(pkt); } return; }
/** \brief Called back from scheduler, when a task must be executed. */ void csensors_task_cb(void) { OpenQueueEntry_t* pkt; owerror_t outcome; uint8_t id; coap_option_iht options[3]; id = csensors_vars.cb_list[csensors_vars.cb_get]; // create a CoAP RD packet pkt = openqueue_getFreePacketBuffer(COMPONENT_CSENSORS); if (pkt==NULL) { openserial_printError( COMPONENT_CSENSORS, ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0 ); return; } // take ownership over that packet pkt->creator = COMPONENT_CSENSORS; pkt->owner = COMPONENT_CSENSORS; // CoAP payload csensors_fillpayload(pkt,id); // location-path0 option options[0].type = COAP_OPTION_NUM_URIPATH; options[0].length = sizeof(csensors_path0) - 1; options[0].pValue = (uint8_t*)csensors_path0; // location-path1 option options[1].type = COAP_OPTION_NUM_URIPATH; options[1].length = csensors_vars.csensors_resource[id].desc.path1len; options[1].pValue = csensors_vars.csensors_resource[id].desc.path1val; // content format option csensors_vars.medType = COAP_MEDTYPE_APPOCTETSTREAM; options[2].type = COAP_OPTION_NUM_CONTENTFORMAT; options[2].length = 1; options[2].pValue = &csensors_vars.medType; // metadata pkt->l4_destination_port = WKP_UDP_COAP; pkt->l3_destinationAdd.type = ADDR_128B; memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_ringmaster,16); // send outcome = opencoap_send( pkt, COAP_TYPE_NON, COAP_CODE_REQ_PUT, 2, // token len options, 3, // options len &csensors_vars.csensors_resource[id].desc ); // avoid overflowing the queue if fails if (outcome==E_FAIL) { openqueue_freePacketBuffer(pkt); } else { csensors_vars.cb_get = (csensors_vars.cb_get+1)%CSENSORSTASKLIST; } return; }
void rex_task_cb() { OpenQueueEntry_t* pkt; error_t outcome; uint8_t numOptions; uint8_t i; uint16_t x_int = 0; uint16_t* p_x_int = &x_int; uint16_t sum = 0; uint16_t avg = 0; uint8_t N_avg = 10; for (int i = 0; i < N_avg; i++) { ADC_getvoltage(p_x_int); sum += x_int; } avg = sum/N_avg; // create a CoAP RD packet pkt = openqueue_getFreePacketBuffer(COMPONENT_REX); if (pkt==NULL) { openserial_printError(COMPONENT_REX,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(pkt); return; } // take ownership over that packet pkt->creator = COMPONENT_REX; pkt->owner = COMPONENT_REX; // CoAP payload packetfunctions_reserveHeaderSize(pkt,PAYLOADLEN); for (i=0;i<PAYLOADLEN;i++) { pkt->payload[i] = i; } avg = openrandom_get16b(); pkt->payload[0] = (avg>>8)&0xff; pkt->payload[1] = (avg>>0)&0xff; numOptions = 0; // location-path option packetfunctions_reserveHeaderSize(pkt,sizeof(rex_path0)-1); memcpy(&pkt->payload[0],&rex_path0,sizeof(rex_path0)-1); packetfunctions_reserveHeaderSize(pkt,1); pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | sizeof(rex_path0)-1; numOptions++; // content-type option packetfunctions_reserveHeaderSize(pkt,2); pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | 1; pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; numOptions++; // metadata pkt->l4_destination_port = WKP_UDP_COAP; pkt->l3_destinationORsource.type = ADDR_128B; memcpy(&pkt->l3_destinationORsource.addr_128b[0],&ipAddr_motesEecs,16); // send outcome = opencoap_send(pkt, COAP_TYPE_NON, COAP_CODE_REQ_PUT, numOptions, &rex_vars.desc); // avoid overflowing the queue if fails if (outcome==E_FAIL) { openqueue_freePacketBuffer(pkt); } return; }
void table_update_task_cb() { OpenQueueEntry_t* pkt; owerror_t outcome; // don't run if not synch if (ieee154e_isSynch() == FALSE ) return; // don't run on dagroot if (idmanager_getIsDAGroot()) { opentimers_stop(table_update_vars.timerId); return; } // create a CoAP RD packet pkt = openqueue_getFreePacketBuffer(COMPONENT_TABLE_UPDATE); if (pkt==NULL) { openserial_printError( COMPONENT_TABLE_UPDATE, ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0 ); openqueue_freePacketBuffer(pkt); return; } // take ownership over that packet pkt->creator = COMPONENT_TABLE_UPDATE; pkt->owner = COMPONENT_TABLE_UPDATE; // CoAP payload packetfunctions_reserveHeaderSize(pkt,PAYLOADLEN); //construct packet int index = 0; pkt->payload[index++] = 255;//1 pkt->payload[index++] = action;//2 //pkt->payload[index++] = count++; pkt->payload[index++] = i;//3 //used pkt->payload[index++] = tableEntry->neighborEntry.used;//4 //parentRef pkt->payload[index++] = tableEntry->neighborEntry.parentPreference;//5 //stableNeighbor pkt->payload[index++] = tableEntry->neighborEntry.stableNeighbor;//6 //switchStability pkt->payload[index++] = tableEntry->neighborEntry.switchStabilityCounter;//7 //address type pkt->payload[index++] = tableEntry->neighborEntry.addr_64b.type;//8 // the address itself open_addr_t addr =tableEntry->neighborEntry.addr_64b;//16 memcpy(&pkt->payload[index],&addr.addr_64b,8); index = index+8; //dagrank pkt->payload[index++] = tableEntry->neighborEntry.DAGrank;//17 //rssi pkt->payload[index] = tableEntry->neighborEntry.rssi;//19 index = index+2; //numRx pkt->payload[index++] = tableEntry->neighborEntry.numRx;//20 //numTx pkt->payload[index++] = tableEntry->neighborEntry.numTx;//21 //numTxACK pkt->payload[index++] = tableEntry->neighborEntry.numTxACK;//22 //numWraps pkt->payload[index++] = tableEntry->neighborEntry.numWraps;//23 //asn pkt->payload[index++] = tableEntry->neighborEntry.asn.byte4;//24 pkt->payload[index] = tableEntry->neighborEntry.asn.bytes2and3;//26 index = index+2; pkt->payload[index] = tableEntry->neighborEntry.asn.bytes0and1;//28 index = index+2; //joinPrio pkt->payload[index] = tableEntry->neighborEntry.joinPrio;//29 // metadata pkt->l4_destination_port = WKP_UDP_COAP; pkt->l3_destinationAdd.type = ADDR_128B; //uint8_t* DODAGID = get_icmpv6rpl_vars()->dio.DODAGID; uint8_t manager_full_address[16]; // retrieve my prefix and EUI64 memcpy(&manager_full_address[0],idmanager_getMyID(ADDR_PREFIX)->prefix,8); // prefix memcpy(&manager_full_address[8],&manager_address,8); // manager address memcpy(&pkt->l3_destinationAdd.addr_128b[0],&manager_full_address,16); //free some memory free(tableEntry); // send outcome = opencoap_send( pkt, COAP_TYPE_NON, COAP_CODE_RESP_CONTENT, 1, &table_update_vars.desc ); // avoid overflowing the queue if fails if (outcome==E_FAIL) { openqueue_freePacketBuffer(pkt); } return; }
void rreg_timer() { OpenQueueEntry_t* pkt; uint8_t temp8b; error_t outcome; uint8_t numOptions; // create a CoAP RD packet pkt = openqueue_getFreePacketBuffer(COMPONENT_RREG); if (pkt==NULL) { openserial_printError(COMPONENT_RREG,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(pkt); return; } // take ownership over that packet pkt->creator = COMPONENT_RREG; pkt->owner = COMPONENT_RREG; // CoAP payload opencoap_writeLinks(pkt); numOptions = 0; // URI-query packetfunctions_reserveHeaderSize(pkt,sizeof(rreg_uriquery)-1+2); memcpy(&pkt->payload[0],&rreg_uriquery,sizeof(rreg_uriquery)-1); temp8b = idmanager_getMyID(ADDR_16B)->addr_16b[1]; pkt->payload[sizeof(rreg_uriquery)-1] = hexToAscii((temp8b>>4) & 0x0f); pkt->payload[sizeof(rreg_uriquery)-0] = hexToAscii((temp8b>>0) & 0x0f); packetfunctions_reserveHeaderSize(pkt,1); pkt->payload[0] = (COAP_OPTION_URIQUERY-COAP_OPTION_URIPATH) << 4 | sizeof(rreg_uriquery)-1+2; numOptions++; // URI-path packetfunctions_reserveHeaderSize(pkt,2); pkt->payload[0] = 'r'; pkt->payload[1] = 'd'; packetfunctions_reserveHeaderSize(pkt,1); pkt->payload[0] = (COAP_OPTION_URIPATH-COAP_OPTION_CONTENTTYPE) << 4 | 2; numOptions++; // add content-type option packetfunctions_reserveHeaderSize(pkt,2); pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | 1; pkt->payload[1] = COAP_MEDTYPE_APPLINKFORMAT; numOptions++; // metadata pkt->l4_destination_port = WKP_UDP_COAP; pkt->l3_destinationORsource.type = ADDR_128B; memcpy(&pkt->l3_destinationORsource.addr_128b[0],&ipAddr_ipsoRD,16); // send outcome = opencoap_send(pkt, COAP_TYPE_CON, COAP_CODE_REQ_POST, numOptions, &rreg_vars.desc); // avoid overflowing the queue if fails if (outcome==E_FAIL) { openqueue_freePacketBuffer(pkt); } return; }