stackable sakura.io board for patlite
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 #include "SakuraIO.h" 00003 00004 // プロトタイプ宣言 00005 uint8_t monitor(); 00006 uint8_t dequeue(); 00007 00008 DigitalOut status_led(PA_15); 00009 DigitalOut patlite_1(PA_0); // R 00010 DigitalOut patlite_2(PA_1); // Y 00011 DigitalOut patlite_3(PA_2); // G 00012 DigitalOut patlite_4(PA_3); // B 00013 DigitalOut patlite_5(PA_4); // C 00014 DigitalIn patlite_state_1(PA_12); // R 00015 DigitalIn patlite_state_2(PA_8); // Y 00016 DigitalIn patlite_state_3(PA_7); // G 00017 DigitalIn patlite_state_4(PA_6); // B 00018 DigitalIn patlite_state_5(PA_5); // C 00019 00020 DigitalOut patlite_out[5] = {patlite_1, patlite_2, patlite_3, patlite_4, patlite_5}; 00021 DigitalIn patlite_state[5] = {patlite_state_1, patlite_state_2, patlite_state_3, patlite_state_4, patlite_state_5}; 00022 00023 I2C i2c(PB_7, PB_6); // sda, scl 00024 SakuraIO_I2C sakuraio(i2c); 00025 00026 uint8_t last_state[5] = {0}; 00027 00028 int main() 00029 { 00030 // パトライトを1段ずつ順に点滅させながら接続待ち 00031 for (int patlite_index = 0;; patlite_index = (patlite_index + 1) % 5) 00032 { 00033 if ((sakuraio.getConnectionStatus() & 0x80) == 0x80) 00034 break; 00035 00036 status_led = 1; 00037 patlite_out[patlite_index] = 1; 00038 wait_ms(500); 00039 status_led = 0; 00040 patlite_out[patlite_index] = 0; 00041 wait_ms(500); 00042 } 00043 00044 // 接続完了したら全段1度点滅 00045 status_led = 1; 00046 for (int i = 0; i < 5; i++) 00047 { 00048 patlite_out[i] = 1; 00049 } 00050 wait(1); 00051 status_led = 0; 00052 for (int i = 0; i < 5; i++) 00053 { 00054 patlite_out[i] = 0; 00055 } 00056 00057 while (1) 00058 { 00059 // ピン状態と新着メッセージを監視してどちらか変化があったら1 00060 uint8_t changed = monitor() | dequeue(); 00061 if (changed == 1) 00062 { 00063 uint8_t state[5]; 00064 for (int i = 0; i < 5; i++) 00065 { 00066 state[i] = patlite_state[i]; 00067 } 00068 for (int i = 0; i < 5; i++) 00069 { 00070 sakuraio.enqueueTx(i, (int32_t)state[i]); 00071 } 00072 sakuraio.send(); 00073 } 00074 wait_ms(10); 00075 } 00076 } 00077 00078 // 外部からパトライトの点灯状態が変えられたことを検知する 00079 uint8_t monitor() 00080 { 00081 uint8_t changed = 0; 00082 uint8_t state[5]; 00083 for (int i = 0; i < 5; i++) 00084 { 00085 // 負論理なのでNOTかけてから点灯状態として取り込み 00086 state[i] = !patlite_state[i]; 00087 } 00088 00089 for (int i = 0; i < 5; i++) 00090 { 00091 if (last_state[i] != state[i]) 00092 { 00093 changed = 1; 00094 status_led = !status_led; 00095 last_state[i] = state[i]; 00096 } 00097 } 00098 00099 return changed; 00100 } 00101 00102 // sakura.ioのRxキューの状態を見て操作命令が来ていないか確認する 00103 uint8_t dequeue() 00104 { 00105 uint8_t avail = 0, queued = 0, changed = 0; 00106 sakuraio.getRxQueueLength(&avail, &queued); 00107 for (uint8_t i = 0; i < queued; i++) 00108 { 00109 uint8_t channel, type, values[8]; 00110 int64_t offset; 00111 00112 // RXキューから点灯要求を取り出す 00113 uint8_t ret = sakuraio.dequeueRx(&channel, &type, values, &offset); 00114 if (ret == 0x01) 00115 { 00116 if (channel < 5) 00117 { 00118 if (*((int32_t *)values) == 0) 00119 patlite_out[channel] = 0; 00120 else 00121 patlite_out[channel] = 1; 00122 } 00123 changed = 1; 00124 } 00125 } 00126 return changed; 00127 }
Generated on Sun Jul 17 2022 07:59:16 by
1.7.2
miso dengaku