summaryrefslogtreecommitdiffstatshomepage
path: root/teensy/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'teensy/main.c')
-rw-r--r--teensy/main.c151
1 files changed, 104 insertions, 47 deletions
diff --git a/teensy/main.c b/teensy/main.c
index 0bc085aed9..bbfa7590fa 100644
--- a/teensy/main.c
+++ b/teensy/main.c
@@ -6,7 +6,7 @@
#include "nlr.h"
#include "misc.h"
#include "mpconfig.h"
-#include "mpqstr.h"
+#include "qstr.h"
#include "lexer.h"
#include "lexermemzip.h"
#include "parse.h"
@@ -15,6 +15,7 @@
#include "runtime0.h"
#include "runtime.h"
#include "repl.h"
+#include "servo.h"
#include "usb.h"
#include "gc.h"
#include "led.h"
@@ -54,6 +55,32 @@ static const char *help_text =
#endif
;
+mp_obj_t pyb_analog_read(mp_obj_t pin_obj) {
+ uint pin = mp_obj_get_int(pin_obj);
+ int val = analogRead(pin);
+ return MP_OBJ_NEW_SMALL_INT(val);
+}
+
+mp_obj_t pyb_analog_write(mp_obj_t pin_obj, mp_obj_t val_obj) {
+ uint pin = mp_obj_get_int(pin_obj);
+ int val = mp_obj_get_int(val_obj);
+ analogWrite(pin, val);
+ return mp_const_none;
+}
+
+mp_obj_t pyb_analog_write_resolution(mp_obj_t res_obj) {
+ int res = mp_obj_get_int(res_obj);
+ analogWriteResolution(res);
+ return mp_const_none;
+}
+
+mp_obj_t pyb_analog_write_frequency(mp_obj_t pin_obj, mp_obj_t freq_obj) {
+ uint pin = mp_obj_get_int(pin_obj);
+ int freq = mp_obj_get_int(freq_obj);
+ analogWriteFrequency(pin, freq);
+ return mp_const_none;
+}
+
// get some help about available functions
static mp_obj_t pyb_help(void) {
printf("%s", help_text);
@@ -181,16 +208,26 @@ mp_obj_t pyb_hid_send_report(mp_obj_t arg) {
}
#endif
-static qstr pyb_config_source_dir = 0;
-static qstr pyb_config_main = 0;
+static mp_obj_t pyb_config_source_dir = MP_OBJ_NULL;
+static mp_obj_t pyb_config_main = MP_OBJ_NULL;
mp_obj_t pyb_source_dir(mp_obj_t source_dir) {
- pyb_config_source_dir = mp_obj_get_qstr(source_dir);
+ if (MP_OBJ_IS_STR(source_dir)) {
+ pyb_config_source_dir = source_dir;
+ printf("source_dir = '");
+ mp_obj_print(source_dir, PRINT_STR);
+ printf("'\n");
+ }
return mp_const_none;
}
mp_obj_t pyb_main(mp_obj_t main) {
- pyb_config_main = mp_obj_get_qstr(main);
+ if (MP_OBJ_IS_STR(main)) {
+ pyb_config_main = main;
+ printf("main = '");
+ mp_obj_print(main, PRINT_STR);
+ printf("'\n");
+ }
return mp_const_none;
}
@@ -205,7 +242,7 @@ mp_obj_t pyb_led(mp_obj_t state) {
}
mp_obj_t pyb_run(mp_obj_t filename_obj) {
- const char *filename = qstr_str(mp_obj_get_qstr(filename_obj));
+ const char *filename = qstr_str(mp_obj_str_get_qstr(filename_obj));
do_file(filename);
return mp_const_none;
}
@@ -309,15 +346,24 @@ bool do_file(const char *filename) {
return false;
}
- mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT);
+ qstr parse_exc_id;
+ const char *parse_exc_msg;
+ mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT, &parse_exc_id, &parse_exc_msg);
qstr source_name = mp_lexer_source_name(lex);
- mp_lexer_free(lex);
if (pn == MP_PARSE_NODE_NULL) {
+ // parse error
+ mp_lexer_show_error_pythonic_prefix(lex);
+ printf("%s: %s\n", qstr_str(parse_exc_id), parse_exc_msg);
+ mp_lexer_free(lex);
return false;
}
+ mp_lexer_free(lex);
+
mp_obj_t module_fun = mp_compile(pn, source_name, false);
+ mp_parse_node_free(pn);
+
if (module_fun == mp_const_none) {
return false;
}
@@ -329,7 +375,7 @@ bool do_file(const char *filename) {
return true;
} else {
// uncaught exception
- mp_obj_print((mp_obj_t)nlr.ret_val);
+ mp_obj_print((mp_obj_t)nlr.ret_val, PRINT_REPR);
printf("\n");
return false;
}
@@ -340,7 +386,7 @@ void do_repl(void) {
stdout_tx_str("Type \"help()\" for more information.\r\n");
vstr_t line;
- vstr_init(&line);
+ vstr_init(&line, 32);
for (;;) {
vstr_reset(&line);
@@ -366,12 +412,21 @@ void do_repl(void) {
}
}
- mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", vstr_str(&line), vstr_len(&line), 0);
- mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT);
- mp_lexer_free(lex);
-
- if (pn != MP_PARSE_NODE_NULL) {
- mp_obj_t module_fun = mp_compile(pn, true);
+ mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, vstr_str(&line), vstr_len(&line), 0);
+ qstr parse_exc_id;
+ const char *parse_exc_msg;
+ mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT, &parse_exc_id, &parse_exc_msg);
+ qstr source_name = mp_lexer_source_name(lex);
+
+ if (pn == MP_PARSE_NODE_NULL) {
+ // parse error
+ mp_lexer_show_error_pythonic_prefix(lex);
+ printf("%s: %s\n", qstr_str(parse_exc_id), parse_exc_msg);
+ mp_lexer_free(lex);
+ } else {
+ // parse okay
+ mp_lexer_free(lex);
+ mp_obj_t module_fun = mp_compile(pn, source_name, true);
if (module_fun != mp_const_none) {
nlr_buf_t nlr;
uint32_t start = micros();
@@ -381,11 +436,11 @@ void do_repl(void) {
// optional timing
if (0) {
uint32_t ticks = micros() - start; // TODO implement a function that does this properly
- printf("(took %lu us)\n", ticks);
+ printf("(took %lu ms)\n", ticks);
}
} else {
// uncaught exception
- mp_obj_print((mp_obj_t)nlr.ret_val);
+ mp_obj_print((mp_obj_t)nlr.ret_val, PRINT_REPR);
printf("\n");
}
}
@@ -396,11 +451,15 @@ void do_repl(void) {
}
int main(void) {
- pinMode(LED_BUILTIN, OUTPUT);
+ pinMode(LED_BUILTIN, OUTPUT);
+#if 0
// Wait for host side to get connected
while (!usb_vcp_is_connected()) {
;
}
+#else
+ delay(1000);
+#endif
led_init();
led_state(PYB_LED_BUILTIN, 1);
@@ -415,28 +474,34 @@ soft_reset:
qstr_init();
rt_init();
-#if 1
// add some functions to the python namespace
{
- rt_store_name(qstr_from_str_static("help"), rt_make_function_0(pyb_help));
- mp_obj_t m = mp_obj_new_module(qstr_from_str_static("pyb"));
- rt_store_attr(m, qstr_from_str_static("info"), rt_make_function_0(pyb_info));
- rt_store_attr(m, qstr_from_str_static("source_dir"), rt_make_function_1(pyb_source_dir));
- rt_store_attr(m, qstr_from_str_static("main"), rt_make_function_1(pyb_main));
- rt_store_attr(m, qstr_from_str_static("gc"), rt_make_function_0(pyb_gc));
- rt_store_attr(m, qstr_from_str_static("delay"), rt_make_function_1(pyb_delay));
- rt_store_attr(m, qstr_from_str_static("led"), rt_make_function_1(pyb_led));
- rt_store_attr(m, qstr_from_str_static("Led"), rt_make_function_1(pyb_Led));
- rt_store_attr(m, qstr_from_str_static("gpio"), (mp_obj_t)&pyb_gpio_obj);
- rt_store_name(qstr_from_str_static("pyb"), m);
- rt_store_name(qstr_from_str_static("run"), rt_make_function_1(pyb_run));
+ rt_store_name(MP_QSTR_help, rt_make_function_n(0, pyb_help));
+ mp_obj_t m = mp_obj_new_module(MP_QSTR_pyb);
+ rt_store_attr(m, MP_QSTR_info, rt_make_function_n(0, pyb_info));
+ rt_store_attr(m, MP_QSTR_source_dir, rt_make_function_n(1, pyb_source_dir));
+ rt_store_attr(m, MP_QSTR_main, rt_make_function_n(1, pyb_main));
+ rt_store_attr(m, MP_QSTR_gc, rt_make_function_n(0, pyb_gc));
+ rt_store_attr(m, MP_QSTR_delay, rt_make_function_n(1, pyb_delay));
+ rt_store_attr(m, MP_QSTR_led, rt_make_function_n(1, pyb_led));
+ rt_store_attr(m, MP_QSTR_Led, rt_make_function_n(1, pyb_Led));
+ rt_store_attr(m, MP_QSTR_analogRead, rt_make_function_n(1, pyb_analog_read));
+ rt_store_attr(m, MP_QSTR_analogWrite, rt_make_function_n(2, pyb_analog_write));
+ rt_store_attr(m, MP_QSTR_analogWriteResolution, rt_make_function_n(1, pyb_analog_write_resolution));
+ rt_store_attr(m, MP_QSTR_analogWriteFrequency, rt_make_function_n(2, pyb_analog_write_frequency));
+
+ rt_store_attr(m, MP_QSTR_gpio, (mp_obj_t)&pyb_gpio_obj);
+ rt_store_attr(m, MP_QSTR_Servo, rt_make_function_n(0, pyb_Servo));
+ rt_store_name(MP_QSTR_pyb, m);
+ rt_store_name(MP_QSTR_run, rt_make_function_n(1, pyb_run));
}
-#endif
+ printf("About execute /boot.py\n");
if (!do_file("/boot.py")) {
printf("Unable to open '/boot.py'\n");
flash_error(4);
}
+ printf("Done executing /boot.py\n");
// Turn bootup LED off
led_state(PYB_LED_BUILTIN, 0);
@@ -445,21 +510,23 @@ soft_reset:
{
vstr_t *vstr = vstr_new();
vstr_add_str(vstr, "/");
- if (pyb_config_source_dir == 0) {
+ if (pyb_config_source_dir == MP_OBJ_NULL) {
vstr_add_str(vstr, "src");
} else {
- vstr_add_str(vstr, qstr_str(pyb_config_source_dir));
+ vstr_add_str(vstr, mp_obj_str_get_str(pyb_config_source_dir));
}
vstr_add_char(vstr, '/');
- if (pyb_config_main == 0) {
+ if (pyb_config_main == MP_OBJ_NULL) {
vstr_add_str(vstr, "main.py");
} else {
- vstr_add_str(vstr, qstr_str(pyb_config_main));
+ vstr_add_str(vstr, mp_obj_str_get_str(pyb_config_main));
}
+ printf("About execute '%s'\n", vstr_str(vstr));
if (!do_file(vstr_str(vstr))) {
printf("Unable to open '%s'\n", vstr_str(vstr));
flash_error(3);
}
+ printf("Done executing '%s'\n", vstr_str(vstr));
vstr_free(vstr);
}
@@ -471,16 +538,6 @@ soft_reset:
goto soft_reset;
}
-double __aeabi_f2d(float x) {
- // TODO
- return 0.0;
-}
-
-float __aeabi_d2f(double x) {
- // TODO
- return 0.0;
-}
-
double sqrt(double x) {
// TODO
return 0.0;