Tuesday, July 26, 2011

Simple, but works.

This is a very simple text chat over the Nordic Radios. However, there seems to be transmission issues, even at small distances. Not impressed.


#include "Nrf2401.h"
#include

Nrf2401 Radio;
unsigned char SyncByte = 128;
long LastReceiveTime=0;
ByteBuffer CircularBuffer;
byte LastByte;
byte ByteReceived;
int Outstanding=0;

void setup(void)
{
Serial.begin(9600);
pinMode(13, OUTPUT);
// start the random number generator
randomSeed(analogRead(7));
// look for rising edges on digital pin 2
attachInterrupt(0, messageReceived, RISING);
CircularBuffer.init(25);
Serial.println("RC Ping");

Radio.dataRate=0;
Radio.power=3;
Radio.txMode(1);
delay(100);
Radio.rxMode(1);
delay(100);
}//End Setup


void loop(void)
{

if (Outstanding==1)
{
if ((millis()-LastReceiveTime)>5000)
{
Serial.println("Connection Timed Out.");
LastReceiveTime=millis();
Serial.print("Attempting to Re-Send: ");
Serial.println(LastByte);
SendPacket(LastByte);

}//End Check For Timeout
}//Outstanding Packet
else
{
if (Serial.available())
{
SendPacket(Serial.read());
}
}
messageReceived();
ParsePacket();
}//End Loop



void SendPacket(byte Data)
{
Radio.txMode(1);
delay(100);

if (Data!=0x00)
{
Outstanding=1;
LastReceiveTime=millis();
LastByte=Data;
}


//Serial.print("Sending: ");
//Serial.println(Data,BYTE);

Radio.write(Data);
delay(100);
Radio.rxMode(1);
}//End SendPacket






void ParsePacket()
{
if (CircularBuffer.getSize()>0)
{
ByteReceived=CircularBuffer.get();

//ACK Packet
if (ByteReceived==0x00)
{
Outstanding=0;
//Serial.println("Received ACK.");
}
else
{
//Send ACK
Serial.print(ByteReceived,BYTE);
delay(100);
SendPacket(0x00);
}
}
}//End ParsePacket

void messageReceived(void)
{
while(Radio.available())
{
Radio.read();
CircularBuffer.put(Radio.data[0]);
//Serial.print("Received:");
//Serial.println(CircularBuffer.peek(CircularBuffer.getSize()-1),BYTE);
LastReceiveTime=millis();
}
}//End messageReceived