1111
1212#include " config.h"
1313#include " include/var_map.h"
14+ #include " languages/messages.en.h"
1415#include " module.h"
16+ #include " serial.h"
17+
18+ #define USB_OBJECT_ID 1001
19+ #define USB_CLASS_ID 1002
20+
21+ static void set_pin (var_p_t var, uint8_t pin, uint8_t mode) {
22+ map_init (var);
23+ var->v .m .id = pin;
24+ pinMode (pin, mode);
25+ }
1526
1627static bool is_pin (int id) {
1728 return id >= 0 && id < CORE_NUM_TOTAL_PINS ;
1829}
1930
20- static bool is_object (var_p_t var) {
31+ static bool is_pin_object (var_p_t var) {
2132 return var != nullptr && v_is_type (var, V_MAP ) && is_pin (var->v .m .id );
2233}
2334
24- static void set_pin (var_p_t var, uint8_t pin, uint8_t mode) {
25- map_init (var);
26- var->v .m .id = pin;
27- pinMode (pin, mode);
35+ static bool is_usb_object (var_p_t var) {
36+ return var != nullptr && v_is_type (var, V_MAP ) && (var->v .m .id == USB_OBJECT_ID );
2837}
2938
3039static int cmd_analoginput_read (var_s *self, int argc, slib_par_t *arg, var_s *retval) {
3140 int result = 0 ;
32- if (argc != 0 || !is_object (self)) {
41+ if (argc != 0 || !is_pin_object (self)) {
3342 error (retval, " AnalogInput.read" , 0 );
3443 } else {
3544 int pin = self->v .m .id ;
@@ -53,7 +62,7 @@ static int cmd_openanaloginput(int argc, slib_par_t *params, var_t *retval) {
5362
5463static int cmd_digitalinput_read (var_s *self, int argc, slib_par_t *arg, var_s *retval) {
5564 int result = 0 ;
56- if (argc != 0 || !is_object (self)) {
65+ if (argc != 0 || !is_pin_object (self)) {
5766 error (retval, " DigitalInput.read" , 0 );
5867 } else {
5968 int pin = self->v .m .id ;
@@ -78,7 +87,7 @@ static int cmd_opendigitalinput(int argc, slib_par_t *params, var_t *retval) {
7887
7988static int cmd_digitaloutput_write (var_s *self, int argc, slib_par_t *arg, var_s *retval) {
8089 int result = 0 ;
81- if (argc != 1 || !is_object (self)) {
90+ if (argc != 1 || !is_pin_object (self)) {
8291 error (retval, " DigitalOutput.write" , 1 );
8392 } else {
8493 int pin = self->v .m .id ;
@@ -112,12 +121,65 @@ static int cmd_get_cpu_speed(int argc, slib_par_t *params, var_t *retval) {
112121 return 1 ;
113122}
114123
124+ static int cmd_usb_ready (var_s *self, int argc, slib_par_t *args, var_s *retval) {
125+ int result;
126+ if (argc != 0 || !is_usb_object (self)) {
127+ v_setstr (retval, ERR_PARAM );
128+ result = 0 ;
129+ } else {
130+ v_setint (retval, Serial.available ());
131+ result = 1 ;
132+ }
133+ return result;
134+ }
135+
136+ static int cmd_usb_receive (var_s *self, int argc, slib_par_t *args, var_s *retval) {
137+ int result;
138+ if (argc != 0 || !is_usb_object (self)) {
139+ v_setstr (retval, ERR_PARAM );
140+ result = 0 ;
141+ } else {
142+ char buffer[CDC_RX_SIZE_480 ];
143+ int size = Serial.readBytes (buffer, CDC_RX_SIZE_480 );
144+ buffer[size] = ' \0 ' ;
145+ v_setstr (retval, buffer);
146+ result = 1 ;
147+ }
148+ return result;
149+ }
150+
151+ static int cmd_usb_send (var_s *self, int argc, slib_par_t *args, var_s *retval) {
152+ int result;
153+ if (argc != 1 || !is_usb_object (self) || !v_is_type (args[0 ].var_p , V_STR )) {
154+ v_setstr (retval, ERR_PARAM );
155+ result = 0 ;
156+ } else {
157+ const char *buffer = v_getstr (args[0 ].var_p );
158+ int length = v_strlen (args[0 ].var_p );
159+ Serial.write (buffer, length);
160+ result = 1 ;
161+ }
162+ return result;
163+ }
164+
165+ static int cmd_openserial (int argc, slib_par_t *params, var_t *retval) {
166+ map_init (retval);
167+ retval->v .m .id = USB_OBJECT_ID ;
168+ retval->v .m .cls_id = USB_CLASS_ID ;
169+ v_create_callback (retval, " ready" , cmd_usb_ready);
170+ v_create_callback (retval, " receive" , cmd_usb_receive);
171+ v_create_callback (retval, " send" , cmd_usb_send);
172+ serial_init ();
173+ return 1 ;
174+ }
175+
115176static FuncSpec lib_func[] = {
116177 {0 , 0 , " GETTEMP" , cmd_get_temperature},
117178 {0 , 0 , " GETCPUSPEED" , cmd_get_cpu_speed},
118179 {1 , 1 , " OPENANALOGINPUT" , cmd_openanaloginput},
119180 {1 , 1 , " OPENDIGITALINPUT" , cmd_opendigitalinput},
120181 {1 , 1 , " OPENDIGITALOUTPUT" , cmd_opendigitaloutput},
182+ {0 , 0 , " OPENUSBSERIAL" , cmd_openserial},
121183};
122184
123185static int teensy_func_count (void ) {
0 commit comments