Skip to content

Commit 7248205

Browse files
committed
TEENSY: added openUsbSerial api
1 parent 152b3ce commit 7248205

3 files changed

Lines changed: 141 additions & 93 deletions

File tree

src/platform/teensy/src/device.cpp

Lines changed: 13 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -15,78 +15,21 @@
1515
#include "common/smbas.h"
1616
#include "common/keymap.h"
1717
#include "lib/maapi.h"
18+
#include "serial.h"
1819

1920
#define SERIAL_BAUD_RATE 1000000
2021

21-
const int keymap[][2] = {
22-
{0x32, SB_KEY_INSERT},
23-
{0x33, SB_KEY_DELETE},
24-
{0x35, SB_KEY_PGUP},
25-
{0x36, SB_KEY_PGDN},
26-
{0x41, SB_KEY_UP},
27-
{0x42, SB_KEY_DOWN},
28-
{0x43, SB_KEY_RIGHT},
29-
{0x44, SB_KEY_LEFT},
30-
{0x46, SB_KEY_END},
31-
{0x48, SB_KEY_HOME}
32-
};
33-
34-
const int keymapLen = sizeof(keymap) / sizeof(keymap[0]);
35-
36-
//
37-
// read the next set of characters following escape
38-
//
39-
int get_escape() {
40-
int result = -1;
41-
if (Serial.available()) {
42-
char byte = Serial.read();
43-
if (byte == '[') {
44-
if (Serial.available()) {
45-
int key = Serial.read();
46-
for (int i = 0; i < keymapLen; i++) {
47-
if (key == keymap[i][0]) {
48-
result = keymap[i][1];
49-
break;
50-
}
51-
}
52-
if (result == -1) {
53-
dev_printf("Unknown Esc[ key [%x]\n", key);
54-
}
55-
}
56-
} else {
57-
result = SB_KEY_ESCAPE;
58-
}
59-
}
60-
return result;
61-
}
62-
6322
//
64-
// read the next key from the serial device
65-
//
66-
int get_key(void) {
67-
int result = -1;
68-
if (Serial.available()) {
69-
result = Serial.read();
70-
switch (result) {
71-
case 0x09:
72-
result = SB_KEY_TAB;
73-
break;
74-
case 0x0d:
75-
result = SB_KEY_ENTER;
76-
break;
77-
case 0x1b:
78-
result = get_escape();
79-
break;
80-
case 0x7e:
81-
result = SB_KEY_DELETE;
82-
break;
83-
case 0x7f:
84-
result = SB_KEY_BACKSPACE;
85-
break;
86-
}
87-
//dev_printf("got key %x\n", result);
23+
// setup the Serial device
24+
//
25+
void serial_init() {
26+
Serial.begin(SERIAL_BAUD_RATE);
27+
while (!Serial) {
28+
// wait
29+
}
30+
if (CrashReport) {
31+
Serial.print(CrashReport);
8832
}
89-
return result;
9033
}
9134

9235
//
@@ -130,12 +73,6 @@ int dev_events(int wait_flag) {
13073
result = Serial.available() > 0 ? -2 : 0;
13174
#else
13275
result = 0;
133-
if (Serial) {
134-
int key = get_key();
135-
if (key != -1) {
136-
dev_pushkey(key);
137-
}
138-
}
13976
#endif
14077
yield();
14178
return result;
@@ -161,13 +98,7 @@ int dev_init(int mode, int flags) {
16198
//
16299
void dev_print(const char *str) {
163100
// only initialise Serial when PRINT statement is used
164-
Serial.begin(SERIAL_BAUD_RATE);
165-
while (!Serial) {
166-
// wait
167-
}
168-
if (CrashReport) {
169-
Serial.print(CrashReport);
170-
}
101+
serial_init();
171102
if (str != nullptr && str[0] != '\0') {
172103
Serial.printf("%s", str);
173104
int len = strlen(str);
@@ -231,15 +162,15 @@ void log_printf(const char *format, ...) {
231162
//
232163
void lwrite(const char *buf) {
233164
if (opt_verbose) {
234-
Serial.println(buf);
165+
dev_print(buf);
235166
}
236167
}
237168

238169
//
239170
// unrecoverable error
240171
//
241172
void panic(const char *fmt, ...) {
242-
Serial.println("Fatal error");
173+
dev_print("Fatal error");
243174
for (;;);
244175
}
245176

src/platform/teensy/src/ssd1306.cpp

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,22 @@ static int cmd_stopscroll(int argc, slib_par_t *params, var_t *retval) {
268268
return 1;
269269
}
270270

271+
static int cmd_gettextsize(int argc, slib_par_t *params, var_t *retval) {
272+
auto str = get_param_str(argc, params, 0, 0);
273+
uint16_t w, h;
274+
if (str && str[0] != '\0') {
275+
int16_t x1, y1;
276+
display.getTextBounds(str, 0, 0, &x1, &y1, &w, &h);
277+
} else {
278+
w = 0;
279+
h = 0;
280+
}
281+
map_init(retval);
282+
v_setint(map_add_var(retval, "width", 0), w);
283+
v_setint(map_add_var(retval, "height", 0), h);
284+
return 1;
285+
}
286+
271287
FuncSpec lib_proc[] = {
272288
{0, 0, "INIT", cmd_init},
273289
{0, 0, "CLEAR", cmd_cleardisplay},
@@ -331,10 +347,49 @@ static int ssd1306_proc_exec(int index, int argc, slib_par_t *params, var_t *ret
331347
return result;
332348
}
333349

350+
static FuncSpec lib_func[] = {
351+
{1, 1, "GETTEXTSIZE", cmd_gettextsize}
352+
};
353+
354+
static int ssd1306_func_count(void) {
355+
return (sizeof(lib_func) / sizeof(lib_func[0]));
356+
}
357+
358+
static int ssd1306_func_getname(int index, char *func_name) {
359+
int result;
360+
if (index < ssd1306_func_count()) {
361+
strcpy(func_name, lib_func[index]._name);
362+
result = 1;
363+
} else {
364+
result = 0;
365+
}
366+
return result;
367+
}
368+
369+
static int ssd1306_func_exec(int index, int argc, slib_par_t *params, var_t *retval) {
370+
int result;
371+
if (index >= 0 && index < ssd1306_func_count()) {
372+
if (argc < lib_func[index]._min || argc > lib_func[index]._max) {
373+
if (lib_func[index]._min == lib_func[index]._max) {
374+
error(retval, lib_func[index]._name, lib_func[index]._min);
375+
} else {
376+
error(retval, lib_func[index]._name, lib_func[index]._min, lib_func[index]._max);
377+
}
378+
result = 0;
379+
} else {
380+
result = lib_func[index]._command(argc, params, retval);
381+
}
382+
} else {
383+
error(retval, "FUNC index error");
384+
result = 0;
385+
}
386+
return result;
387+
}
388+
334389
static ModuleConfig ssd1306Module = {
335-
._func_exec = nullptr,
336-
._func_count = nullptr,
337-
._func_getname = nullptr,
390+
._func_exec = ssd1306_func_exec,
391+
._func_count = ssd1306_func_count,
392+
._func_getname = ssd1306_func_getname,
338393
._proc_exec = ssd1306_proc_exec,
339394
._proc_count = ssd1306_proc_count,
340395
._proc_getname = ssd1306_proc_getname,

src/platform/teensy/src/teensy.cpp

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,34 @@
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

1627
static 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

3039
static 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

5463
static 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

7988
static 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+
115176
static 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

123185
static int teensy_func_count(void) {

0 commit comments

Comments
 (0)