Quellcode durchsuchen

Update: Use multicore_fifo with display subsystem.

Satoshi Yoneda vor 2 Monaten
Ursprung
Commit
2f93fa780c
2 geänderte Dateien mit 41 neuen und 11 gelöschten Zeilen
  1. 32 8
      display.c
  2. 9 3
      display.h

+ 32 - 8
display.c

@@ -50,25 +50,33 @@ void _d_clear(void)
 bool display_putstr(char *str, uint8_t col_x, uint8_t col_y, bool reverse)
 {
     display_cmd_t       cmd;
+    putstr_t    *p;
 
     cmd.command = DISPLAY_CMD_PUTSTR;
-    cmd.x1 = col_x;
-    cmd.y1 = col_y;
-    cmd.x2 = (uint8_t)reverse;
-    strcpy((char *)cmd.data, str);
-    
+
+    p = (putstr_t *)malloc(sizeof(putstr_t));
+    p->col = col_x;
+    p->row = col_y;
+    p->reverse = reverse;
+    strcpy(p->str, str);
+    cmd.data = (void *)p;
+
     return queue_try_add(&command_queue, &cmd);
 }
 
 bool display_clear(void)
 {
     display_cmd_t cmd;
-
     cmd.command = DISPLAY_CMD_CLEAR;
-
     return queue_try_add(&command_queue, &cmd);
 }
 
+// ゴミ捨て
+inline void disposer(void *garbage)
+{
+    multicore_fifo_push_blocking((uint32_t)garbage);
+}
+
 void display_main(void)
 {
     // I2C初期化
@@ -104,7 +112,9 @@ void display_main(void)
                 break;
                 
              case DISPLAY_CMD_PUTSTR:
-                _d_putstr((char *)cmd.data, cmd.x1, cmd.y1, (bool)cmd.x2);
+                putstr_t *p = (putstr_t *)cmd.data;
+                _d_putstr(p->str, p->col, p->row, p->reverse);
+                disposer((void *)p);
                 break;
                 
              default:
@@ -115,10 +125,24 @@ void display_main(void)
     }
 }
 
+// FIFO割り込み
+void sio_irq_handler(void)
+{
+    while(multicore_fifo_rvalid()) {
+        void *garbage = (void *)multicore_fifo_pop_blocking();
+        free(garbage);
+    }
+    multicore_fifo_clear_irq();
+}
+
+// ディスプレイサブシステム初期化
 void display_init(void)
 {
     //queue初期化
     queue_init(&command_queue, sizeof(display_cmd_t), 8);
     // display_main起動
     multicore_launch_core1(display_main);
+    // FIFO割り込みEnable
+    irq_set_exclusive_handler(SIO_FIFO_IRQ_NUM(0), sio_irq_handler);
+    irq_set_enabled(SIO_FIFO_IRQ_NUM(0), true);
 }

+ 9 - 3
display.h

@@ -15,12 +15,18 @@ bool display_putstr(char *str, uint8_t col_x, uint8_t col_y, bool reverse);
 
 typedef struct {
     uint16_t    command;
-    uint8_t     x1,y1;
-    uint8_t     x2,y2;
-    uint8_t     data[OLED_WIDTH/FONT_WIDTH + 1];
+    void        *data;
 } display_cmd_t;
 
 
+typedef struct {
+    uint8_t     col;
+    uint8_t     row;
+    bool        reverse;
+    char        str[OLED_WIDTH/FONT_WIDTH + 1];
+} putstr_t;
+
+
 #define DISPLAY_CMD_NONE    0x0000
 #define DISPLAY_CMD_CLEAR   0x0001
 #define DISPLAY_CMD_PUTSTR  0x0002