#include <SakuraIO.h>
#include <stdio.h>
// Sakura IO
SakuraIO_I2C sakuraio;
//定数定義
#define SW_PIN 2 //スイッチ入力
//sakura.ioチャンネル定義
#define ORDER_CH 0
#define KEY_REPORT_CH 1
//グローバル変数定義
uint32_t BeforeOrder=0;
uint32_t NowOrder=0;
int BeforeLockKey=0;
int LockKey=0;
int BeforeSakuraPoint=0;
int SakuraPoint=0;
//関数宣言
void ReceptionOrder();
void Reception();
void setup()
{
pinMode(SW_PIN, INPUT);
LockKey = digitalRead(SW_PIN);
BeforeLockKey=LockKey;
Serial.begin(9600);
//IoT通信モジュール関係
Serial.print("Waiting to come online");
for (;;) {
if ((sakuraio.getConnectionStatus() & 0x80) == 0x80) {
Serial.println("");
Serial.println("connected");
break;
}
Serial.print(".");
delay(1000);
}
Serial.println("***********************");
Serial.println("***********************");
Serial.print("SakuraIoPoint=");
Serial.println(SakuraPoint);
//初期化処理
}
/////////////////////////////////////////////
//メインルーチン
/////////////////////////////////////////////
void loop() //プログラム本体(ずっと繰り返す。)
{
//鍵状態の取得
BeforeLockKey=LockKey;
LockKey = digitalRead(SW_PIN);
//IoT送受信処理
ReceptionOrder();
Transmission();
delay(500);//0.5s待つ
}
void ReceptionOrder() {
// 受信キューの状態を取得
uint8_t rxAvailable;
uint8_t rxQueued;
sakuraio.getRxQueueLength(&rxAvailable, &rxQueued);
BeforeOrder=NowOrder;
// 受信キューにたまっているメッセージの数だけ繰り返す
for (uint8_t i = 0; i < rxQueued; i++)
{
uint8_t channel;
uint8_t type;
uint8_t data[8];
int64_t offset;
//キューからのメッセージを取り出し
uint8_t ret = sakuraio.dequeueRx(&channel, &type, data, &offset);
//成功したら以下を実行
if (ret == CMD_ERROR_NONE) {
SakuraPoint++;
SakuraPointCount();
Serial.print("channel: ");
Serial.println(channel);
Serial.print("type: ");
Serial.println((char)type);
Serial.print("value: ");
//バイト列から変換して値をプリント
if (type == 'i') {
memcpy(&NowOrder, &data, sizeof(uint32_t));
Serial.print(i);
Serial.print(":");
Serial.println(NowOrder);
}
} else {
Serial.println("ERROR");
}
}
Reception();
}
//受信時の処理
void Reception()
{
int val=0;
switch(NowOrder)
{
case 0:
break;
case 1://"Module>現在の施錠状態確認します。"
sakuraio.enqueueTx(ORDER_CH,NowOrder);
SakuraioSend();
NowOrder=2;
break;
case 99://"Module>接続確認OKです。"
sakuraio.enqueueTx(ORDER_CH,NowOrder);
SakuraioSend();
NowOrder=0;
break;
default:
break;
}
}
//送信時の処理
void Transmission()
{
switch(NowOrder)
{
case 0:
if(BeforeLockKey!=LockKey)
{
PrintVar();
sakuraio.enqueueTx(ORDER_CH,(uint32_t)102);
sakuraio.enqueueTx(KEY_REPORT_CH,(uint32_t)LockKey);
SakuraioSend();
}
break;
case 2://Module>現在施錠状態報告します。
sakuraio.enqueueTx(ORDER_CH,(uint32_t)(NowOrder+100));
sakuraio.enqueueTx(KEY_REPORT_CH,(uint32_t)LockKey);
SakuraioSend();
NowOrder=0;
PrintVar();
break;
default:
break;
}
}
void SakuraioSend()
{
sakuraio.send();
SakuraPoint++;
SakuraPointCount();
}
void SakuraPointCount()
{
if(SakuraPoint!=BeforeSakuraPoint)
{
Serial.print("SakuraIoPoint=");
Serial.println(SakuraPoint);
}
BeforeSakuraPoint=SakuraPoint;
}
void PrintVar()
{
Serial.print("Lock=");Serial.println(LockKey);
}
|