Now you can download a copy of these docs so you can use them offline! Download now
NetworkTableNode.cpp
1 /*
2  * NetworkTableNode.cpp
3  *
4  * Created on: Sep 24, 2012
5  * Author: Mitchell Wills
6  */
7 
8 #include "networktables2/NetworkTableNode.h"
9 #include "networktables2/TableKeyExistsWithDifferentTypeException.h"
10 #include "networktables2/type/DefaultEntryTypes.h"
11 #include "tables/TableKeyNotDefinedException.h"
12 #include <algorithm>
13 
14 
15 
16 NetworkTableNode::NetworkTableNode(AbstractNetworkTableEntryStore& _entryStore):
17  entryStore(_entryStore){
18 }
19 
20 NetworkTableNode::~NetworkTableNode(){}
21 
23  return entryStore;
24 }
25 
26 
27 
28 void NetworkTableNode::PutBoolean(std::string& name, bool value){
29  EntryValue eValue;
30  eValue.b = value;
31  PutValue(name, &DefaultEntryTypes::BOOLEAN, eValue);
32 }
33 bool NetworkTableNode::GetBoolean(std::string& name){
34  NetworkTableEntry* entry = entryStore.GetEntry(name);
35  if(entry==NULL)
36  throw TableKeyNotDefinedException(name);
37  return entry->GetValue().b;
38 }
39 
40 void NetworkTableNode::PutDouble(std::string& name, double value){
41  EntryValue eValue;
42  eValue.f = value;
43  PutValue(name, &DefaultEntryTypes::DOUBLE, eValue);
44 }
45 double NetworkTableNode::GetDouble(std::string& name){
46  NetworkTableEntry* entry = entryStore.GetEntry(name);
47  if(entry==NULL)
48  throw TableKeyNotDefinedException(name);
49  return entry->GetValue().f;
50 }
51 
52 void NetworkTableNode::PutString(std::string& name, std::string& value){
53  EntryValue eValue;
54  eValue.ptr = &value;
55  PutValue(name, &DefaultEntryTypes::STRING, eValue);
56 }
57 std::string& NetworkTableNode::GetString(std::string& name) {
58  NetworkTableEntry* entry = entryStore.GetEntry(name);
59  if(entry==NULL)
60  throw TableKeyNotDefinedException(name);
61  return *(std::string*)(entry->GetValue().ptr);
62 }
63 
64 void NetworkTableNode::PutComplex(std::string& name, ComplexData& value){
65  EntryValue eValue;
66  eValue.ptr = &value;
67  PutValue(name, &value.GetType(), eValue);
68 }
69 
70 void NetworkTableNode::retrieveValue(std::string& name, ComplexData& externalData){
71  {
72  NTSynchronized sync(entryStore.LOCK);
73  NetworkTableEntry* entry = entryStore.GetEntry(name);
74  if(entry==NULL)
75  throw TableKeyNotDefinedException(name);
76  NetworkTableEntryType* entryType = entry->GetType();
77  if(!entryType->isComplex())
78  throw TableKeyExistsWithDifferentTypeException(name, entryType, "Is not a complex data type");
79  ComplexEntryType* complexType = (ComplexEntryType*)entryType;
80  complexType->exportValue(name, entry->GetValue(), externalData);
81  }
82 }
83 
84 
85 void NetworkTableNode::PutValue(std::string& name, NetworkTableEntryType* type, EntryValue value){
86  if(type->isComplex()){
87  {
88  NTSynchronized sync(entryStore.LOCK);
89  ComplexData* complexData = (ComplexData*)value.ptr;
90  ComplexEntryType* entryType = (ComplexEntryType*)type;
91  NetworkTableEntry* entry = entryStore.GetEntry(name);
92  if(entry!=NULL)
93  entryStore.PutOutgoing(entry, entryType->internalizeValue(entry->name, *complexData, entry->GetValue()));
94  else{
95  EntryValue nullValue = {0};
96  EntryValue entryValue = entryType->internalizeValue(name, *complexData, nullValue);
97  entryStore.PutOutgoing(name, type, entryValue);//TODO the entry gets copied when creating the entry should make lifecycle cleaner
98  type->deleteValue(entryValue);
99  }
100  }
101  }
102  else
103  entryStore.PutOutgoing(name, type, value);
104 }
105 
107  if(entry->GetType()->isComplex()){
108  {
109  NTSynchronized sync(entryStore.LOCK);
110  ComplexEntryType* entryType = (ComplexEntryType*)entry->GetType();
111 
112  entryStore.PutOutgoing(entry, entryType->internalizeValue(entry->name, *(ComplexData*)value.ptr, entry->GetValue()));
113  }
114  }
115  else
116  entryStore.PutOutgoing(entry, value);
117 }
118 
119 EntryValue NetworkTableNode::GetValue(std::string& name){//TODO don't allow get of complex types
120  {
121  NTSynchronized sync(entryStore.LOCK);
122  NetworkTableEntry* entry = entryStore.GetEntry(name);
123  if(entry==NULL)
124  throw TableKeyNotDefinedException(name);
125  return entry->GetValue();
126  }
127 }
128 
129 
130 bool NetworkTableNode::ContainsKey(std::string& key){
131  return entryStore.GetEntry(key)!=NULL;
132 }
133 
135  remoteListeners.push_back(listener);
136  if(IsConnected())
137  listener->Connected(this);
138  else
139  listener->Disconnected(this);
140 }
142  std::vector<IRemoteConnectionListener*>::iterator listenerPosition = std::find(remoteListeners.begin(), remoteListeners.end(), listener);
143  if(listenerPosition!=remoteListeners.end())
144  remoteListeners.erase(listenerPosition);
145 }
147  for(unsigned int i = 0; i<remoteListeners.size(); ++i)
148  remoteListeners.at(i)->Connected(this);
149 }
151  for(unsigned int i = 0; i<remoteListeners.size(); ++i)
152  remoteListeners.at(i)->Disconnected(this);
153 }
154 
155 
156 void NetworkTableNode::AddTableListener(ITableListener* listener, bool immediateNotify) {
157  tableListeners.push_back(listener);
158  if(immediateNotify)
159  entryStore.notifyEntries(NULL, listener);
160 }
161 void NetworkTableNode::RemoveTableListener(ITableListener* listener) {
162  std::vector<ITableListener*>::iterator listenerPosition = std::find(tableListeners.begin(), tableListeners.end(), listener);
163  if(listenerPosition!=tableListeners.end())
164  tableListeners.erase(listenerPosition);
165 }
166 void NetworkTableNode::FireTableListeners(std::string& key, EntryValue value, bool isNew){
167  for(unsigned int i = 0; i<tableListeners.size(); ++i)
168  tableListeners.at(i)->ValueChanged(NULL, key, value, isNew);
169 }
170 
171 
void notifyEntries(ITable *table, ITableListener *listener)
void PutValue(std::string &name, NetworkTableEntryType *type, EntryValue value)
AbstractNetworkTableEntryStore & GetEntryStore()
virtual void Connected(IRemote *remote)=0
virtual void exportValue(std::string &key, EntryValue internalData, ComplexData &externalRepresentation)=0
void AddConnectionListener(IRemoteConnectionListener *listener, bool immediateNotify)
virtual void Disconnected(IRemote *remote)=0
virtual EntryValue internalizeValue(std::string &key, ComplexData &externalRepresentation, EntryValue currentInteralValue)=0
void PutOutgoing(std::string &name, NetworkTableEntryType *type, EntryValue value)
virtual bool isComplex()
ComplexEntryType & GetType()
Definition: ComplexData.cpp:13
virtual bool IsConnected()=0
void RemoveConnectionListener(IRemoteConnectionListener *listener)
bool ContainsKey(std::string &key)
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