summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien <damien.p.george@gmail.com>2013-11-03 14:53:34 +0000
committerDamien <damien.p.george@gmail.com>2013-11-03 14:53:34 +0000
commit0e496733fed6311f78410891a22e75ac8086c689 (patch)
tree9640e958f36fb3c2ff19bf1eb3673c21eb29262c
parent33af3bf02846eb5cf48c0a2259d7e35275343749 (diff)
downloadmicropython-0e496733fed6311f78410891a22e75ac8086c689.tar.gz
micropython-0e496733fed6311f78410891a22e75ac8086c689.zip
Add simple file support to board.
-rw-r--r--stm/gchelper.s4
-rw-r--r--stm/main.c111
2 files changed, 101 insertions, 14 deletions
diff --git a/stm/gchelper.s b/stm/gchelper.s
index af19cc9116..f8735d2830 100644
--- a/stm/gchelper.s
+++ b/stm/gchelper.s
@@ -25,12 +25,12 @@ gc_helper_get_regs_and_clean_stack:
@ clean the stack from given pointer up to current sp
movs r0, #0
mov r2, sp
- b .entry
+ b.n .entry
.loop:
str r0, [r1], #4
.entry:
cmp r1, r2
- bcc .loop
+ bcc.n .loop
bx lr
.size gc_helper_get_regs_and_clean_stack, .-gc_helper_get_regs_and_clean_stack
diff --git a/stm/main.c b/stm/main.c
index 96b923ad1a..def515e48b 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -96,12 +96,12 @@ static qstr pyb_config_source_dir = 0;
static qstr pyb_config_main = 0;
py_obj_t pyb_source_dir(py_obj_t source_dir) {
- pyb_config_source_dir = py_get_qstr(source_dir);
+ pyb_config_source_dir = py_obj_get_qstr(source_dir);
return py_const_none;
}
py_obj_t pyb_main(py_obj_t main) {
- pyb_config_main = py_get_qstr(main);
+ pyb_config_main = py_obj_get_qstr(main);
return py_const_none;
}
@@ -112,7 +112,7 @@ py_obj_t pyb_sync(void) {
}
py_obj_t pyb_delay(py_obj_t count) {
- sys_tick_delay_ms(py_get_int(count));
+ sys_tick_delay_ms(py_obj_get_int(count));
return py_const_none;
}
@@ -229,7 +229,7 @@ static py_obj_t pyb_info(void) {
}
py_obj_t pyb_usart_send(py_obj_t data) {
- usart_tx_char(py_get_int(data));
+ usart_tx_char(py_obj_get_int(data));
return py_const_none;
}
@@ -507,7 +507,7 @@ void servo_init(void) {
}
py_obj_t pyb_servo_set(py_obj_t value) {
- int v = py_get_int(value);
+ int v = py_obj_get_int(value);
if (v < 100) { v = 100; }
if (v > 200) { v = 200; }
TIM2->CCR3 = v;
@@ -533,12 +533,12 @@ py_obj_t pyb_mma_read() {
}
py_obj_t pyb_hid_send_report(py_obj_t arg) {
- py_obj_t *items = py_get_array_fixed_n(arg, 4);
+ py_obj_t *items = py_obj_get_array_fixed_n(arg, 4);
uint8_t data[4];
- data[0] = py_get_int(items[0]);
- data[1] = py_get_int(items[1]);
- data[2] = py_get_int(items[2]);
- data[3] = py_get_int(items[3]);
+ data[0] = py_obj_get_int(items[0]);
+ data[1] = py_obj_get_int(items[1]);
+ data[2] = py_obj_get_int(items[2]);
+ data[3] = py_obj_get_int(items[3]);
usb_hid_send_report(data);
return py_const_none;
}
@@ -604,12 +604,87 @@ py_obj_t pyb_rtc_read(void) {
}
py_obj_t pyb_lcd8(py_obj_t pos, py_obj_t val) {
- int pos_val = py_get_int(pos);
- int val_val = py_get_int(val);
+ int pos_val = py_obj_get_int(pos);
+ int val_val = py_obj_get_int(val);
lcd_draw_pixel_8(pos_val, val_val);
return py_const_none;
}
+void file_obj_print(py_obj_t o) {
+ FIL *fp;
+ py_user_get_data(o, (machine_uint_t*)&fp, NULL);
+ printf("<file %p>", fp);
+}
+
+py_obj_t file_obj_read(py_obj_t self, py_obj_t arg) {
+ FIL *fp;
+ py_user_get_data(self, (machine_uint_t*)&fp, NULL);
+ int n = py_obj_get_int(arg);
+ char *buf = m_new(char, n + 1);
+ UINT n_out;
+ f_read(fp, buf, n, &n_out);
+ buf[n_out] = 0;
+ return py_obj_new_str(qstr_from_str_take(buf));
+}
+
+py_obj_t file_obj_write(py_obj_t self, py_obj_t arg) {
+ FIL *fp;
+ py_user_get_data(self, (machine_uint_t*)&fp, NULL);
+ const char *s = qstr_str(py_obj_get_qstr(arg));
+ UINT n_out;
+ FRESULT res = f_write(fp, s, strlen(s), &n_out);
+ if (res != FR_OK) {
+ printf("File error: could not write to file; error code %d\n", res);
+ } else if (n_out != strlen(s)) {
+ printf("File error: could not write all data to file; wrote %d / %d bytes\n", n_out, strlen(s));
+ }
+ return py_const_none;
+}
+
+py_obj_t file_obj_close(py_obj_t self) {
+ FIL *fp;
+ py_user_get_data(self, (machine_uint_t*)&fp, NULL);
+ f_close(fp);
+ return py_const_none;
+}
+
+// TODO gc hook to close the file if not already closed
+const py_user_info_t file_obj_info = {
+ "File",
+ file_obj_print,
+ {
+ {"read", 1, file_obj_read},
+ {"write", 1, file_obj_write},
+ {"close", 0, file_obj_close},
+ {NULL, 0, NULL},
+ }
+};
+
+py_obj_t pyb_io_open(py_obj_t o_filename, py_obj_t o_mode) {
+ const char *filename = qstr_str(py_obj_get_qstr(o_filename));
+ const char *mode = qstr_str(py_obj_get_qstr(o_mode));
+ FIL *fp = m_new(FIL, 1);
+ if (mode[0] == 'r') {
+ // open for reading
+ FRESULT res = f_open(fp, filename, FA_READ);
+ if (res != FR_OK) {
+ printf("FileNotFoundError: [Errno 2] No such file or directory: '%s'\n", filename);
+ return py_const_none;
+ }
+ } else if (mode[0] == 'w') {
+ // open for writing, truncate the file first
+ FRESULT res = f_open(fp, filename, FA_WRITE | FA_CREATE_ALWAYS);
+ if (res != FR_OK) {
+ printf("?FileError: could not create file: '%s'\n", filename);
+ return py_const_none;
+ }
+ } else {
+ printf("ValueError: invalid mode: '%s'\n", mode);
+ return py_const_none;
+ }
+ return py_obj_new_user(&file_obj_info, (machine_uint_t)fp, 0);
+}
+
int main(void) {
// TODO disable JTAG
@@ -682,6 +757,8 @@ soft_reset:
rt_store_attr(m, qstr_from_str_static("ustat"), rt_make_function_0(pyb_usart_status));
rt_store_attr(m, qstr_from_str_static("lcd8"), rt_make_function_2(pyb_lcd8));
rt_store_name(qstr_from_str_static("pyb"), m);
+
+ rt_store_name(qstr_from_str_static("open"), rt_make_function_2(pyb_io_open));
}
// print a message to the LCD
@@ -1040,3 +1117,13 @@ 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;
+}