From fecee2b0ae7c9131f41f80f6aeb5f0c7be93c291 Mon Sep 17 00:00:00 2001
From: Damien <damien.p.george@gmail.com>
Date: Sat, 2 Nov 2013 16:41:51 +0000
Subject: [PATCH] Floats work with MP on board; function for LCD pixel
 manipulation.

---
 stm/lcd.c       | 15 +++++++++++++--
 stm/lcd.h       |  1 +
 stm/main.c      | 13 +++++++++++++
 stm/mpyconfig.h |  2 +-
 4 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/stm/lcd.c b/stm/lcd.c
index 0f645eb930..ee4f4da4e0 100644
--- a/stm/lcd.c
+++ b/stm/lcd.c
@@ -198,8 +198,8 @@ void lcd_print_strn(const char *str, unsigned int len) {
             chr = 127;
         }
         const uint8_t *chr_data = &font_petme128_8x8[(chr - 32) * 8];
-        for (int i = 0; i < 8; i++) {
-            lcd_out(LCD_DATA, chr_data[i]);
+        for (int j = 0; j < 8; j++) {
+            lcd_out(LCD_DATA, chr_data[j]);
         }
     }
 
@@ -207,3 +207,14 @@ void lcd_print_strn(const char *str, unsigned int len) {
         sys_tick_delay_ms(200);
     }
 }
+
+// writes 8 vertical pixels
+// pos 0 is upper left, pos 1 is 8 pixels to right of that, pos 128 is 8 pixels below that
+void lcd_draw_pixel_8(int pos, int val) {
+    int page = pos / 128;
+    int offset = pos - (page * 128);
+    lcd_out(LCD_INSTR, 0xb0 | page); // page address set
+    lcd_out(LCD_INSTR, 0x10 | ((offset >> 4) & 0x0f)); // column address set upper
+    lcd_out(LCD_INSTR, 0x00 | (offset & 0x0f)); // column address set lower
+    lcd_out(LCD_DATA, val); // write data
+}
diff --git a/stm/lcd.h b/stm/lcd.h
index 7b243ee7e3..56c541698e 100644
--- a/stm/lcd.h
+++ b/stm/lcd.h
@@ -1,3 +1,4 @@
 void lcd_init(void);
 void lcd_print_str(const char *str);
 void lcd_print_strn(const char *str, unsigned int len);
+void lcd_draw_pixel_8(int pos, int val);
diff --git a/stm/main.c b/stm/main.c
index 0837f1972f..96b923ad1a 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -603,6 +603,13 @@ py_obj_t pyb_rtc_read(void) {
     return py_const_none;
 }
 
+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);
+    lcd_draw_pixel_8(pos_val, val_val);
+    return py_const_none;
+}
+
 int main(void) {
     // TODO disable JTAG
 
@@ -673,6 +680,7 @@ soft_reset:
         rt_store_attr(m, qstr_from_str_static("uout"), rt_make_function_1(pyb_usart_send));
         rt_store_attr(m, qstr_from_str_static("uin"), rt_make_function_0(pyb_usart_receive));
         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);
     }
 
@@ -1027,3 +1035,8 @@ soft_reset:
     printf("PYB: soft reboot\n");
     goto soft_reset;
 }
+
+double __aeabi_f2d(float x) {
+    // TODO
+    return 0.0;
+}
diff --git a/stm/mpyconfig.h b/stm/mpyconfig.h
index 388ad1cc4d..06a4bd8e02 100644
--- a/stm/mpyconfig.h
+++ b/stm/mpyconfig.h
@@ -1,6 +1,6 @@
 // options to control how Micro Python is built
 
-#define MICROPY_ENABLE_FLOAT        (0)
+#define MICROPY_ENABLE_FLOAT        (1)
 #define MICROPY_EMIT_CPYTHON        (0)
 #define MICROPY_EMIT_X64            (0)
 #define MICROPY_EMIT_THUMB          (1)
-- 
GitLab