• R/O
  • SSH

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Tunnel(Serial To IEEE1888)


Commit MetaInfo

Revision0986dff3d8aabbc24aa08b27447f62929eb2766b (tree)
Time2015-07-07 22:35:36
Author <15b05@15b0...>

Log Message

update readme, api (issue: Serialのreadが64バイトまでしかバッファがない)

Change Summary

Incremental Difference

diff -r fd01534372df -r 0986dff3d8aa TunnelSerialToIEEE1888/TunnelSerialToIEEE1888.h
--- a/TunnelSerialToIEEE1888/TunnelSerialToIEEE1888.h Tue Jul 07 22:18:19 2015 +0900
+++ b/TunnelSerialToIEEE1888/TunnelSerialToIEEE1888.h Tue Jul 07 22:35:36 2015 +0900
@@ -4,6 +4,11 @@
44 #include <FIAPUploadAgent.h>
55 #include "tunnel_SerialReader.h"
66
7+// ------------------------- グローバル変数 -------------------------
8+
9+// PointSet ID(PointIDのPrefix)
10+extern char fiap_id_prefix[200];
11+
712 // ------------------------- loop関連 -------------------------
813
914 // loopの間隔。
diff -r fd01534372df -r 0986dff3d8aa TunnelSerialToIEEE1888/TunnelSerialToIEEE1888.ino
--- a/TunnelSerialToIEEE1888/TunnelSerialToIEEE1888.ino Tue Jul 07 22:18:19 2015 +0900
+++ b/TunnelSerialToIEEE1888/TunnelSerialToIEEE1888.ino Tue Jul 07 22:35:36 2015 +0900
@@ -24,8 +24,7 @@
2424 const int SERVER_PORT = 80;
2525
2626 // ---------------------- Point設定 ----------------------
27-// PointSet ID(PointIDのPrefix)
28-const char* FIAP_ID_PREFIX = "http://j.kisarazu.ac.jp/Arduino/ANTS/0301/";
27+char fiap_id_prefix[200];
2928
3029 ///////////////////////// MainRoutine /////////////////////////
3130
@@ -44,7 +43,7 @@
4443 }
4544
4645 // FIAPライブラリの初期化
47- fiapUploadAgent.begin(SERVER_HOST, SERVER_PATH, SERVER_PORT, FIAP_ID_PREFIX);
46+ fiapUploadAgent.begin(SERVER_HOST, SERVER_PATH, SERVER_PORT, fiap_id_prefix);
4847
4948 // コアルーチン初期化
5049 initCore();
@@ -56,16 +55,25 @@
5655
5756 tunnel::SerialReader serialReader;
5857
58+boolean delayCanceled = false;
59+
5960 void loop()
6061 {
61- delay(waitMs);
62+ if (delayCanceled) {
63+ delayCanceled = false;
64+ }
65+ else {
66+ delay(waitMs);
67+ }
6268
6369 if (!isRunnable) {
6470 waitMs = 5000;
6571 error("initializing error!");
6672 }
6773 else {
68- serialReader.readOneOperation();
74+ if (serialReader.readOneOperation()) {
75+ delayCanceled = true;
76+ }
6977 tick();
7078 }
7179
@@ -104,4 +112,6 @@
104112 Serial.println(messageBlockSentinel);
105113 }
106114
115+
116+
107117
diff -r fd01534372df -r 0986dff3d8aa TunnelSerialToIEEE1888/core.ino
--- a/TunnelSerialToIEEE1888/core.ino Tue Jul 07 22:18:19 2015 +0900
+++ b/TunnelSerialToIEEE1888/core.ino Tue Jul 07 22:35:36 2015 +0900
@@ -8,25 +8,29 @@
88 sendMessageBegin();
99 Serial.println(">>>>> initialized");
1010 sendMessageEnd();
11+
12+ strcpy(fiap_id_prefix, "http://j.kisarazu.ac.jp/Arduino/ANTS/0301/");
1113 }
1214
1315 void tick()
1416 {
15-
1617 //sendMessageBegin();
1718 //Serial.print(">>>>> ");
1819 //Serial.println(tickPeriod);
1920 //sendMessageEnd();
2021
21- waitMs = 100;
22+ waitMs = 1000;
2223 }
2324
2425 AntsElement antsElement;
2526
2627 void tunnel::invokeCommand(SerialReader* serialReader)
2728 {
28- if (strcmp(serialReader->argumentsString[0], "SetTime") == 0) {
29-
29+ if (strcmp(serialReader->argumentsString[0], "ShowTime") == 0) {
30+
31+ // 操作
32+
33+ // print
3034 sendMessageBegin();
3135 {
3236 char buf[50];
@@ -40,19 +44,35 @@
4044 Serial.println(buf);
4145 }
4246 sendMessageEnd();
43-
47+
4448 return;
4549 }
46- if (strcmp(serialReader->argumentsString[0], "FlushIEEE1888") == 0) {
47-
48- antsElement.flush();
49-
50- Serial.println("[Message]:flush");
51-
50+ if (strcmp(serialReader->argumentsString[0], "SetIdPrefix") == 0) {
51+
52+ // 操作
53+ strcpy(fiap_id_prefix, serialReader->argumentsString[1]);
54+
55+ // print
56+ sendMessageBegin();
57+ Serial.print("Set Id Prefix: ");
58+ Serial.println(fiap_id_prefix);
59+ sendMessageEnd();
60+
5261 return;
5362 }
54- if (strcmp(serialReader->argumentsString[0], "SendIEEE1888") == 0) {
63+ if (strcmp(serialReader->argumentsString[0], "FlushFiapPacket") == 0) {
5564
65+ // 操作
66+ antsElement.flush();
67+
68+ // ptint
69+ Serial.println("[Message]:flush");
70+
71+ return;
72+ }
73+ if (strcmp(serialReader->argumentsString[0], "PushFiapPacket") == 0) {
74+
75+ // 操作
5676 {
5777 DateTime dateTime;
5878 dateTime.year = serialReader->argumentsInt[0];
@@ -61,14 +81,16 @@
6181 dateTime.hour = serialReader->argumentsInt[3];
6282 dateTime.minute = serialReader->argumentsInt[4];
6383 dateTime.second = serialReader->argumentsInt[5];
84+
6485 antsElement.acceptElement(
6586 serialReader->argumentsString[1],
6687 serialReader->argumentsString[2],
6788 dateTime);
6889 }
6990
91+ // print
7092 sendMessageBegin();
71- Serial.println("Send IEEE1888");
93+ Serial.println("Push Fiap Packet");
7294 Serial.println(serialReader->argumentsString[1]);
7395 Serial.println(serialReader->argumentsString[2]);
7496 {
@@ -87,6 +109,7 @@
87109 return;
88110 }
89111
112+ // print
90113 sendMessageBegin();
91114 Serial.print("Command: ");
92115 Serial.println(serialReader->argumentsString[0]);
@@ -103,7 +126,12 @@
103126 Serial.println(serialReader->argumentsString[i]);
104127 }
105128 sendMessageEnd();
129+
106130 }
107131
108132
133+
134+
135+
136+
109137
diff -r fd01534372df -r 0986dff3d8aa TunnelSerialToIEEE1888/readme_serial_api.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/TunnelSerialToIEEE1888/readme_serial_api.txt Tue Jul 07 22:35:36 2015 +0900
@@ -0,0 +1,70 @@
1+
2+■サンプルコマンド文
3+
4+C;SSetIdPrefix;Shttp://j.kisarazu.ac.jp/Arduino/ANTS/0630/;M;C;SPushFiapPacket;I2015;I6;I23;I14;I11;I34;STemperature;S801.3;M;C;SFlushFiapPacket;M;
5+
6+C;SSetIdPrefix;Shttp://j.kisarazu.ac.jp/Arduino/ANTS/0630/;M;
7+C;SPushFiapPacket;I2015;I6;I23;I14;I11;I34;STemperature;S801.3;M;
8+C;SFlushFiapPacket;M;
9+
10+C;
11+SPushFiapPacket;
12+I2015;
13+I6;
14+I23;
15+I14;
16+I11;
17+I34;
18+STemperature;
19+S801.3;
20+M;
21+
22+
23+■命令
24+
25+命令は英大文字で始まって区切り文字で終わる。
26+
27+命令区切り文字: ';', '\n'
28+命令種類:
29+ 'C': 与えた全引数の削除
30+ 'I': 整数型引数のpush 最大100個
31+ 'D': 浮動小数型引数のpush 最大10個
32+ 'S': 文字列型引数のpush(区切り文字は含められない)
33+ '\\'ですべての文字はエスケープ可能。
34+ 最大4個、99文字
35+ 'M': コマンドの実行(引数は維持)
36+
37+※コマンド実行命令'M'のコマンド名は最初に与えた文字列型引数
38+※区切り文字は連続して挿入すると無視される
39+※Arduinoの都合上の問題で、一度に受信バッファに64バイトまでしか格納しておけない。
40+
41+■コマンド一覧
42+
43+コマンド名: SetFiapIdPrefix
44+引数:
45+ S IDのPrefix 例:"http://example.com/Test/Sample/"
46+説明:
47+ IDのPrefixを設定する。
48+ 後続のAPIに影響する。
49+
50+コマンド名: FlushFiapPackets
51+引数: なし
52+説明:
53+ すべてのpushされたパケットを送信する。
54+ なぜか1個しかパケットがないと
55+ 送信時にタイムアウトするまで
56+ ライブラリ内の処理が終わらない。
57+
58+コマンド名: PushFiapPacket
59+引数:
60+ I 年
61+ I 月
62+ I 日
63+ I 時
64+ I 分
65+ I 秒
66+ S cid 例:"Temperature"
67+ S value
68+説明:
69+ FIAPパケットを1個pushする。
70+ 送信されるかどうかは不明。
diff -r fd01534372df -r 0986dff3d8aa TunnelSerialToIEEE1888/samplecommand.txt
--- a/TunnelSerialToIEEE1888/samplecommand.txt Tue Jul 07 22:18:19 2015 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
1-C;SSendIEEE1888;I2015;I6;I23;I14;I11;I34;STemperature;S801.3;M;
2-C;SFlushIEEE1888;M;
diff -r fd01534372df -r 0986dff3d8aa TunnelSerialToIEEE1888/tunnel_SerialReader.h
--- a/TunnelSerialToIEEE1888/tunnel_SerialReader.h Tue Jul 07 22:18:19 2015 +0900
+++ b/TunnelSerialToIEEE1888/tunnel_SerialReader.h Tue Jul 07 22:35:36 2015 +0900
@@ -51,7 +51,7 @@
5151 // 指定キャラクタまで読み込んでbufferに入れる
5252 // @return 正常終了してbufferが更新された場合にtrue
5353 // @param containStopper 指定キャラクタをバッファに含めるかどうか
54- boolean readUntil(char stopper1, char stopper2, boolean containStopper);
54+ boolean readUntil(char stopper1, char stopper2, char escape);
5555
5656 };
5757
diff -r fd01534372df -r 0986dff3d8aa TunnelSerialToIEEE1888/tunnel_SerialReader.ino
--- a/TunnelSerialToIEEE1888/tunnel_SerialReader.ino Tue Jul 07 22:18:19 2015 +0900
+++ b/TunnelSerialToIEEE1888/tunnel_SerialReader.ino Tue Jul 07 22:35:36 2015 +0900
@@ -30,42 +30,97 @@
3030 argumentsStringLength++;
3131 }
3232
33-boolean tunnel::SerialReader::readUntil(char stopper1, char stopper2, boolean containStopper)
33+boolean tunnel::SerialReader::readUntil(
34+char stopper1,
35+char stopper2,
36+char escape)
3437 {
3538 if (!Serial.available()) return false;
3639
40+ // 既に受け取った'\0'を含めない文字列長=これから代入すべき添え字。
41+ // 実際のバッファサイズも超える。
3742 bufferLength = 0;
3843
44+ // この文字はエスケープ済みである
45+ boolean escaped = false;
46+
3947 while (true) {
4048 int c = Serial.read();
4149
50+ // 謎エラー
4251 if (c == -1) {
4352 Serial.println("[Warning]:readUntil -1");
53+ continue;
54+ }
55+
56+ // ストッパーやエスケープ文字が着たか否か
57+ boolean isStopper = (c == stopper1) || (c == stopper2);
58+ boolean isEscape = c == escape;
59+
60+ // この文字が特殊文字として処理されないべきか否か
61+ boolean appendable;
62+
63+ // この文字自体がエスケープ済みなら、
64+ if (escaped) {
65+ escaped = false;
66+
67+ // 特殊文字ではない。
68+ appendable = true;
4469 }
4570 else {
71+ // エスケープ済みではなくて、
4672
47- // bufferLength: これから代入すべき添え字
48- if (!(c == stopper1 || c == stopper2) || containStopper) {
49- if (bufferLength <= BUFFER_MAX_LENGTH - 1 - 1) {
50- buffer[bufferLength] = c;
51- }
73+ // ストッパーやエスケープ文字なら、
74+ if (isStopper || isEscape) {
75+ // 特殊文字として処理されるべき。
76+ appendable = false;
77+ }
78+ else {
79+ // そうでなければ通常文字として処理されるべき。
80+ appendable = true;
81+ }
82+ }
5283
53- bufferLength++;
84+ /////////////////////////////////////////// メイン処理
85+
86+ // この文字が通常文字として処理されるべきならば、
87+ if (appendable) {
88+
89+ // バッファがあふれていなければ、
90+ if (bufferLength <= BUFFER_MAX_LENGTH - 1 - 1) {
91+ // バッファに追加。
92+ buffer[bufferLength] = c;
5493 }
5594
56- // bufferLength: 文字列長
57- if (c == stopper1 || c == stopper2) {
58- if (bufferLength <= BUFFER_MAX_LENGTH - 1) {
59- buffer[bufferLength] = '\0';
60- }
61- else {
62- buffer[BUFFER_MAX_LENGTH - 1] = '\0';
63- }
95+ // どちらにしろ既に受け取った文字列長を増やす。
96+ bufferLength++;
97+ continue;
98+ }
6499
65- break;
100+ // エスケープ文字が来た場合、
101+ if (isEscape) {
102+
103+ // 次の文字をエスケープ済みに指定
104+ escaped = true;
105+
106+ continue;
107+ }
108+
109+ // 区切り文字が来た場合、
110+ if (isStopper) {
111+ // バッファがあふれていなければ、
112+ if (bufferLength <= BUFFER_MAX_LENGTH - 1) {
113+ // 終端文字を追加。
114+ buffer[bufferLength] = '\0';
115+ }
116+ else {
117+ // あふれていても追加。
118+ buffer[BUFFER_MAX_LENGTH - 1] = '\0';
66119 }
67120
121+ break;
68122 }
123+
69124 }
70125
71126 // bufferLength: 文字列長
@@ -87,55 +142,64 @@
87142 int c = Serial.read();
88143 if (c == -1) {
89144 Serial.println("[Warning]:readOneOperation -1");
145+ return false;
90146 }
91147 else if (c == 'I') {
92- if (readUntil('\n', ';', false)) {
148+ if (readUntil('\n', ';', '\\')) {
93149 int value = atoi(buffer);
94150 pushInt(value);
95151 Serial.print("[Message]:(int) ");
96152 Serial.print(value);
97153 Serial.println("");
154+ return true;
98155 }
99- }
156+ }
100157 else if (c == 'D') {
101- if (readUntil('\n', ';', false)) {
158+ if (readUntil('\n', ';', '\\')) {
102159 double value = atof(buffer);
103160 pushDouble(value);
104161 Serial.print("[Message]:(double) ");
105162 Serial.print(value);
106163 Serial.println("");
164+ return true;
107165 }
108- }
166+ }
109167 else if (c == 'S') {
110- if (readUntil('\n', ';', false)) {
168+ if (readUntil('\n', ';', '\\')) {
111169 pushString(buffer);
112170 Serial.print("[Message]:(string) ");
113171 Serial.print(buffer);
114172 Serial.println("");
173+ return true;
115174 }
116175 }
117176 else if (c == 'M') {
118- readUntil('\n', ';', false);
177+ readUntil('\n', ';', '\\');
119178 invokeCommand(this);
179+ return true;
120180 }
121181 else if (c == 'C') {
122- readUntil('\n', ';', false);
182+ readUntil('\n', ';', '\\');
123183 argumentsIntLength = 0;
124184 argumentsDoubleLength = 0;
125185 argumentsStringLength = 0;
126- Serial.println("[Message]:clear");
186+ Serial.println("[Message]:clear operator");
187+ return true;
127188 }
128189 else if (c == '\n') {
129- Serial.println("[Message]:blank");
190+ Serial.println("[Message]:blank operator");
191+ return true;
130192 }
131193 else if (c == ';') {
132- Serial.println("[Message]:blank");
194+ Serial.println("[Message]:blank operator");
195+ return true;
133196 }
134197 else {
135- readUntil('\n', ';', false);
198+ readUntil('\n', ';', '\\');
136199 Serial.print("[Warning]: unknown operator: ");
137200 Serial.print((char) c);
138201 Serial.println("");
202+ return false;
139203 }
140204
141205 return false;