Now you can download a copy of these docs so you can use them offline! Download now
AbstractNetworkTableEntryStore.cpp
1 /*
2  * AbstractNetworkTableEntryStore.cpp
3  *
4  * Created on: Sep 16, 2012
5  * Author: Mitchell Wills
6  */
7 
8 #include "networktables2/AbstractNetworkTableEntryStore.h"
9 #include "networktables2/TableKeyExistsWithDifferentTypeException.h"
10 #include <map>
11 #include <vector>
12 #include <iostream>
13 #include <stdio.h>
14 
15  AbstractNetworkTableEntryStore::AbstractNetworkTableEntryStore(TableListenerManager& lstnManager):
16  listenerManager(lstnManager){
17  }
18 
19  AbstractNetworkTableEntryStore::~AbstractNetworkTableEntryStore(){
20  LOCK.take();
21  std::map<std::string, NetworkTableEntry*>::iterator itr;
22  for(itr = namedEntries.begin(); itr != namedEntries.end();){
23  delete itr->second;
24  namedEntries.erase(itr++);
25  }
26  }
27 
33  NetworkTableEntry* AbstractNetworkTableEntryStore::GetEntry(std::string& name){
34  {
35  NTSynchronized sync(LOCK);
36  std::map<std::string, NetworkTableEntry*>::iterator value_itr = namedEntries.find(name);
37  if(value_itr != namedEntries.end()) {
38  return value_itr->second;
39  }
40  return NULL;
41  }
42  }
43 
44  NetworkTableEntry* AbstractNetworkTableEntryStore::GetEntry(EntryId entryId){
45  {
46  NTSynchronized sync(LOCK);
47 
48  std::map<EntryId, NetworkTableEntry*>::iterator value_itr = idEntries.find(entryId);
49  if(value_itr != idEntries.end()) {
50  return value_itr->second;
51  }
52  return NULL;
53  }
54  }
55 
56  std::vector<std::string>* AbstractNetworkTableEntryStore::keys(){
57  {
58  NTSynchronized sync(LOCK);
59  std::vector<std::string>* keys = new std::vector<std::string>();
60  std::map<std::string, NetworkTableEntry*>::iterator itr;
61 
62  for(itr = namedEntries.begin(); itr != namedEntries.end(); itr++)
63  {
64  std::string key = (*itr).first;
65  keys->push_back(key);
66  }
67 
68  return (keys);
69  }
70 
71  }
72 
79  {
80  NTSynchronized sync(LOCK);
81  namedEntries.clear();
82  idEntries.clear();
83  }
84  }
85 
90  {
91  NTSynchronized sync(LOCK);
92  std::map<std::string, NetworkTableEntry*>::iterator itr;
93  idEntries.clear();
94 
95  for(itr = namedEntries.begin(); itr != namedEntries.end(); itr++)
96  {
97  ((NetworkTableEntry*)(*itr).second)->ClearId();
98  }
99  }
100  }
101 
102  void AbstractNetworkTableEntryStore::SetOutgoingReceiver(OutgoingEntryReceiver* receiver){
103  outgoingReceiver = receiver;
104  }
105 
106  void AbstractNetworkTableEntryStore::SetIncomingReceiver(OutgoingEntryReceiver* receiver){
107  incomingReceiver = receiver;
108  }
109 
121  {
122  NTSynchronized sync(LOCK);
123  std::map<std::string, NetworkTableEntry*>::iterator index = namedEntries.find(name);
124  NetworkTableEntry* tableEntry;
125  if(index == namedEntries.end())//if the name does not exist in the current entries
126  {
127  tableEntry = new NetworkTableEntry(name, type, value);
128  if(addEntry(tableEntry))
129  {
130  tableEntry->FireListener(listenerManager);
131  outgoingReceiver->offerOutgoingAssignment(tableEntry);
132  }
133  }
134  else
135  {
136  tableEntry = index->second;
137  if(tableEntry->GetType()->id != type->id){
138  throw TableKeyExistsWithDifferentTypeException(name, tableEntry->GetType());
139  }
140 
141  EntryValue oldValue = tableEntry->GetValue();
142  if(!type->areEqual(value, oldValue)){
143  if(updateEntry(tableEntry, (SequenceNumber)(tableEntry->GetSequenceNumber() + 1), value)){
144  outgoingReceiver->offerOutgoingUpdate(tableEntry);
145  }
146 
147  tableEntry->FireListener(listenerManager);
148  }
149  }
150  }
151  }
152 
154  {
155  NTSynchronized sync(LOCK);
156  NetworkTableEntryType* type = tableEntry->GetType();
157  EntryValue oldValue = tableEntry->GetValue();
158  if(!type->areEqual(value, oldValue)){
159  if(updateEntry(tableEntry, (SequenceNumber)(tableEntry->GetSequenceNumber() + 1), value)){
160  outgoingReceiver->offerOutgoingUpdate(tableEntry);
161  }
162 
163  tableEntry->FireListener(listenerManager);
164  }
165  }
166  }
167 
168  void AbstractNetworkTableEntryStore::offerIncomingAssignment(NetworkTableEntry* entry){
169  {
170  NTSynchronized sync(LOCK);
171  std::map<std::string, NetworkTableEntry*>::iterator itr = namedEntries.find(entry->name);
172  NetworkTableEntry* tableEntry;
173  if(addEntry(entry)){
174  if(itr != namedEntries.end()){
175  tableEntry = itr->second;
176  }
177  else{
178  tableEntry = entry;
179  }
180 
181  tableEntry->FireListener(listenerManager);//if we didnt have a pointer, then the copy of the version in the list would call this method, however with the pointer we are updating the version in the list
182  incomingReceiver->offerOutgoingAssignment(tableEntry);
183  }
184  else
185  delete entry;
186  }
187  }
188 
189  void AbstractNetworkTableEntryStore::offerIncomingUpdate(NetworkTableEntry* entry, SequenceNumber squenceNumber, EntryValue value){
190  {
191  NTSynchronized sync(LOCK);
192  if(updateEntry(entry, squenceNumber, value)){
193  entry->FireListener(listenerManager);
194  incomingReceiver->offerOutgoingUpdate(entry);
195  }
196  }
197  }
198 
205  {
206  NTSynchronized sync(LOCK);
207  std::map<std::string, NetworkTableEntry*>::iterator itr;
208  for(itr = namedEntries.begin(); itr != namedEntries.end(); itr++)
209  {
210  NetworkTableEntry* entry = itr->second;
211  listener->ValueChanged(table, itr->first, entry->GetValue(), true);
212  }
213  }
214  }
void notifyEntries(ITable *table, ITableListener *listener)
Definition: ITable.h:26
virtual void ValueChanged(ITable *source, const std::string &key, EntryValue value, bool isNew)=0
void PutOutgoing(std::string &name, NetworkTableEntryType *type, EntryValue value)
SequenceNumber GetSequenceNumber()
void clearIds()
Definition: ITable.h:13
std::string name
virtual bool areEqual(EntryValue v1, EntryValue v2)=0
void clearEntries()

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