Tunnel(Serial To IEEE1888)
Revision | 0986dff3d8aabbc24aa08b27447f62929eb2766b (tree) |
---|---|
Time | 2015-07-07 22:35:36 |
Author | <15b05@15b0...> |
update readme, api (issue: Serialのreadが64バイトまでしかバッファがない)
@@ -4,6 +4,11 @@ | ||
4 | 4 | #include <FIAPUploadAgent.h> |
5 | 5 | #include "tunnel_SerialReader.h" |
6 | 6 | |
7 | +// ------------------------- グローバル変数 ------------------------- | |
8 | + | |
9 | +// PointSet ID(PointIDのPrefix) | |
10 | +extern char fiap_id_prefix[200]; | |
11 | + | |
7 | 12 | // ------------------------- loop関連 ------------------------- |
8 | 13 | |
9 | 14 | // loopの間隔。 |
@@ -24,8 +24,7 @@ | ||
24 | 24 | const int SERVER_PORT = 80; |
25 | 25 | |
26 | 26 | // ---------------------- 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]; | |
29 | 28 | |
30 | 29 | ///////////////////////// MainRoutine ///////////////////////// |
31 | 30 |
@@ -44,7 +43,7 @@ | ||
44 | 43 | } |
45 | 44 | |
46 | 45 | // 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); | |
48 | 47 | |
49 | 48 | // コアルーチン初期化 |
50 | 49 | initCore(); |
@@ -56,16 +55,25 @@ | ||
56 | 55 | |
57 | 56 | tunnel::SerialReader serialReader; |
58 | 57 | |
58 | +boolean delayCanceled = false; | |
59 | + | |
59 | 60 | void loop() |
60 | 61 | { |
61 | - delay(waitMs); | |
62 | + if (delayCanceled) { | |
63 | + delayCanceled = false; | |
64 | + } | |
65 | + else { | |
66 | + delay(waitMs); | |
67 | + } | |
62 | 68 | |
63 | 69 | if (!isRunnable) { |
64 | 70 | waitMs = 5000; |
65 | 71 | error("initializing error!"); |
66 | 72 | } |
67 | 73 | else { |
68 | - serialReader.readOneOperation(); | |
74 | + if (serialReader.readOneOperation()) { | |
75 | + delayCanceled = true; | |
76 | + } | |
69 | 77 | tick(); |
70 | 78 | } |
71 | 79 |
@@ -104,4 +112,6 @@ | ||
104 | 112 | Serial.println(messageBlockSentinel); |
105 | 113 | } |
106 | 114 | |
115 | + | |
116 | + | |
107 | 117 |
@@ -8,25 +8,29 @@ | ||
8 | 8 | sendMessageBegin(); |
9 | 9 | Serial.println(">>>>> initialized"); |
10 | 10 | sendMessageEnd(); |
11 | + | |
12 | + strcpy(fiap_id_prefix, "http://j.kisarazu.ac.jp/Arduino/ANTS/0301/"); | |
11 | 13 | } |
12 | 14 | |
13 | 15 | void tick() |
14 | 16 | { |
15 | - | |
16 | 17 | //sendMessageBegin(); |
17 | 18 | //Serial.print(">>>>> "); |
18 | 19 | //Serial.println(tickPeriod); |
19 | 20 | //sendMessageEnd(); |
20 | 21 | |
21 | - waitMs = 100; | |
22 | + waitMs = 1000; | |
22 | 23 | } |
23 | 24 | |
24 | 25 | AntsElement antsElement; |
25 | 26 | |
26 | 27 | void tunnel::invokeCommand(SerialReader* serialReader) |
27 | 28 | { |
28 | - if (strcmp(serialReader->argumentsString[0], "SetTime") == 0) { | |
29 | - | |
29 | + if (strcmp(serialReader->argumentsString[0], "ShowTime") == 0) { | |
30 | + | |
31 | + // 操作 | |
32 | + | |
33 | ||
30 | 34 | sendMessageBegin(); |
31 | 35 | { |
32 | 36 | char buf[50]; |
@@ -40,19 +44,35 @@ | ||
40 | 44 | Serial.println(buf); |
41 | 45 | } |
42 | 46 | sendMessageEnd(); |
43 | - | |
47 | + | |
44 | 48 | return; |
45 | 49 | } |
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 | ||
56 | + sendMessageBegin(); | |
57 | + Serial.print("Set Id Prefix: "); | |
58 | + Serial.println(fiap_id_prefix); | |
59 | + sendMessageEnd(); | |
60 | + | |
52 | 61 | return; |
53 | 62 | } |
54 | - if (strcmp(serialReader->argumentsString[0], "SendIEEE1888") == 0) { | |
63 | + if (strcmp(serialReader->argumentsString[0], "FlushFiapPacket") == 0) { | |
55 | 64 | |
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 | + // 操作 | |
56 | 76 | { |
57 | 77 | DateTime dateTime; |
58 | 78 | dateTime.year = serialReader->argumentsInt[0]; |
@@ -61,14 +81,16 @@ | ||
61 | 81 | dateTime.hour = serialReader->argumentsInt[3]; |
62 | 82 | dateTime.minute = serialReader->argumentsInt[4]; |
63 | 83 | dateTime.second = serialReader->argumentsInt[5]; |
84 | + | |
64 | 85 | antsElement.acceptElement( |
65 | 86 | serialReader->argumentsString[1], |
66 | 87 | serialReader->argumentsString[2], |
67 | 88 | dateTime); |
68 | 89 | } |
69 | 90 | |
91 | ||
70 | 92 | sendMessageBegin(); |
71 | - Serial.println("Send IEEE1888"); | |
93 | + Serial.println("Push Fiap Packet"); | |
72 | 94 | Serial.println(serialReader->argumentsString[1]); |
73 | 95 | Serial.println(serialReader->argumentsString[2]); |
74 | 96 | { |
@@ -87,6 +109,7 @@ | ||
87 | 109 | return; |
88 | 110 | } |
89 | 111 | |
112 | ||
90 | 113 | sendMessageBegin(); |
91 | 114 | Serial.print("Command: "); |
92 | 115 | Serial.println(serialReader->argumentsString[0]); |
@@ -103,7 +126,12 @@ | ||
103 | 126 | Serial.println(serialReader->argumentsString[i]); |
104 | 127 | } |
105 | 128 | sendMessageEnd(); |
129 | + | |
106 | 130 | } |
107 | 131 | |
108 | 132 | |
133 | + | |
134 | + | |
135 | + | |
136 | + | |
109 | 137 |
@@ -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 | + 送信されるかどうかは不明。 |
@@ -1,2 +0,0 @@ | ||
1 | -C;SSendIEEE1888;I2015;I6;I23;I14;I11;I34;STemperature;S801.3;M; | |
2 | -C;SFlushIEEE1888;M; |
@@ -51,7 +51,7 @@ | ||
51 | 51 | // 指定キャラクタまで読み込んでbufferに入れる |
52 | 52 | // @return 正常終了してbufferが更新された場合にtrue |
53 | 53 | // @param containStopper 指定キャラクタをバッファに含めるかどうか |
54 | - boolean readUntil(char stopper1, char stopper2, boolean containStopper); | |
54 | + boolean readUntil(char stopper1, char stopper2, char escape); | |
55 | 55 | |
56 | 56 | }; |
57 | 57 |
@@ -30,42 +30,97 @@ | ||
30 | 30 | argumentsStringLength++; |
31 | 31 | } |
32 | 32 | |
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) | |
34 | 37 | { |
35 | 38 | if (!Serial.available()) return false; |
36 | 39 | |
40 | + // 既に受け取った'\0'を含めない文字列長=これから代入すべき添え字。 | |
41 | + // 実際のバッファサイズも超える。 | |
37 | 42 | bufferLength = 0; |
38 | 43 | |
44 | + // この文字はエスケープ済みである | |
45 | + boolean escaped = false; | |
46 | + | |
39 | 47 | while (true) { |
40 | 48 | int c = Serial.read(); |
41 | 49 | |
50 | + // 謎エラー | |
42 | 51 | if (c == -1) { |
43 | 52 | 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; | |
44 | 69 | } |
45 | 70 | else { |
71 | + // エスケープ済みではなくて、 | |
46 | 72 | |
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 | + } | |
52 | 83 | |
53 | - bufferLength++; | |
84 | + /////////////////////////////////////////// メイン処理 | |
85 | + | |
86 | + // この文字が通常文字として処理されるべきならば、 | |
87 | + if (appendable) { | |
88 | + | |
89 | + // バッファがあふれていなければ、 | |
90 | + if (bufferLength <= BUFFER_MAX_LENGTH - 1 - 1) { | |
91 | + // バッファに追加。 | |
92 | + buffer[bufferLength] = c; | |
54 | 93 | } |
55 | 94 | |
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 | + } | |
64 | 99 | |
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'; | |
66 | 119 | } |
67 | 120 | |
121 | + break; | |
68 | 122 | } |
123 | + | |
69 | 124 | } |
70 | 125 | |
71 | 126 | // bufferLength: 文字列長 |
@@ -87,55 +142,64 @@ | ||
87 | 142 | int c = Serial.read(); |
88 | 143 | if (c == -1) { |
89 | 144 | Serial.println("[Warning]:readOneOperation -1"); |
145 | + return false; | |
90 | 146 | } |
91 | 147 | else if (c == 'I') { |
92 | - if (readUntil('\n', ';', false)) { | |
148 | + if (readUntil('\n', ';', '\\')) { | |
93 | 149 | int value = atoi(buffer); |
94 | 150 | pushInt(value); |
95 | 151 | Serial.print("[Message]:(int) "); |
96 | 152 | Serial.print(value); |
97 | 153 | Serial.println(""); |
154 | + return true; | |
98 | 155 | } |
99 | - } | |
156 | + } | |
100 | 157 | else if (c == 'D') { |
101 | - if (readUntil('\n', ';', false)) { | |
158 | + if (readUntil('\n', ';', '\\')) { | |
102 | 159 | double value = atof(buffer); |
103 | 160 | pushDouble(value); |
104 | 161 | Serial.print("[Message]:(double) "); |
105 | 162 | Serial.print(value); |
106 | 163 | Serial.println(""); |
164 | + return true; | |
107 | 165 | } |
108 | - } | |
166 | + } | |
109 | 167 | else if (c == 'S') { |
110 | - if (readUntil('\n', ';', false)) { | |
168 | + if (readUntil('\n', ';', '\\')) { | |
111 | 169 | pushString(buffer); |
112 | 170 | Serial.print("[Message]:(string) "); |
113 | 171 | Serial.print(buffer); |
114 | 172 | Serial.println(""); |
173 | + return true; | |
115 | 174 | } |
116 | 175 | } |
117 | 176 | else if (c == 'M') { |
118 | - readUntil('\n', ';', false); | |
177 | + readUntil('\n', ';', '\\'); | |
119 | 178 | invokeCommand(this); |
179 | + return true; | |
120 | 180 | } |
121 | 181 | else if (c == 'C') { |
122 | - readUntil('\n', ';', false); | |
182 | + readUntil('\n', ';', '\\'); | |
123 | 183 | argumentsIntLength = 0; |
124 | 184 | argumentsDoubleLength = 0; |
125 | 185 | argumentsStringLength = 0; |
126 | - Serial.println("[Message]:clear"); | |
186 | + Serial.println("[Message]:clear operator"); | |
187 | + return true; | |
127 | 188 | } |
128 | 189 | else if (c == '\n') { |
129 | - Serial.println("[Message]:blank"); | |
190 | + Serial.println("[Message]:blank operator"); | |
191 | + return true; | |
130 | 192 | } |
131 | 193 | else if (c == ';') { |
132 | - Serial.println("[Message]:blank"); | |
194 | + Serial.println("[Message]:blank operator"); | |
195 | + return true; | |
133 | 196 | } |
134 | 197 | else { |
135 | - readUntil('\n', ';', false); | |
198 | + readUntil('\n', ';', '\\'); | |
136 | 199 | Serial.print("[Warning]: unknown operator: "); |
137 | 200 | Serial.print((char) c); |
138 | 201 | Serial.println(""); |
202 | + return false; | |
139 | 203 | } |
140 | 204 | |
141 | 205 | return false; |