bool MrimMessages::handlePacket(class MrimPacket& packet) { switch (packet.msgType()) { case MRIM_CS_MESSAGE_STATUS: handleMessageStatus(packet); break; case MRIM_CS_MESSAGE_ACK: handleMessageAck(packet); break; case MRIM_CS_OFFLINE_MESSAGE_ACK: handleOfflineMessageAck(packet); break; default: return false; } return true; }
__interrupt void USCI0RX_ISR(void) { unsigned int i, checksumHolder; //Look for delimiter if (UCA0RXBUF == XBEE_START_DELIMITER) { //Reset variables xbeeObject.bufferPosition = 0; xbeeObject.xbeeFrameType = 0; xbeeObject.xbeeMessageLength = 0; xbeeObject.xbeeSenderAddr = 0; xbeeObject.xbeeSenderNodeAddr = 0; } //if() //Check for gibberish (ie. No delimter yet, but we have characters) if (xbeeObject.bufferPosition == -1) { return; } //if() //Check for a full buffer if (xbeeObject.bufferPosition == MAX_XBEE_BUFFER_LEN) return; //Add data to buffer xbeeObject.bufferSpace[xbeeObject.bufferPosition] = UCA0RXBUF; xbeeObject.bufferPosition++; //Pull message length if (xbeeObject.bufferPosition == 3) { xbeeObject.xbeeMessageLength = (xbeeObject.bufferSpace[1] << 8) + xbeeObject.bufferSpace[2]; //Frame 1-2: Message Length } //if() //Check for end of message & handle it (necessary to prevent data overwrite) if (xbeeObject.bufferPosition == xbeeObject.xbeeMessageLength + 4) { //Prevent this message from being read again xbeeObject.bufferPosition = -1; //Calculate the checksum checksumHolder = 0; for(i=3; i<xbeeObject.xbeeMessageLength + 4; i++) { checksumHolder += xbeeObject.bufferSpace[i]; checksumHolder &= 0x00FF; } //for() //Check for invalid checksum if (checksumHolder != 0x00FF) return; xbeeObject.xbeeFrameType = xbeeObject.bufferSpace[3]; //Frame 3: Frame Type /* CAUTION -- SIGNIFICANT IN-LINE/NON-OPTIMAL CODE FOR NEXT BLOCK OF CODE */ //Handle any configuration messages if(xbeeObject.xbeeFrameType == AT_CMD_RESPONSE) { //Filter out response types if ((xbeeObject.bufferSpace[5] << 8) + xbeeObject.bufferSpace[6] == ATCMD_HP) { //Response with Preamble ID -- check to see if it's okay if (xbeeObject.bufferSpace[7] == 0x00) { //status OK //Okay, now send the next configuration for the Network ID /* Initialize network information #2 */ sendByte(0x7E); sendByte(0x00); sendByte(0x06); sendByte(0x09); sendByte(0xB6); sendByte(0x49); sendByte(0x44); sendByte(0x20); sendByte(0x14); sendByte(0x7F); } else { //Try sending the configuration message again /* Initialize network information */ sendByte(0x7E); sendByte(0x00); sendByte(0x05); sendByte(0x09); sendByte(0xB5); sendByte(0x48); sendByte(0x50); sendByte(0x04); sendByte(0xA5); } //if-else() } else if((xbeeObject.bufferSpace[5] << 8) + xbeeObject.bufferSpace[6] == ATCMD_ID) { //Response with Network ID -- check to see if it's okay if (xbeeObject.bufferSpace[7] == 0x00) { //status OK //Okay, now send the write command sendByte(0x7E); sendByte(0x00); sendByte(0x04); sendByte(0x09); sendByte(0xB7); sendByte(0x57); sendByte(0x52); sendByte(0x96); } else { //Try sending the configuration message again /* Initialize network information #2 */ sendByte(0x7E); sendByte(0x00); sendByte(0x06); sendByte(0x09); sendByte(0xB6); sendByte(0x49); sendByte(0x44); sendByte(0x20); sendByte(0x14); sendByte(0x7F); } //if-else() } else if((xbeeObject.bufferSpace[5] << 8) + xbeeObject.bufferSpace[6] == ATCMD_WR) { //Response with WR status -- check to see if it's okay if (xbeeObject.bufferSpace[7] == 0x00) { //status OK //Okay, now send the apply changes command sendByte(0x7E); sendByte(0x00); sendByte(0x04); sendByte(0x09); sendByte(0xB8); sendByte(0x41); sendByte(0x43); sendByte(0xBA); } else { //Try sending the write configuration message again sendByte(0x7E); sendByte(0x00); sendByte(0x04); sendByte(0x09); sendByte(0xB7); sendByte(0x57); sendByte(0x52); sendByte(0x96); } //if-else() } else if((xbeeObject.bufferSpace[5] << 8) + xbeeObject.bufferSpace[6] == ATCMD_AC) { //Response with AC status -- check to see if it's okay if (xbeeObject.bufferSpace[7] != 0x00) { //status not OK //Try sending the apply changes configuration message again sendByte(0x7E); sendByte(0x00); sendByte(0x04); sendByte(0x09); sendByte(0xB8); sendByte(0x41); sendByte(0x43); sendByte(0xBA); } //if-else() } //if-else() return; } else if (xbeeObject.xbeeFrameType != RX_INDICATOR) { //Not a configuration message and not a typical data message -- exit return; } //if-else() /* END IN-LINE CODING EYE SORE */ //Terminate the buffer (eliminates the checksum from the buffer in the process) xbeeObject.bufferSpace[xbeeObject.xbeeMessageLength + 3] = '\0'; xbeeObject.xbeeSenderAddr = xbeeObject.bufferSpace[4]; xbeeObject.xbeeSenderAddr <<= 8; xbeeObject.xbeeSenderAddr += xbeeObject.bufferSpace[5]; xbeeObject.xbeeSenderAddr <<= 8; xbeeObject.xbeeSenderAddr += xbeeObject.bufferSpace[6]; xbeeObject.xbeeSenderAddr <<= 8; xbeeObject.xbeeSenderAddr += xbeeObject.bufferSpace[7]; xbeeObject.xbeeSenderAddr <<= 8; xbeeObject.xbeeSenderAddr += xbeeObject.bufferSpace[8]; xbeeObject.xbeeSenderAddr <<= 8; xbeeObject.xbeeSenderAddr += xbeeObject.bufferSpace[9]; xbeeObject.xbeeSenderAddr <<= 8; xbeeObject.xbeeSenderAddr += xbeeObject.bufferSpace[10]; xbeeObject.xbeeSenderAddr <<= 8; xbeeObject.xbeeSenderAddr += xbeeObject.bufferSpace[11]; #if EXFIL_NODE //Activate LED P1OUT ^= BIT0;//Toggle LED xbeeObject.xbeeSenderNodeAddr = addXbee(xbeeObject.xbeeSenderAddr); if (xbeeObject.bufferSpace[RX_DATASTART] == NETWORK_NODE_REQ_INT) { addQueuedNode(xbeeObject.xbeeSenderNodeAddr, NULL); } else { //Is this xbee the next in line? if (!exfilObject.topExfilQueue || exfilObject.topExfilQueue->node_number != xbeeObject.xbeeSenderNodeAddr) { __no_operation(); return; } //if() //Is the radio busy? //if (!isHAMReady()) return; //If this branch is taken, a node is trying to send its // message twice. if (exfilObject.topExfilQueue->message) { return; } //if() //Copy the message into a buffer exfilObject.topExfilQueue->message = malloc(sizeof(char) * (strlen(&xbeeObject.bufferSpace[15]) + 1) ); strcpy(exfilObject.topExfilQueue->message, &xbeeObject.bufferSpace[15]); exfilObject.topExfilQueue->status = EXFIL_ACCEPT_ACK; /* //Add the message to the radio and reply if successful if (sendHAMString(exfilObject.topExfilQueue->message, xbeeObject.xbeeSenderNodeAddr)) { exfilObject.topExfilQueue->status = EXFIL_ACCEPT_ACK_SENT; } else { //Not successful, delete it exfilObject.topExfilQueue->status = EXFIL_FIN; } //if-else() */ } //if() #else //Check to make sure this message came from the exfil node if (xbeeObject.xbeeSenderAddr != EXFIL_XBEE_ADDR) return; switch(xbeeObject.bufferSpace[RX_DATASTART]) { case NETWORK_EX_REQ_ACK_INT: handleMessageReqAck(); break; case NETWORK_EX_APPROVAL_INT: handleMessageApproval(); break; case NETWORK_EX_MSG_ACK_INT: handleMessageAck(); break; default: break; } //switch() #endif } //if() } //USCI0RX_ISR()