Now you can download a copy of these docs so you can use them offline! Download now
NetworkTableConnection.cpp
1 
8 #include "networktables2/connection/NetworkTableConnection.h"
9 #include "networktables2/connection/BadMessageException.h"
10 
11 
13  ioStream(new DataIOStream(_ioStream)), typeManager(_typeManager) {
14  isValid = true;
15 }
16 NetworkTableConnection::~NetworkTableConnection(){
17  delete ioStream;
18 }
19 
20 void NetworkTableConnection::SetIOStream(IOStream* stream)
21 {
22  ioStream->SetIOStream(stream); //just passing through
23 }
24 
25 void NetworkTableConnection::close() {
26  {
27  NTSynchronized sync(WRITE_LOCK);
28  if (isValid) {
29  isValid = false;
30  ioStream->close();
31  }
32  }
33 }
34 void NetworkTableConnection::flush() {
35  {
36  NTSynchronized sync(WRITE_LOCK);
37  ioStream->flush();
38  }
39 }
40 
41 void NetworkTableConnection::sendMessageHeader(
42  NetworkTableMessageType messageType) {
43  {
44  NTSynchronized sync(WRITE_LOCK);
45  ioStream->writeByte((uint8_t) messageType);
46  }
47 }
48 
49 void NetworkTableConnection::sendKeepAlive() {
50  {
51  NTSynchronized sync(WRITE_LOCK);
52  sendMessageHeader(KEEP_ALIVE);
53  flush();
54  }
55 }
56 
57 void NetworkTableConnection::sendClientHello() {
58  {
59  NTSynchronized sync(WRITE_LOCK);
60  sendMessageHeader(CLIENT_HELLO);
61  ioStream->write2BytesBE(PROTOCOL_REVISION);
62  flush();
63  }
64 }
65 void NetworkTableConnection::sendServerHelloComplete() {
66  {
67  NTSynchronized sync(WRITE_LOCK);
68  sendMessageHeader(SERVER_HELLO_COMPLETE);
69  flush();
70  }
71 }
72 
73 void NetworkTableConnection::sendProtocolVersionUnsupported() {
74  {
75  NTSynchronized sync(WRITE_LOCK);
76  sendMessageHeader(PROTOCOL_VERSION_UNSUPPORTED);
77  ioStream->write2BytesBE(PROTOCOL_REVISION);
78  flush();
79  }
80 }
81 
82 void NetworkTableConnection::sendEntryAssignment(NetworkTableEntry& entry) {
83  {
84  NTSynchronized sync(WRITE_LOCK);
85  sendMessageHeader(ENTRY_ASSIGNMENT);
86  ioStream->writeString(entry.name);
87  ioStream->writeByte(entry.GetType()->id);
88  ioStream->write2BytesBE(entry.GetId());
89  ioStream->write2BytesBE(entry.GetSequenceNumber());
90  entry.SendValue(*ioStream);
91  }
92 }
93 
94 void NetworkTableConnection::sendEntryUpdate(NetworkTableEntry& entry) {
95  {
96  NTSynchronized sync(WRITE_LOCK);
97  sendMessageHeader(FIELD_UPDATE);
98  ioStream->write2BytesBE(entry.GetId());
99  ioStream->write2BytesBE(entry.GetSequenceNumber());
100  entry.SendValue(*ioStream);
101  }
102 }
103 
104 void NetworkTableConnection::read(ConnectionAdapter& adapter) {
105  int messageType = ioStream->readByte();
106  switch (messageType) {
107  case KEEP_ALIVE:
108  adapter.keepAlive();
109  return;
110  case CLIENT_HELLO: {
111  uint16_t protocolRevision = ioStream->read2BytesBE();
112  adapter.clientHello(protocolRevision);
113  return;
114  }
115  case SERVER_HELLO_COMPLETE: {
116  adapter.serverHelloComplete();
117  return;
118  }
119  case PROTOCOL_VERSION_UNSUPPORTED: {
120  uint16_t protocolRevision = ioStream->read2BytesBE();
121  adapter.protocolVersionUnsupported(protocolRevision);
122  return;
123  }
124  case ENTRY_ASSIGNMENT: {
125  std::string* entryName = ioStream->readString();
126  TypeId typeId = ioStream->readByte();
127  NetworkTableEntryType* entryType = typeManager.GetType(typeId);
128  if (!entryType){
129  char exceptionMessageBuffer[50];
130  sprintf (exceptionMessageBuffer, "Unknown data type: %#x", typeId);
131  throw BadMessageException(exceptionMessageBuffer);
132  }
133  EntryId entryId = ioStream->read2BytesBE();
134  SequenceNumber entrySequenceNumber = ioStream->read2BytesBE();
135  EntryValue value = entryType->readValue(*ioStream);
136  adapter.offerIncomingAssignment(new NetworkTableEntry(entryId, *entryName, entrySequenceNumber, entryType, value));
137  entryType->deleteValue(value);
138  delete entryName;
139  return;
140  }
141  case FIELD_UPDATE: {
142  EntryId entryId = ioStream->read2BytesBE();
143  SequenceNumber entrySequenceNumber = ioStream->read2BytesBE();
144  NetworkTableEntry* entry = adapter.GetEntry(entryId);
145  if (!entry){
146  char exceptionMessageBuffer[50];
147  sprintf (exceptionMessageBuffer, "Received update for unknown entry id: %d", entryId);
148  throw BadMessageException(exceptionMessageBuffer);
149  }
150  EntryValue value = entry->GetType()->readValue(*ioStream);
151 
152  adapter.offerIncomingUpdate(entry, entrySequenceNumber, value);
153  entry->GetType()->deleteValue(value);
154  return;
155  }
156  default:
157  char exceptionMessageBuffer[50];
158  sprintf (exceptionMessageBuffer, "Unknown Network Table Message Type: %d", messageType);
159  throw BadMessageException(exceptionMessageBuffer);
160  }
161 }
virtual EntryValue readValue(DataIOStream &is)=0
NetworkTableConnection(IOStream *stream, NetworkTableEntryTypeManager &typeManager)
void SendValue(DataIOStream &iostream)
SequenceNumber GetSequenceNumber()
NetworkTableEntryType * GetType(TypeId type)
Definition: ITable.h:13
std::string name
virtual void deleteValue(EntryValue value)

Generated on Sat Apr 26 2014 12:26:45 for WPILibC++ by doxygen 1.8.6