Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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