//Recieved UART Xbee packet, send packet out over the radio void xbeeHandleTx(Payload uart_pld){ MacPacket tx_packet; WordVal dst_addr; Payload rx_pld; //char test; //Get destination address from uart_pld package //Frame ID and options packet are currently ignored for this type of packet... dst_addr.byte.HB = uart_pld->pld_data[DEST_ADDR_HB_POS - RX_DATA_OFFSET]; dst_addr.byte.LB = uart_pld->pld_data[DEST_ADDR_LB_POS - RX_DATA_OFFSET]; //test = dst_addr.byte.LB; //Create new packet with just the data that needs to be sent by the radio int payloadLength = payGetPayloadLength(uart_pld)-(RX_FRAME_OFFSET-RX_DATA_OFFSET)-PAYLOAD_HEADER_LENGTH-1; rx_pld = payCreateEmpty(payloadLength); //test = payGetPayloadLength(rx_pld); payAppendData(rx_pld, -PAYLOAD_HEADER_LENGTH, payGetPayloadLength(rx_pld), &(uart_pld->pld_data[RX_DATA_OFFSET])); //Place packet in radio queue for sending tx_packet = radioRequestPacket(payloadLength); tx_packet->payload = rx_pld; tx_packet->payload_length = payGetPayloadLength(rx_pld);//rx_pld_len.byte.LB - (RX_FRAME_OFFSET - RX_DATA_OFFSET); //tx_packet->dest_pan_id = src_pan_id; //Already set when macCreatePacket is called. tx_packet->dest_addr = dst_addr; radioEnqueueTxPacket(tx_packet); }
void trxWriteFrameBuffer(MacPacket packet) { unsigned int i; unsigned char phy_len; Payload pld; // Linearize contents in buffer i = 0; phy_len = packet->payload_length + MAC_HEADER_LENGTH + CRC_LENGTH; frame_buffer[i++] = phy_len; //packet->payload_length + MAC_HEADER_LENGTH + CRC_LENGTH; frame_buffer[i++] = packet->frame_ctrl.val.byte.LB; frame_buffer[i++] = packet->frame_ctrl.val.byte.HB; frame_buffer[i++] = packet->seq_num; frame_buffer[i++] = packet->dest_pan_id.byte.LB; frame_buffer[i++] = packet->dest_pan_id.byte.HB; frame_buffer[i++] = packet->dest_addr.byte.LB; frame_buffer[i++] = packet->dest_addr.byte.HB; frame_buffer[i++] = packet->src_addr.byte.LB; frame_buffer[i++] = packet->src_addr.byte.HB; pld = macGetPayload(packet); if(pld == NULL) { return; } memcpy(frame_buffer + i, payToString(pld), payGetPayloadLength(pld)); spic1BeginTransaction(); spic1Transmit(TRX_CMD_FW); spic1MassTransmit(phy_len, frame_buffer, phy_len*3); // 3*length microseconds timeout seems to work well }
//Recieved radio packet, send over UART void xbeeHandleRx(MacPacket packet) { int i; unsigned char checksum; unsigned char pld_len = payGetPayloadLength(packet->payload); unsigned char* pld_str = payToString(packet->payload); unsigned char xb_frame_len = pld_len + XB_OVERHEAD_LENGTH; WordVal src_addr = packet->src_addr; dmaTxReady = 0; checksum = XB_API_ID; checksum += src_addr.byte.HB; checksum += src_addr.byte.LB; //CRITICAL_SECTION_START txBufferA[0] = XB_RX_START; //Start Byte txBufferA[1] = 0x00; //Length High Byte txBufferA[2] = xb_frame_len; //Length Low Byte txBufferA[3] = XB_API_ID; //API Identifier - Currently only support the RX type txBufferA[4] = src_addr.byte.HB; //Source Address High byte txBufferA[5] = src_addr.byte.LB; //Source Address Low Byte txBufferA[6] = radioGetLastRSSI(); //'RSSI' Not currently implemented txBufferA[7] = 0x00; //'Options' Not currently implemented for(i = 0; i < pld_len; i++) { checksum += pld_str[i]; txBufferA[RX_FRAME_OFFSET + i] = pld_str[i]; } txBufferA[RX_FRAME_OFFSET + pld_len] = 0xFF - checksum; //set Checksum byte //CRITICAL_SECTION_END // pld_len + RX_FRAME_OFFSET + length(CHKSUM) - 1 DMA6CNT = pld_len + RX_FRAME_OFFSET; DMA6CONbits.CHEN = 1; DMA6REQbits.FORCE = 1; }
void xbeeHandleAt(Payload rx_pld) { unsigned char frame; unsigned char length; // unsigned char test; //This should really be some sort of dynamic queue to be generalized unsigned char bytes[10]; //unsigned short int command; WordVal command; WordVal data; length = payGetPayloadLength(rx_pld); frame = rx_pld->pld_data[0]; //test = rx_pld->pld_data[1]; //test = rx_pld->pld_data[2]; /* command = rx_pld->pld_data[1]; command = command << 8; command = command + rx_pld->pld_data[2]; */ command.byte.HB = rx_pld->pld_data[1]; command.byte.LB = rx_pld->pld_data[2]; switch (command.val) { case AT_CHANNEL: if (length != 3) { radioSetChannel(rx_pld->pld_data[3]); } if (frame != 0) { bytes[0] = radioGetChannel(); xbeeHandleATR(frame, command, bytes, 1); } break; case AT_PAN_ID: if (length != 3) { data.byte.HB = rx_pld->pld_data[3]; data.byte.LB = rx_pld->pld_data[4]; radioSetSrcPanID(data.val); } if (frame != 0) { data.val = (unsigned int)radioGetSrcPanID(); bytes[0] = data.byte.HB; bytes[1] = data.byte.LB; xbeeHandleATR(frame, command, bytes, 2); } break; case AT_SRC_ADR: if (length != 3) { data.byte.HB = rx_pld->pld_data[3]; data.byte.LB = rx_pld->pld_data[4]; radioSetSrcAddr(data.val); } if (frame != 0) { data.val = radioGetSrcAddr(); bytes[0] = data.byte.HB; bytes[1] = data.byte.LB; xbeeHandleATR(frame, command, bytes, 2); } break; case AT_ACK_LAST: if (frame != 0) { bytes[0] = 0; bytes[1] = trxGetLastACKd(); xbeeHandleATR(frame, command, bytes, 2); } break; case AT_SNIFFER: if (length != 3) trxSetPromMode(rx_pld->pld_data[3]); //Put radio in sniffer mode break; } }