|
@@ -50,25 +50,33 @@ void _d_clear(void)
|
|
bool display_putstr(char *str, uint8_t col_x, uint8_t col_y, bool reverse)
|
|
bool display_putstr(char *str, uint8_t col_x, uint8_t col_y, bool reverse)
|
|
{
|
|
{
|
|
display_cmd_t cmd;
|
|
display_cmd_t cmd;
|
|
|
|
+ putstr_t *p;
|
|
|
|
|
|
cmd.command = DISPLAY_CMD_PUTSTR;
|
|
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);
|
|
return queue_try_add(&command_queue, &cmd);
|
|
}
|
|
}
|
|
|
|
|
|
bool display_clear(void)
|
|
bool display_clear(void)
|
|
{
|
|
{
|
|
display_cmd_t cmd;
|
|
display_cmd_t cmd;
|
|
-
|
|
|
|
cmd.command = DISPLAY_CMD_CLEAR;
|
|
cmd.command = DISPLAY_CMD_CLEAR;
|
|
-
|
|
|
|
return queue_try_add(&command_queue, &cmd);
|
|
return queue_try_add(&command_queue, &cmd);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ゴミ捨て
|
|
|
|
+inline void disposer(void *garbage)
|
|
|
|
+{
|
|
|
|
+ multicore_fifo_push_blocking((uint32_t)garbage);
|
|
|
|
+}
|
|
|
|
+
|
|
void display_main(void)
|
|
void display_main(void)
|
|
{
|
|
{
|
|
// I2C初期化
|
|
// I2C初期化
|
|
@@ -104,7 +112,9 @@ void display_main(void)
|
|
break;
|
|
break;
|
|
|
|
|
|
case DISPLAY_CMD_PUTSTR:
|
|
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;
|
|
break;
|
|
|
|
|
|
default:
|
|
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)
|
|
void display_init(void)
|
|
{
|
|
{
|
|
//queue初期化
|
|
//queue初期化
|
|
queue_init(&command_queue, sizeof(display_cmd_t), 8);
|
|
queue_init(&command_queue, sizeof(display_cmd_t), 8);
|
|
// display_main起動
|
|
// display_main起動
|
|
multicore_launch_core1(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);
|
|
}
|
|
}
|