roneos
Operating System for the r-one robot
 All Data Structures Files Functions Variables Typedefs Groups
neighbors.h
Go to the documentation of this file.
1 
15 #ifndef NEIGHBORS_H_
16 #define NEIGHBORS_H_
17 
18 /******** Defines ********/
19 
20 #define NEIGHBOR_PERIOD_DEFAULT 330
21 #define NEIGHBOR_TIMEOUT_ROUNDS 4
22 #define OBSTACLE_TIMEOUT_ROUNDS 2
23 #define NEIGHBOR_MAX 10
24 
25 /*
26  * TODO: IR: Do these really need to be removed???? It seems like they are kinda necessary
27  * and I don't know what would replace them.
28  */
29 //#define NEIGHBOR_MESSAGE_TIME_3BYTES 34
30 //#define NEIGHBOR_MESSAGE_TIME_4BYTES 51
31 //#define NEIGHBOR_XMIT_MIN_DELAY (NEIGHBOR_MESSAGE_TIME_4BYTES + 10)
32 /* REMOVES END */
33 #define NEIGHBOR_XMIT_MIN_DELAY 50
34 
35 #define ROBOT_ID_NULL 0
36 #define ROBOT_ID_MIN 1
37 #define ROBOT_ID_MAX 80
38 #define ROBOT_ID_ALL 0xFF
39 
40 #define MAX_PARENT_ID 0x7F
41 
42 // nbr radio messages - low-level system that underpins nbrnbr data and nbrData messages
43 #define NBR_RADIO_MESSAGES_MAX 16
44 #define NBR_RADIO_MESSAGES_SENDER_ID_IDX 0
45 #define NBR_RADIO_MESSAGES_LENGTH_IDX 1
46 #define NBR_RADIO_MESSAGES_DATA_IDX 2
47 #define NBR_RADIO_MESSAGE_DATA_LENGTH (RADIO_COMMAND_MESSAGE_DATA_LENGTH - NBR_RADIO_MESSAGES_DATA_IDX)
48 
49 // nbr data messages
50 #define NBR_DATA_IR_IDX_MAX 7
51 #define NBR_DATA_IR_BITS_MAX (IR_COMMS_MESSAGE_BIT_LENGTH_MAX)
52 
53 #define NBR_DATA_RF_PACKETS_MAX 4
54 #define NBR_DATA_RF_IDX_PER_PACKET NBR_RADIO_MESSAGE_DATA_LENGTH
55 #define NBR_DATA_RF_IDX_MAX (NBR_RADIO_MESSAGE_DATA_LENGTH * NBR_DATA_RF_PACKETS_MAX)
56 #define NBR_DATA_RF_BITS_MAX (NBR_DATA_RF_IDX_MAX * 8)
57 
58 #define NBR_DATA_TYPE_IR 0
59 #define NBR_DATA_TYPE_RF 1
60 
61 #define NBR_ANGLE_HISTORY 3
62 #define NBR_ANGLE_MAX_DELTA_PER_ROUND (MILLIRAD_PI / 4)
63 
64 /******** Structs ********/
65 
66 
70 typedef struct NbrData {
71  const char * name;
72  uint8 value;
73  uint8 size;
74  uint8 idx;
75  uint8 type;
76  struct NbrData* nextPtr;
77 } NbrData;
78 
79 
83 //TODO Add field documentation
84 typedef struct NbrMsgRadioNbrData {
85  uint8 ID;
86  uint32 timeStamp;
87  uint8 length;
88  uint8 data[NBR_RADIO_MESSAGE_DATA_LENGTH];
90 
91 
95 //TODO add field documentation
96 typedef struct NbrMsgRadio {
97  const char* name;
98  uint8 length;
99  uint8 data[NBR_RADIO_MESSAGE_DATA_LENGTH];
100  NbrMsgRadioNbrData dataNbr[NEIGHBOR_MAX];
101  RadioCmd radioCmd;
102  struct NbrMsgRadio* nextPtr;
103 } NbrMsgRadio;
104 
105 
109 //TODO Fill in missing field documentation
110 typedef struct Nbr {
111  uint8 ID;
112  int16 bearing;
113  int16 orientation;
114  int16 range;
115  int16 bearingHistory[NBR_ANGLE_HISTORY];
116  int16 orientationHistory[NBR_ANGLE_HISTORY];
117  boolean orientationValid;
118  uint32 updateTime;
119  uint32 updateRound;
120  uint8 orientationsBitsMatrix[IR_COMMS_NUM_OF_RECEIVERS];
121  uint8 rangeBits[IR_COMMS_NUM_OF_RECEIVERS];
122  uint8 receiverBits;
123  uint8 orientationBits;
124  uint8 signalBits;
125  boolean active;
126  uint8 messages[NBR_DATA_IR_IDX_MAX];
127  NbrMsgRadioNbrData* radioMessagePtr;
128 } Nbr;
129 
130 
134 //TODO Add field documentation
135 typedef struct NbrDatabase {
136  Nbr nbrs[NEIGHBOR_MAX];
137  uint8 nbrsSize;
138  uint32 round;
139  char message[IR_COMMS_MESSAGE_LENGTH_MAX];
140 } NbrDatabase;
141 
142 
143 //TODO: Double check brief
147 //TODO Add field documentation
148 typedef struct NbrList {
149  Nbr* nbrs[NEIGHBOR_MAX];
150  uint8 size;
151 } NbrList;
152 
153 
157 //TODO add field documentation
158 typedef struct IRRangeData {
159  uint8 orientationsBitsMatrix[IR_COMMS_NUM_OF_RECEIVERS];
160  uint8 rangeBits[IR_COMMS_NUM_OF_RECEIVERS];
161  uint8 receiverBits;
162  uint8 rangeBitCount;
163  uint32 updateRound;
164 } IRRangeData;
165 
166 
167 
168 /******** Functions ********/
169 
170 
177 void neighborsInit(uint32 neighbor_period);
178 
179 
185 void neighborsDisable(void);
186 
187 
194 void neighborsXmitEnable(boolean neighbor_xmit_enable_arg);
195 
196 
203 void neighborsSetPeriod(uint32 neighbor_period_arg);
204 
205 
214 void neighborsSetTimeoutRounds(uint8 timeoutRounds, uint8 minActive, uint8 maxInactive);
215 
216 
222 uint32 neighborsGetPeriod(void);
223 
224 
225 //TODO: Should this stay in the header file?
226 void neighborsAddReceiveCallback(void(*receiveCallbackArg)(NbrDatabase* ndPtr));
227 
228 
234 void neighborsGetMutex(void);
235 
236 
242 void neighborsPutMutex(void);
243 
244 
250 uint32 neighborsGetRound(void);
251 
252 
259 boolean neighborsNewRoundCheck(uint32* roundOldPtr);
260 
261 
268 void neighborsIgnore(uint8 neighborID);
269 
275 uint8 irObstaclesGetBits(void);
276 
277 
283 uint8* irObstaclesGetRangeBits(void);
284 
285 
291 uint8* irObstaclesGetBitMatrix(void);
292 
293 
302 int16 irObstaclesGetBearing(void);
303 
304 
305 
306 int8 irObstaclesGetBearingBitVector(void);
307 
308 void obstacleExcludeNbrs(NbrList* nbrListPtr, uint8* obstacleBitsGroupPtr, uint8* obstacleBitsCountPtr, int16* obstacleBearingPtr);
309 
310 
316 void obstaclePrint(void);
317 
318 uint32 pseudoRandNumGen(uint32 init, uint32 seed);
319 
320 
321 // basic nbr functions
322 
329 uint8 nbrGetID(Nbr* nbrPtr);
330 
331 
338 int32 nbrGetBearing(Nbr* nbrPtr);
339 
340 
347 int32 nbrGetOrientation(Nbr* nbrPtr);
348 
349 
356 int32 nbrGetRange(Nbr* nbrPtr);
357 
358 
365 boolean nbrGetOrientationValid(Nbr* nbrPtr);
366 
367 
375 uint8 nbrGetRangeBits(Nbr* nbrPtr);
376 
377 
386 uint8 nbrGetReceiverBits(Nbr* nbrPtr);
387 
388 
397 uint8 nbrGetTransmitterBits(Nbr* nbrPtr);
398 
399 
406 uint32 nbrGetUpdateTime(Nbr* nbrPtr);
407 
408 
415 uint32 nbrGetUpdateRound(Nbr* nbrPtr);
416 
417 
427 void nbrPrint(Nbr* nbr);
428 
429 
441 void nbrPrintData(Nbr* nbr, uint32 round);
442 
443 
450 boolean nbrIsRobot(Nbr* nbrPtr);
451 
452 
459 boolean nbrIsBeacon(Nbr* nbrPtr);
460 
461 
462 //TODO: implement or delete?
463 boolean nbrIsCharger(Nbr* nbrPtr);
464 
465 //TODO: Create nbrMsgRadio header file?
466 // nbr radio messages
467 
477 void nbrMsgRadioCreate(NbrMsgRadio* nbrMsgRadioPtr, const char* name);
478 
479 
490 void nbrMsgRadioSet(NbrMsgRadio* nbrMsgRadioPtr, char* dataPtr, uint8 length);
491 
492 
502 NbrMsgRadioNbrData* nbrMsgRadioGetNbr(NbrMsgRadio* nbrMsgRadioPtr, Nbr* nbrPtr);
503 
504 
512 void nbrMsgRadioPrint(NbrMsgRadio* nbrMsgRadioPtr, Nbr* nbrPtr);
513 
514 
515 // low-level function. Used internally TODO: so should it be removed from the header file?
516 Nbr* nbrsGetWithID(uint8 nbrID);
517 
518 #endif /* NEIGHBORS_H_ */