summaryrefslogtreecommitdiff
path: root/trunk/reprap/firmware/FiveD_GCode/FiveD_GCode_Extruder/intercom.pde
blob: 8c775a94a8aa2989f2619510e8aa0c84ebd54ab1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * Class to handle internal communications in the machine via RS485
 *
 * Adrian Bowyer 3 July 2009
 *
 */

#include "intercom.h"

intercom::intercom()
{
  reset();
  pinMode(RX_ENABLE_PIN, OUTPUT);
  pinMode(TX_ENABLE_PIN, OUTPUT);
  digitalWrite(RX_ENABLE_PIN, 0); //always listen.
  serialInterface.begin(RS485_BAUD);  
}

void intercom::sendPacket(char* to, char* string)
{
  digitalWrite(TX_ENABLE_PIN, 1);
  serialInterface.print(to[0]); // Make sure we send exactly two bytes
  serialInterface.print(to[1]);
  serialInterface.print(MY_NAME); // This should be two bytes
  serialInterface.println(string);
  digitalWrite(TX_ENABLE_PIN, 0);
}

void intercom::sendPacketWithReply(char* to, char* string, char* resp, int len)
{
  sendPacket(to, string);
  getPacket(resp, len);  
}

void intercom::getPacket(char* string, int len)
{
  int i = -1;
  ok = true;
  do
  {
    while(!serialInterface.available());
    i++;
    // Stop runaway buffer overflow
    if(i >= len)
    {
      ok = false; 
      i--;
    } else
      string[i] = serialInterface.read();
  } while(string[i] != '\n' && ok);
  string[i] = 0;
}

void intercom::reset()
{
   buf_pointer = 0;
   reply[0] = 0;   
}

void intercom::acknowledgeAndReset(char* to)
{
  if(!reply[0])
    reply[1] = 0;
  reply[0] = ACK;
  talker.sendPacket(to, reply);
  reset();
}
  
void intercom::getAndProcessCommand()
{
  if(!serialInterface.available())
    return;
  buffer[buf_pointer] = serialInterface.read();
  if(buffer[buf_pointer] == '\n')
  {
      buffer[buf_pointer] = 0;
      if(!sameName(buffer, MY_NAME)) // For me?
      {
        reset(); // No
        return;
      }
      ex.processCommand(&buffer[4]);
      acknowledgeAndReset(&buffer[2]);
  }else
      buf_pointer++;
  if(buf_pointer >= BUF_LEN)
  {
     reset();
     setReply(" !Buffer overrun");
  }
}

void intercom::setReply(char* string)
{
  strcpy(reply, string);
}

void intercom::addReply(char* string)
{
  strcat(reply, string);  
}

char* intercom::getReply()
{
  return reply;  
}