Encountered another problem.
After I tested broadcast->response mechanic with 4 wixels, I continued developing with only 2.
Right now, only 1 wixel can reply to broadcast. Powering on more than 1 will result either in no packets recieved or recieving packet from one of them, usually one with strongest signal.
I do not understand where I have gone wrong:
typedef struct header
{
uint8 length;
char type;
uint8 senderID[4]; //
uint8 recipientID[4];
uint8 hops;
} header;
void transmitService()
{
header XDATA * txPacket;
static uint16 lastTx = 0;
if ((uint16)(getMs() - lastTx) >= param_report_period_ms && (txPacket = (header XDATA *) radioQueueTxCurrentPacket()))
{
lastTx = getMs();
memcpy(txPacket->senderID,serialNumber,4);
memcpy(txPacket->recipientID,serialNumber,4);
txPacket->length = sizeof(*txPacket);
printf("sending packet from:%02X-%02X-%02X-%02X to:%02X-%02X-%02X-%02X %5u",
txPacket->senderID[3],
txPacket->senderID[2],
txPacket->senderID[1],
txPacket->senderID[0],
txPacket->recipientID[3],
txPacket->recipientID[2],
txPacket->recipientID[1],
txPacket->recipientID[0],
(uint16)getMs()
);
(uint8) txPacket;
radioQueueTxSendPacket();
}
}
void respondToDiscovery(header XDATA * rxPacket)
{
static uint16 lastTx = 0;
header XDATA * txPacket;
// We recieved discovery packet.
// respond with our serial number
if (txPacket = (header XDATA *) radioQueueTxCurrentPacket())
{
lastTx = getMs();
memcpy(txPacket->senderID,serialNumber,4);
memcpy(txPacket->recipientID,rxPacket->senderID,4);
txPacket->type = 'i';
txPacket->length = sizeof(*txPacket);
, sizeof(uint8),sizeof(int));
printf("command: %c, length: %d, full length: %d \n\r",txPacket->type, 1, txPacket->length);
(uint8) txPacket;
radioQueueTxSendPacket();
}
}
uint8 compareID(uint8 * id1, uint8 * id2){
uint8 i;
for (i = 0; i < 4; i++)
{
if(id1[i] != id2[i])
{
return 0;
}
}
return 1;
}
void parse()
{
header XDATA * rxPacket;
if ((rxPacket = (header XDATA *)radioQueueRxCurrentPacket()) && usbComTxAvailable() >= 64)
{
printf("\n\rnew packet: \r\n from:%02X-%02X-%02X-%02X to:%02X-%02X-%02X-%02X\n\r length: %i type: %c \n\r =========================\n\r",
rxPacket->senderID[3],
rxPacket->senderID[2],
rxPacket->senderID[1],
rxPacket->senderID[0],
rxPacket->recipientID[3],
rxPacket->recipientID[2],
rxPacket->recipientID[1],
rxPacket->recipientID[0],
rxPacket->length,
rxPacket->type);
(uint8) rxPacket;
radioQueueRxDoneWithPacket();
if(compareID(rxPacket->senderID,rxPacket->recipientID) == 1){
printf("recieved broadcast\n\r");
// respond to a broadcast
printf("\n\r responding to: %02X-%02X-%02X-%02X \n\r",
rxPacket->senderID[3],
rxPacket->senderID[2],
rxPacket->senderID[1],
rxPacket->senderID[0]
);
respondToDiscovery(rxPacket);
}else if((compareID(rxPacket->recipientID,serialNumber) == 1)) {
printf("recieved broadcast packet");
}else{
printf("recieved responce from: %02X-%02X-%02X-%02X",
rxPacket->senderID[3],
rxPacket->senderID[2],
rxPacket->senderID[1],
rxPacket->senderID[0]
);
}
putchar('\r');
putchar('\n');
}
void getUSB(void)
{
if(usbComRxAvailable())
{
uint8 usbCommand = usbComRxReceiveByte();
switch(usbCommand){
case 'm':
toggleMasterMode();
if(global_master_mode == 1)
printf("mastermode activated, %i \n\r", global_master_mode);
else
printf("mastermode disabled, %i \n\r", global_master_mode);
//toggle mastermode
break;
case 'b':
initiateDiscovery();
break;
case 's':
printStatus();
break;
case 'p':
printRoutingTable();
break;
default:
break;
}
}
}
void main(void)
{
systemInit();
usbInit();
radioQueueInit();
while(1)
{
updateLeds();
boardService();
usbComService();
getUSB();
parse();
transmitService();
}
}
}
or pastebin for some easier to read highlighting: http://pastebin.com/kT6g1MmB
Am I not using the TxQueue correctly? It was my understanding that it should check the channel is open before transmitting. Or am I not processing the packets fast enough?
The exact behaviour is this:
1 remote wixel: perfect, 100% responce
2 remote wixesl: 30-40% of responce from 1, 60% no responce at all.