1616#include " sensor_line.h"
1717#include " sensor_tof_matrix.h"
1818#include " ucPack.h"
19- #include " CircularBuffer.h"
20-
21- #define OUT_BUF_SIZE 512
2219
2320Arduino_AlvikCarrier alvik;
2421SensorLine line (EXT_A2,EXT_A1,EXT_A0);
2522SensorTofMatrix tof (alvik.wire, EXT_GPIO3, EXT_GPIO2);
2623
2724
2825ucPack packeter (200 );
29- CircularBuffer out_buffer (OUT_BUF_SIZE);
3026
3127uint8_t code;
3228uint8_t label;
@@ -36,8 +32,6 @@ uint8_t ack_required = 0;
3632bool ack_check = false ;
3733uint8_t ack_code = 0 ;
3834uint8_t behaviours;
39- uint8_t cmd;
40- uint8_t id;
4135
4236unsigned long tmotor = 0 ;
4337unsigned long tsend = 0 ;
@@ -62,179 +56,26 @@ float x, y, theta;
6256uint8_t servo_A, servo_B;
6357float position_left, position_right;
6458
59+ int counter_version = 9 ;
6560uint8_t version[3 ];
6661
6762
68- uint8_t outBufferFree () {
69- return OUT_BUF_SIZE - out_buffer.getSize ();
70- }
71-
72-
73- void receiveEvent (int byte) {
74- while (alvik.ext_wire ->available ()) {
75- packeter.buffer .push (alvik.ext_wire ->read ());
76- }
77- }
78-
79- void requestEvent () {
80- if (out_buffer.isEmpty ()) {
81- return ;
82- }
83- alvik.ext_wire ->write (out_buffer.pop ());
84- }
85-
86- void sendMessage (const uint8_t * buf, const size_t length) {
87- if (length > outBufferFree ()) {
88- return ;
89- }
90- for (uint8_t i = 0 ; i < length; i++) {
91- out_buffer.push (buf[i]);
92- }
93-
94- }
95-
96- void publishVersion () {
97- alvik.getVersion (version[0 ], version[1 ], version[2 ]);
98- msg_size = packeter.packetC3B (0x7E , version[0 ], version[1 ], version[2 ]);
99- sendMessage (packeter.msg , msg_size);
100- }
101-
102- void publishSensor (uint8_t sensor_id) {
103- switch (sensor_id){
104- case 0 :
105- line.update ();
106- msg_size = packeter.packetC3I (' l' , line.getLeft (), line.getCenter (), line.getRight ());
107- sendMessage (packeter.msg , msg_size);
108- break ;
109- case 1 :
110- alvik.updateTouch ();
111- msg_size = packeter.packetC1B (' t' , alvik.getTouchKeys ());
112- sendMessage (packeter.msg , msg_size);
113- msg_size = packeter.packetC1B (' m' , alvik.getMotion ());
114- sendMessage (packeter.msg , msg_size);
115- break ;
116- case 2 :
117- alvik.updateAPDS ();
118- msg_size = packeter.packetC3I (' c' , alvik.getRed (), alvik.getGreen (), alvik.getBlue ());
119- sendMessage (packeter.msg , msg_size);
120- break ;
121- case 3 :
122- if (tof.update_rois ()){
123- msg_size = packeter.packetC7I (' f' , tof.getLeft (), tof.getCenterLeft (), tof.getCenter (), tof.getCenterRight (), tof.getRight (), tof.getTop (), tof.getBottom ());
124- sendMessage (packeter.msg , msg_size);
125- }
126- break ;
127- case 4 :
128- msg_size = packeter.packetC3F (' q' , alvik.getRoll (), alvik.getPitch (), alvik.getYaw ());
129- sendMessage (packeter.msg , msg_size);
130- break ;
131- }
132- }
133-
134- void publishMotors (uint8_t c) {
135- switch (c) {
136- case ' j' :
137- // joint speed
138- msg_size = packeter.packetC2F (' j' , alvik.getRpmLeft (),alvik.getRpmRight ());
139- sendMessage (packeter.msg , msg_size);
140- break ;
141- case ' w' :
142- // joint position
143- msg_size = packeter.packetC2F (' w' , alvik.getPositionLeft (),alvik.getPositionRight ());
144- sendMessage (packeter.msg , msg_size);
145- break ;
146- case ' v' :
147- // robot speed
148- msg_size = packeter.packetC2F (' v' , alvik.getLinearVelocity (), alvik.getAngularVelocity ());
149- sendMessage (packeter.msg , msg_size);
150- break ;
151- case ' z' :
152- // pose
153- msg_size = packeter.packetC3F (' z' , alvik.getX (), alvik.getY (), alvik.getTheta ());
154- sendMessage (packeter.msg , msg_size);
155- break ;
156- default :
157- break ;
158- }
159- }
160-
161- void publishImu () {
162- msg_size = packeter.packetC6F (' i' , alvik.getAccelerationX (), alvik.getAccelerationY (), alvik.getAccelerationZ (), alvik.getAngularVelocityX (), alvik.getAngularVelocityY (), alvik.getAngularVelocityZ ());
163- sendMessage (packeter.msg , msg_size);
164- }
165-
166- void publishBattery () {
167- msg_size = packeter.packetC1F (' p' , alvik.isBatteryCharging ()*alvik.getBatteryChargePercentage ());
168- sendMessage (packeter.msg , msg_size);
169- }
170-
171- void publishAck () {
172- if (ack_check && (alvik.isTargetReached () || alvik.isPositionReached () || alvik.isPositionLeftReached () || alvik.isPositionRightReached ())){
173- if (ack_required == MOVEMENT_ROTATE){
174- msg_size = packeter.packetC1B (' x' , ' R' );
175- }
176- if (ack_required == MOVEMENT_MOVE){
177- msg_size = packeter.packetC1B (' x' , ' M' );
178- }
179- if (ack_required == MOVEMENT_POSITION){
180- msg_size = packeter.packetC1B (' x' , ' P' );
181- }
182- if (ack_required == MOVEMENT_LEFT){
183- msg_size = packeter.packetC1B (' x' , ' P' );
184- }
185- if (ack_required == MOVEMENT_RIGHT){
186- msg_size = packeter.packetC1B (' x' , ' P' );
187- }
188- }
189- else {
190- msg_size = packeter.packetC1B (' x' , 0 );
191- }
192- // alvik.serial->write(packeter.msg, msg_size);
193- sendMessage (packeter.msg ,msg_size);
194- }
195-
196- void publicationRequest (const uint8_t cmd, const uint8_t id) {
197-
198- switch (cmd) {
199- case ' v' :
200- publishVersion ();
201- break ;
202- case ' b' :
203- publishBattery ();
204- break ;
205- case ' i' :
206- publishImu ();
207- break ;
208- case ' m' :
209- publishMotors (id);
210- break ;
211- case ' k' :
212- publishAck ();
213- break ;
214- case ' s' :
215- publishSensor (id);
216- break ;
217- default :
218- break ;
219- }
220-
221- }
222-
22363void setup (){
22464 alvik.begin ();
225-
226- alvik.ext_wire ->onReceive (receiveEvent);
227- alvik.ext_wire ->onRequest (requestEvent);
228-
22965 alvik.disableIlluminator ();
23066 alvik.setLeds (COLOR_ORANGE);
23167 alvik.setLedBuiltin (HIGH);
23268 line.begin ();
23369 tof.begin ();
23470
71+
23572 alvik.getVersion (version[0 ], version[1 ], version[2 ]);
73+ msg_size = packeter.packetC3B (0x7E , version[0 ], version[1 ], version[2 ]);
74+ alvik.serial ->write (packeter.msg ,msg_size);
23675
23776 alvik.updateBMS ();
77+ msg_size = packeter.packetC1F (' p' , alvik.getBatteryChargePercentage ());
78+ alvik.serial ->write (packeter.msg ,msg_size);
23879
23980 alvik.setLedBuiltin (LOW);
24081 alvik.setLeds (COLOR_BLACK);
@@ -250,7 +91,9 @@ void setup(){
25091}
25192
25293void loop (){
253-
94+ while (alvik.serial ->available () > 0 ) {
95+ packeter.buffer .push (alvik.serial ->read ());
96+ }
25497 if (packeter.checkPayload ()) {
25598 code = packeter.payloadTop ();
25699 if (!alvik.isBatteryAlert ()){
@@ -380,19 +223,96 @@ void loop(){
380223 alvik.setBehaviour (ALL_BEHAVIOURS, false );
381224 }
382225 break ;
383- case ' #' :
384- packeter.unpacketC2B (code, cmd, id);
385- publicationRequest (cmd, id);
386- break ;
387226 }
388227 }
389228
229+ // sensors publish
230+ if (millis ()-tsensor>10 ){
231+ tsensor=millis ();
232+ switch (sensor_id){
233+ case 0 :
234+ line.update ();
235+ msg_size = packeter.packetC3I (' l' , line.getLeft (), line.getCenter (), line.getRight ());
236+ alvik.serial ->write (packeter.msg ,msg_size);
237+ break ;
238+ case 1 :
239+ alvik.updateTouch ();
240+ msg_size = packeter.packetC1B (' t' , alvik.getTouchKeys ());
241+ alvik.serial ->write (packeter.msg ,msg_size);
242+ msg_size = packeter.packetC1B (' m' , alvik.getMotion ());
243+ alvik.serial ->write (packeter.msg ,msg_size);
244+ break ;
245+ case 2 :
246+ alvik.updateAPDS ();
247+ msg_size = packeter.packetC3I (' c' , alvik.getRed (), alvik.getGreen (), alvik.getBlue ());
248+ alvik.serial ->write (packeter.msg ,msg_size);
249+ break ;
250+ case 3 :
251+ if (tof.update_rois ()){
252+ msg_size = packeter.packetC7I (' f' , tof.getLeft (), tof.getCenterLeft (), tof.getCenter (), tof.getCenterRight (), tof.getRight (), tof.getTop (), tof.getBottom ());
253+ alvik.serial ->write (packeter.msg ,msg_size);
254+ }
255+ break ;
256+ case 4 :
257+ msg_size = packeter.packetC3F (' q' , alvik.getRoll (), alvik.getPitch (), alvik.getYaw ());
258+ alvik.serial ->write (packeter.msg ,msg_size);
259+ break ;
260+ }
261+ sensor_id++;
262+ if (sensor_id>4 ){
263+ sensor_id=0 ;
264+ }
265+ }
390266
391- // motors update
267+ // motors update & publish
392268 if (millis ()-tmotor>=20 ){
393269 tmotor=millis ();
394270 alvik.updateMotors ();
395271 alvik.updateKinematics ();
272+ // joint speed
273+ msg_size = packeter.packetC2F (' j' , alvik.getRpmLeft (),alvik.getRpmRight ());
274+ alvik.serial ->write (packeter.msg ,msg_size);
275+ // joint position
276+ msg_size = packeter.packetC2F (' w' , alvik.getPositionLeft (),alvik.getPositionRight ());
277+ alvik.serial ->write (packeter.msg , msg_size);
278+ // robot speed
279+ msg_size = packeter.packetC2F (' v' , alvik.getLinearVelocity (), alvik.getAngularVelocity ());
280+ alvik.serial ->write (packeter.msg , msg_size);
281+ // pose
282+ msg_size = packeter.packetC3F (' z' , alvik.getX (), alvik.getY (), alvik.getTheta ());
283+ alvik.serial ->write (packeter.msg , msg_size);
284+ }
285+
286+ // acknowledge
287+ if (millis ()-tack > 100 ){
288+ tack = millis ();
289+ if (counter_version>0 ){
290+ counter_version--;
291+ alvik.getVersion (version[0 ], version[1 ], version[2 ]);
292+ msg_size = packeter.packetC3B (0x7E , version[0 ], version[1 ], version[2 ]);
293+ alvik.serial ->write (packeter.msg ,msg_size);
294+ }
295+ if (ack_check && (alvik.isTargetReached () || alvik.isPositionReached () || alvik.isPositionLeftReached () || alvik.isPositionRightReached ())){
296+ if (ack_required == MOVEMENT_ROTATE){
297+ msg_size = packeter.packetC1B (' x' , ' R' );
298+ }
299+ if (ack_required == MOVEMENT_MOVE){
300+ msg_size = packeter.packetC1B (' x' , ' M' );
301+ }
302+ if (ack_required == MOVEMENT_POSITION){
303+ msg_size = packeter.packetC1B (' x' , ' P' );
304+ }
305+ if (ack_required == MOVEMENT_LEFT){
306+ msg_size = packeter.packetC1B (' x' , ' P' );
307+ }
308+ if (ack_required == MOVEMENT_RIGHT){
309+ msg_size = packeter.packetC1B (' x' , ' P' );
310+ }
311+ }
312+ else {
313+ msg_size = packeter.packetC1B (' x' , 0 );
314+ }
315+ alvik.serial ->write (packeter.msg , msg_size);
396316 }
397317
398318 if (millis ()-tbehaviours > 100 ){
@@ -404,11 +324,15 @@ void loop(){
404324 if (millis ()-timu>10 ){
405325 timu=millis ();
406326 alvik.updateImu ();
327+ msg_size = packeter.packetC6F (' i' , alvik.getAccelerationX (), alvik.getAccelerationY (), alvik.getAccelerationZ (), alvik.getAngularVelocityX (), alvik.getAngularVelocityY (), alvik.getAngularVelocityZ ());
328+ alvik.serial ->write (packeter.msg ,msg_size);
407329 }
408330
409331 // battery update
410332 if (millis ()-tbattery>1000 ){
411333 tbattery = millis ();
412334 alvik.updateBMS ();
335+ msg_size = packeter.packetC1F (' p' , alvik.isBatteryCharging ()*alvik.getBatteryChargePercentage ());
336+ alvik.serial ->write (packeter.msg ,msg_size);
413337 }
414338}
0 commit comments