stackable sakura.io board for patlite

Dependencies:   SakuraIO mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }