summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmcauliffe <smcauliffe@cb376a5e-1013-0410-a455-b6b1f9ac8223>2006-11-25 10:59:40 +0000
committersmcauliffe <smcauliffe@cb376a5e-1013-0410-a455-b6b1f9ac8223>2006-11-25 10:59:40 +0000
commitd67548dceed1133c219dde7e8cba9bb2fb0c6620 (patch)
tree59fd5fad53c290ddcbf281f651519bc6af3389e0
parent397e43d92176dcc49a48db44296f4dd4276b35c2 (diff)
downloadreprap-backup-d67548dceed1133c219dde7e8cba9bb2fb0c6620.tar.gz
reprap-backup-d67548dceed1133c219dde7e8cba9bb2fb0c6620.zip
Progress commit
git-svn-id: https://reprap.svn.sourceforge.net/svnroot/reprap@449 cb376a5e-1013-0410-a455-b6b1f9ac8223
-rw-r--r--trunk/users/sai/newcomms/comms.c95
-rw-r--r--trunk/users/sai/newcomms/master.c16
-rw-r--r--trunk/users/sai/newcomms/procsim.c14
-rw-r--r--trunk/users/sai/newcomms/slave.c2
4 files changed, 93 insertions, 34 deletions
diff --git a/trunk/users/sai/newcomms/comms.c b/trunk/users/sai/newcomms/comms.c
index 00fe58e5..6af297ed 100644
--- a/trunk/users/sai/newcomms/comms.c
+++ b/trunk/users/sai/newcomms/comms.c
@@ -100,6 +100,36 @@ void timer_ping()
{
}
+static void sendCurrentOutBuffer()
+{
+ byte i;
+
+ if (!xmitBufferReady) {
+ printf("Transmit buffer not ready!!\n");
+ return;
+ }
+
+ uartTransmit(RAP_SYNC);
+ crc = 0;
+ uartTransmit(computeCRC(out_hdb1));
+ uartTransmit(computeCRC(address));
+ uartTransmit(computeCRC(out_dest));
+ uartTransmit(computeCRC(out_hdb2));
+ uartTransmit(crc);
+ if (out_length > 0) {
+ for(i = 0; i < out_length; i++)
+ uartTransmit(computeCRC(out_buffer[i]));
+ uartTransmit(crc);
+ }
+}
+
+static void sendTokenImmediate()
+{
+ uartTransmit(RAP_SYNC);
+ uartTransmit(0xff);
+ uartState = RAP_idle;
+}
+
void uartNotifyReceive()
{
byte c = RCREG;
@@ -123,27 +153,15 @@ void uartNotifyReceive()
// We have received a token, so if we have any data to send we
// can send it now.
if (xmitBufferReady) {
- byte i;
- uartTransmit(RAP_SYNC);
- crc = 0;
- uartTransmit(computeCRC(out_hdb1));
- uartTransmit(computeCRC(address));
- uartTransmit(computeCRC(out_dest));
- uartTransmit(computeCRC(out_hdb2));
- uartTransmit(crc);
- if (out_length > 0) {
- for(i = 0; i < out_length; i++)
- uartTransmit(computeCRC(out_buffer[i]));
- uartTransmit(crc);
- }
+ sendCurrentOutBuffer();
+ uartState = RAP_idle;
+
+ /// TODO the buffer should only be marked free after an ACK!!
xmitBufferReady = 0;
out_bufferBusy = 0;
- uartState = RAP_idle;
} else {
// Nothing to send, so pass the token on
- uartTransmit(RAP_SYNC);
- uartTransmit(0xff);
- uartState = RAP_idle;
+ sendTokenImmediate();
}
} else {
// Header of a normal packet
@@ -235,7 +253,14 @@ void uartNotifyReceive()
}
}
- // Deal with incoming receive sequence (responde to outgoing data)
+ if (ok && (in_hdb1 & RAP_HDB1_NAK)) {
+ // TODO: check sequence of NAK
+ printf("Received NAK, resend last packet\n");
+ sendCurrentOutBuffer();
+ ok = 0;
+ }
+
+ // Deal with incoming receive sequence (responded to outgoing data)
if (ok && (in_hdb1 & RAP_HDB1_ACK)) {
byte rseq;
rseq = RAP_RSEQ(in_hdb2);
@@ -250,17 +275,13 @@ void uartNotifyReceive()
if ((in_hdb2 & RAP_HDB2_LENMASK) == 0) {
// We don't bother with the second CRC if there is
// no data payload.
- uartTransmit(RAP_SYNC);
- uartTransmit(0xff);
- uartState = RAP_idle;
+ sendTokenImmediate();
} else
uartState = RAP_readingData;
} else {
printf("Failure, will drop packet\n");
}
} else {
- // We want to NAK the packet but we need to wait
- // until it is all received first
printf("Header CRC failure (got %02x, expected %02x), drop packet\n",
c, crc);
in_dropAction = Drop_None;
@@ -281,15 +302,27 @@ void uartNotifyReceive()
case RAP_expectDCRC:
if (c == crc) {
packetNotifyReceive((byte *)in_buffer, (in_hdb2 & RAP_HDB2_LENMASK));
- uartTransmit(RAP_SYNC);
- uartTransmit(0xff);
- uartState = RAP_idle;
+ sendTokenImmediate();
} else {
- // We want to NAK the packet but we need to wait
- // until it is all received first
+ // Failure, so NAK the packet. Possible optimisation: rather
+ // than putting a token out, just NAK immediately.
printf("Data CRC failure (got %02x, expected %02x), NAK packet\n",
c, crc);
- uartState = RAP_idle;
+ if (out_bufferBusy) {
+ // Already waiting to send a packet, so just drop it.
+ printf("Outward buffer already busy, drop\n");
+ } else {
+ out_bufferBusy = 1;
+ out_hdb1 = RAP_HDB1_NAK;
+ out_hdb2 = 0;
+ out_length = 0;
+ out_dest = in_src;
+ xmitBufferReady = 1;
+ in_bufferBusy = 0;
+
+ // Put out a new token
+ sendTokenImmediate();
+ }
}
break;
@@ -328,9 +361,7 @@ void uartNotifyReceive()
case Drop_None:
// Drop and do nothing. Except of course, we still
// need to put a token back into circulation
- uartTransmit(RAP_SYNC);
- uartTransmit(0xff);
- uartState = RAP_idle;
+ sendTokenImmediate();
break;
case Drop_NAK:
case Drop_ResendLast:
diff --git a/trunk/users/sai/newcomms/master.c b/trunk/users/sai/newcomms/master.c
index 596999d1..7b7f000e 100644
--- a/trunk/users/sai/newcomms/master.c
+++ b/trunk/users/sai/newcomms/master.c
@@ -9,6 +9,8 @@ extern int rfd, wfd;
extern void *timer(void *);
extern void *comms(void *);
+extern int exitAfter;
+
void packetNotifyReceive(byte *data, byte length)
{
int i;
@@ -38,6 +40,20 @@ int main()
pthread_t comms_thread;
pthread_attr_t pthread_custom_attr;
+ switch(fork()) {
+ case -1:
+ perror("Fork failed");
+ exit(1);
+ case 0:
+ system("./slave &");
+ //execl("slave", "slave");
+ exit(1);
+ }
+
+ exitAfter = 50;
+
+ printf("Starting master\n");
+
address = 0;
rfd = open("0", O_RDONLY);
diff --git a/trunk/users/sai/newcomms/procsim.c b/trunk/users/sai/newcomms/procsim.c
index 6cd73e2b..dd47147a 100644
--- a/trunk/users/sai/newcomms/procsim.c
+++ b/trunk/users/sai/newcomms/procsim.c
@@ -4,6 +4,9 @@
#include <stdio.h>
#include "shared.h"
+int exitAfter = -1;
+int receiveCount = 0;
+
byte address;
int rfd, wfd;
@@ -23,6 +26,13 @@ void *comms(void *arg)
ssize_t len;
for(;;) {
len = read(rfd, &RCREG, 1);
+ if (exitAfter != -1) {
+ receiveCount++;
+ if (receiveCount >= exitAfter)
+ break;
+ if (receiveCount == 11)
+ RCREG ^= 1;
+ }
if (len == 0) break;
uartNotifyReceive();
}
@@ -32,8 +42,8 @@ void *comms(void *arg)
void uartTransmit(byte c)
{
- if (address) printf(" ");
- printf("--> %d tx %02x\n", address, c);
+ //if (address) printf(" ");
+ //printf("--> %d tx %02x\n", address, c);
usleep(100000);
write(wfd, &c, 1);
}
diff --git a/trunk/users/sai/newcomms/slave.c b/trunk/users/sai/newcomms/slave.c
index 05ad8650..cc5ae2a7 100644
--- a/trunk/users/sai/newcomms/slave.c
+++ b/trunk/users/sai/newcomms/slave.c
@@ -30,6 +30,8 @@ int main()
pthread_t comms_thread;
pthread_attr_t pthread_custom_attr;
+ printf("Started slave\n");
+
address = 1;
rfd = open("1", O_RDONLY);