1717#include " module.h"
1818#include " serial.h"
1919#include < Wire.h>
20+ #include < malloc.h>
2021
2122#define USB_CLASS_ID 1002
2223#define MAX_HW_SERIAL 7
@@ -138,7 +139,7 @@ static int cmd_opendigitalinput(int argc, slib_par_t *args, var_t *retval) {
138139 int result = 1 ;
139140 int pin = get_param_int (argc, args, 0 , -1 );
140141 uint8_t mode = get_param_int (argc, args, 1 , 1 );
141- if (mode) {
142+ if (mode) {
142143 mode = INPUT_PULLUP;
143144 } else {
144145 mode = INPUT;
@@ -235,7 +236,7 @@ static int cmd_get_temperature(int argc, slib_par_t *args, var_t *retval) {
235236}
236237
237238static int cmd_get_cpu_speed (int argc, slib_par_t *args, var_t *retval) {
238- v_setint (retval, F_CPU_ACTUAL/ 1000000 );
239+ v_setint (retval, F_CPU_ACTUAL / 1000000 );
239240 return 1 ;
240241}
241242
@@ -262,22 +263,41 @@ static int cmd_serial_receive(var_s *self, int argc, slib_par_t *args, var_s *re
262263 v_setstr (retval, ERR_PARAM);
263264 result = 0 ;
264265 } else {
265- auto bufferSize = get_param_int (argc, args, 0 , CDC_RX_SIZE_480);
266- if (!bufferSize) {
267- bufferSize = CDC_RX_SIZE_480;
268- }
269- char buffer[bufferSize];
266+ int bufferSize = get_param_int (argc, args, 0 , 0 );
270267 int size;
271268 int serialNo = self->v .m .id ;
272269
273- if (serialNo == 0 ) {
274- size = Serial.readBytes (buffer, bufferSize);
270+ if (bufferSize == 0 ) {
271+ // Read until '\n' and return as string
272+ bufferSize = CDC_RX_SIZE_480;
273+ char buffer[bufferSize];
274+
275+ if (serialNo == 0 ) {
276+ size = Serial.readBytesUntil (' \n ' , buffer, bufferSize - 1 );
277+ } else {
278+ size = getSerial (serialNo)->readBytesUntil (' \n ' , buffer, bufferSize - 1 );
279+ }
280+ buffer[size] = ' \0 ' ;
281+ v_setstr (retval, buffer);
282+ result = 1 ;
275283 } else {
276- size = getSerial (serialNo)->readBytes (buffer, bufferSize);
284+ // Read number of bytes and return as array
285+ char buffer[bufferSize];
286+ if (serialNo == 0 ) {
287+ size = Serial.readBytes (buffer, bufferSize);
288+ } else {
289+ size = getSerial (serialNo)->readBytes (buffer, bufferSize);
290+ }
291+ if (bufferSize > 1 ) {
292+ v_toarray1 (retval, bufferSize);
293+ for (int32_t ii = 0 ; ii < size; ii++) {
294+ v_setint (v_elem (retval, ii), buffer[ii]);
295+ }
296+ } else {
297+ v_setint (retval, buffer[0 ]);
298+ }
299+ result = 1 ;
277300 }
278- buffer[size] = ' \0 ' ;
279- v_setstr (retval, buffer);
280- result = 1 ;
281301 }
282302 return result;
283303}
@@ -322,7 +342,8 @@ static int cmd_openserial(int argc, slib_par_t *args, var_t *retval) {
322342 serial_init ();
323343 break ;
324344 default :
325- getSerial (serialNo)->begin (BT_BAUD);
345+ int serialSpeed = get_param_int (argc, args, 1 , BT_BAUD);
346+ getSerial (serialNo)->begin (serialSpeed);
326347 break ;
327348 }
328349 result = 1 ;
@@ -332,7 +353,7 @@ static int cmd_openserial(int argc, slib_par_t *args, var_t *retval) {
332353
333354static int cmd_i2c_write (var_s *self, int argc, slib_par_t *args, var_s *retval) {
334355 uint8_t address = get_param_int (argc, args, 0 , 0 );
335- uint8_t stop = get_param_int (argc, args, 2 , 1 );
356+ uint8_t stop = get_param_int (argc, args, 2 , 1 );
336357
337358 if (address == 0 || argc < 2 ) {
338359 v_setstr (retval, ERR_PARAM);
@@ -345,36 +366,36 @@ static int cmd_i2c_write(var_s *self, int argc, slib_par_t *args, var_s *retval)
345366
346367 ptrWire->beginTransmission (address);
347368
348- switch (args[1 ].var_p ->type ) {
349- case V_INT: {
369+ switch (args[1 ].var_p ->type ) {
370+ case V_INT:{
350371 int value = get_param_int (argc, args, 1 , 0 );
351372 ptrWire->write (value);
352373 }
353374 break ;
354- case V_STR: {
375+ case V_STR:{
355376 const char *buffer = v_getstr (args[1 ].var_p );
356377 int length = v_strlen (args[1 ].var_p );
357378 ptrWire->write (buffer, length);
358379 }
359380 break ;
360- case V_ARRAY: {
361- var_p_t array = args[1 ].var_p ; // Get array
381+ case V_ARRAY:{
382+ var_p_t array = args[1 ].var_p ; // Get array
362383 if (array->maxdim > 1 ) {
363384 v_setstr (retval, " ERROR: I2C: Write requires 1D-array" );
364385 return 0 ;
365386 }
366- uint32_t bytes = v_ubound (array, 0 ) - v_lbound (array, 0 ) + 1 ;
387+ uint32_t bytes = v_ubound (array, 0 ) - v_lbound (array, 0 ) + 1 ;
367388 uint8_t *buffer = new uint8_t [bytes];
368389 for (uint32_t ii = 0 ; ii < bytes; ii++) {
369390 buffer[ii] = get_array_elem_int (array, ii);
370391 }
371392 ptrWire->write (buffer, bytes);
372- delete[] buffer;
393+ delete[] buffer;
373394 }
374395 break ;
375396 }
376397
377- if (ptrWire->endTransmission (stop)) {
398+ if (ptrWire->endTransmission (stop)) {
378399 v_setstr (retval, " ERROR I2C: Transmission failed" );
379400 return 0 ;
380401 }
@@ -383,39 +404,33 @@ static int cmd_i2c_write(var_s *self, int argc, slib_par_t *args, var_s *retval)
383404}
384405
385406static int cmd_i2c_read (var_s *self, int argc, slib_par_t *args, var_s *retval) {
386- uint8_t address = get_param_int (argc, args, 0 , 0 );
387- uint32_t bytes = get_param_int (argc, args, 1 , 1 );
388- uint8_t stop = get_param_int (argc, args, 2 , 1 );
407+ uint8_t address = get_param_int (argc, args, 0 , 0 );
408+ uint32_t bytes = get_param_int (argc, args, 1 , 1 );
409+ uint8_t stop = get_param_int (argc, args, 2 , 1 );
389410
390411 if (address == 0 ) {
391412 v_setstr (retval, ERR_PARAM);
392413 return 0 ;
393414 }
394415
395- uint8_t *buffer = new uint8_t [bytes];
396416 int interfaceNumber = self->v .m .id ;
397417 TwoWire *ptrWire;
398418 ptrWire = getI2C (interfaceNumber);
399-
400419 ptrWire->requestFrom (address, bytes, stop);
401- ptrWire->readBytes (buffer, bytes);
402420
403421 if (bytes > 1 ) {
404422 v_toarray1 (retval, bytes);
405423 for (uint32_t ii = 0 ; ii < bytes; ii++) {
406- v_setint (v_elem (retval, ii), buffer[ii] );
424+ v_setint (v_elem (retval, ii), ptrWire-> read () );
407425 }
426+ } else {
427+ v_setint (retval, ptrWire->read ());
408428 }
409- else {
410- v_setint (retval, buffer[0 ]);
411- }
412-
413- delete[] buffer;
414429 return 1 ;
415430}
416431
417432static int cmd_i2c_setClock (var_s *self, int argc, slib_par_t *args, var_s *retval) {
418- uint32_t clockFrequency = get_param_int (argc, args, 0 , 100000 );
433+ uint32_t clockFrequency = get_param_int (argc, args, 0 , 100000 );
419434
420435 if (clockFrequency != 100000 && clockFrequency != 400000 && clockFrequency != 1000000 ) {
421436 v_setstr (retval, " ERROR I2C: Clock freuqency not supported" );
@@ -429,9 +444,9 @@ static int cmd_i2c_setClock(var_s *self, int argc, slib_par_t *args, var_s *retv
429444}
430445
431446static int cmd_openi2c (int argc, slib_par_t *args, var_t *retval) {
432- uint8_t interfaceNumber = get_param_int (argc, args, 0 , 0 );
433- uint8_t pinSDA = get_param_int (argc, args, 1 , 0 );
434- uint8_t pinSCL = get_param_int (argc, args, 2 , 0 );
447+ uint8_t interfaceNumber = get_param_int (argc, args, 0 , 0 );
448+ uint8_t pinSDA = get_param_int (argc, args, 1 , 0 );
449+ uint8_t pinSCL = get_param_int (argc, args, 2 , 0 );
435450
436451 if (interfaceNumber > 2 ) {
437452 v_setstr (retval, ERR_PARAM);
@@ -458,7 +473,7 @@ static int cmd_openi2c(int argc, slib_par_t *args, var_t *retval) {
458473}
459474
460475static int cmd_set_interactive (int argc, slib_par_t *args, var_t *retval) {
461- uint8_t mode = get_param_int (argc, args, 0 , 1 );
476+ uint8_t mode = get_param_int (argc, args, 0 , 1 );
462477
463478 if (mode > 0 ) {
464479 setInteractive (1 );
@@ -469,6 +484,18 @@ static int cmd_set_interactive(int argc, slib_par_t *args, var_t *retval) {
469484 return 1 ;
470485}
471486
487+ static int cmd_free (int argc, slib_par_t *args, var_t *retval) {
488+ extern char _ebss[], _heap_end[], *__brkval;
489+ char *sp = (char *)__builtin_frame_address (0 );
490+ auto stack = (sp - _ebss), heap = (_heap_end - __brkval);
491+
492+ v_toarray1 (retval, 2 );
493+ v_setint (v_elem (retval, 0 ), stack);
494+ v_setint (v_elem (retval, 1 ), heap);
495+
496+ return 1 ;
497+ }
498+
472499static FuncSpec lib_func[] = {
473500 {0 , 0 , " GETTEMP" , cmd_get_temperature},
474501 {0 , 0 , " GETCPUSPEED" , cmd_get_cpu_speed},
@@ -477,7 +504,8 @@ static FuncSpec lib_func[] = {
477504 {1 , 1 , " OPENDIGITALINPUT" , cmd_opendigitalinput},
478505 {1 , 1 , " OPENDIGITALOUTPUT" , cmd_opendigitaloutput},
479506 {0 , 1 , " OPENSERIAL" , cmd_openserial},
480- {0 , 3 , " OPENI2C" , cmd_openi2c}
507+ {0 , 3 , " OPENI2C" , cmd_openi2c},
508+ {0 , 0 , " FREE" , cmd_free}
481509};
482510
483511static FuncSpec lib_proc[] = {
0 commit comments