예제 #1
0
//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

}
예제 #3
0
//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;

}
예제 #4
0
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;
    }
}