3232* O Arduino Nano comunica-se por via serial sobre USB com a TV-Box. O protocolo de comunicação está na classe SerialProtocol.
3333* São mensagens de quadro encapsuladas com os caracteres '<' e '>'. No interior do quadro é possível usar o caracter de escape para: '\<', '\>' e '\\'.
3434* A semântica das mensagens é específica para a aplicação IFSPresente.
35- * Há seis tipos de mensagens.
36- * * <100,0,0> → PING
37- * * <200,TEXTO,TIMEOUT> → TIME (Linha 0, para sala, data e hora)
38- * * <300,TEXTO,TIMEOUT> → LECTURE_NAME (Linha 1, para nome da palestra)
39- * * <400,TEXTO,TIMEOUT> → SPEAKER (Linha 2, para nome do palestrante)
40- * * <500,TEXTO,TIEMOUT> → ATTENDEE (Linha 3, aponta participante registrado
41- * * <600,0,0> → SUCCESS (Beep de sucesso no registro)
42- * * <601,0,0> → FAIL (Beep de falha no registro)
43- * * <700,HH:MM:SS,0> → SETTIME (Define a hora do RTC)
44- * * <701,0,0> → GETTIME (Recebe a hora do RTC)
45- *
35+ * Há nove tipos de mensagens emitidas pela TV-Box.
36+ * * <100|0|0> → PING
37+ * * <200|TEXTO|TIMEOUT> → TIME (Linha 0, para sala, data e hora)
38+ * * <300|TEXTO|TIMEOUT> → LECTURE_NAME (Linha 1, para nome da palestra)
39+ * * <400|TEXTO|TIMEOUT> → SPEAKER (Linha 2, para nome do palestrante)
40+ * * <500|TEXTO|TIEMOUT> → ATTENDEE (Linha 3, aponta participante registrado
41+ * * <600|0|0> → SUCCESS (Beep de sucesso no registro)
42+ * * <601|0|0> → FAIL (Beep de falha no registro)
43+ * * <700|YYYY:MM:DD:HH:MM:SS|0> → SETTIME (Define a hora do RTC)
44+ * * <701|0|0> → GETTIME (Recebe a hora do RTC)
45+ *
46+ * O Arduino responde com três tipos de mensagens.
47+ * * <001|uptime em milissegundos|versão de firmware> → Resposta ao ping
48+ * * <003|YYYY:MM:DD:HH:MM:SS|temperatura> → Resposta ao gettime
49+ * * <002|OK|> → Resposta aos demais comandos
50+ *
4651* Outras aplicações podem definir outros modelos de mensagens nos quadros do protocolo.
4752*/
4853
8489#define LOOP_DELAY 10 /* *< Tempo em que o loop principal do código do Arduino dorme à espera de uma mensagem */
8590#define KEEP_AT_ZERO 1 /* *< Quando um texto é exibido numa linha do display, deve ficar um tempo a mais antes de iniciar o _scroll_ */
8691#define KEEP_AT_LAST 1 /* *< Quando um texto é exibido numa linha do display, deve ficar um tempo a mais antes de reiniciar o _scroll_ */
92+ /* * @} */
8793
94+ /* *
95+ * @struct ProtocolMessage
96+ * @brief Representa a decodificação de uma mensagem recebida.
97+ *
98+ * Uma mensagem num quadro vem em três campos separados por '|', <code|message|TTL>.
99+ */
88100struct ProtocolMessage {
89- int code;
90- int TTL;
91- char message[MAX_STRING+1 ];
101+ int code; /* *< Código do serviço solicitado. */
102+ int TTL; /* *< Tempo de vida para mensagens que são exibidas no _display_. */
103+ char message[MAX_STRING+1 ]; /* *< Mensagem. */
92104};
105+
106+ /* *
107+ * @var ProtocolMessage netMessage
108+ * @brief Mantém uma única mensagem recebida.
109+ */
93110ProtocolMessage netMessage;
94111
112+ /* *
113+ * @struct Display
114+ * @brief Representa o estado de uma linha do display LCD.
115+ *
116+ * Esta estrutura guarda a mensagem principal, a mensagem padrão, a parte da
117+ * mensagem que deve ser impressa no momento, além de informações de tamanho,
118+ * posição e tempo de vida (TTL).
119+ */
95120struct Display {
96- char message[MAX_STRING + 1 ];
97- char defaultMessage[MAX_STRING + 1 ];
98- char toPrint[COL+1 ];
99- int messageSize;
100- int defaultMessageSize;
101- int startPosition;
102- byte keepAtZeroPosition;
103- unsigned long TTL;
121+ char message[MAX_STRING + 1 ]; /* *< Mensagem atual a ser exibida. */
122+ char defaultMessage[MAX_STRING + 1 ]; /* *< Mensagem padrão quando nenhuma outra estiver ativa. */
123+ char toPrint[COL+1 ]; /* *< Parte da mensagem que é impressa no display num dado momento. */
124+ int messageSize; /* *< Tamanho da mensagem atual. */
125+ int defaultMessageSize; /* *< Tamanho da mensagem padrão. */
126+ int startPosition; /* *< Posição inicial na mensagem a partir da qual imprime-se no display. */
127+ byte keepAtZeroPosition; /* *< Quando o trecho inicial da mensagem está sendo impresso, permanece por um tempo maior nesse estado. */
128+ unsigned long TTL; /* *< Tempo de vida da mensagem em milissegundos. Após esse período, retorna à mensagem _default_ */
104129};
105130
131+ /* *
132+ * @var Display dispArray[ROW]
133+ * @brief Informações para as quatro linhas do Display.
134+ *
135+ * Contém as quatro linhas do display LCD. Cada posição tem:
136+ * - Mensagem atual (`message`)
137+ * - Mensagem padrão (`defaultMessage`)
138+ * - Texto a imprimir (`toPrint`)
139+ * - Tamanho da mensagem (ajustado em `setup()`)
140+ * - Tamanho da mensagem padrão (ajustado em `setup()`)
141+ * - Posição inicial da string a partir da onde imprime no display
142+ * - Tempo de vida (TTL) de impressão da mensagem
143+ *
144+ * Inicialmente preenchido com mensagens padrão do sistema:
145+ * - Linha 0 → "IFSPresente"
146+ * - Linha 1 → "Local Disponivel"
147+ * - Linha 2 → "Sem reserva de palestrante"
148+ * - Linha 3 → "Aguardando Registro"
149+ */
106150Display dispArray[ROW] = {
107151 {" " , " IFSPresente" , " " , 0 , 0 , 0 , KEEP_AT_ZERO, 0 },
108152 {" " , " Local Disponivel" , " " , 0 , 0 , 0 , KEEP_AT_ZERO, 0 },
@@ -113,9 +157,20 @@ Display dispArray[ROW] = {
113157
114158
115159char strReply[80 ];
116- char auxStr[80 ];
160+ char auxStr[80 ];
161+
162+ /* *
163+ * @var unsigned long uptime
164+ * @brief Tempo em que o Arduino está ligado em milissegundos.
165+ */
117166unsigned long uptime;
167+
118168LiquidCrystal_I2C lcd (ADDRESS,COL,ROW); // Chamada da funcação LiquidCrystal para ser usada com o I2C
169+
170+ /* *
171+ * @var SerialProtocol usbProto
172+ * @brief Classe que implementa a transmissão e recepção de quadros pela serial sobre USB.
173+ */
119174SerialProtocol usbProto;
120175
121176/* ****************************************************************************/
@@ -209,13 +264,13 @@ void atualizaDisplay(int lines) {
209264void parseMessage () {
210265 char * strtokIndx; // this is used by strtok() as an index
211266 usbProto.removeAccentMarker (usbProto.receivedChars );
212- strtokIndx = strtok (usbProto.receivedChars ," , " ); // O código da mensagem
267+ strtokIndx = strtok (usbProto.receivedChars ," | " ); // O código da mensagem
213268 netMessage.code = atoi (strtokIndx);
214269
215- strtokIndx = strtok (NULL , " , " ); // A mensagem
270+ strtokIndx = strtok (NULL , " | " ); // A mensagem
216271 strcpy (netMessage.message , strtokIndx);
217272
218- strtokIndx = strtok (NULL , " , " ); // Tempo de vida da mensagem em milissegundos
273+ strtokIndx = strtok (NULL , " | " ); // Tempo de vida da mensagem em milissegundos
219274 netMessage.TTL = atoi (strtokIndx);
220275}
221276
@@ -253,22 +308,22 @@ void loop()
253308 switch (netMessage.code ) {
254309 case PING:
255310 strReply[0 ] = ' \0 ' ;
256- strcat (strReply, " 001, " );
311+ strcat (strReply, " 001| " );
257312 uptime = millis ();
258313 itoa ( uptime, auxStr, 10 );
259314 strcat (strReply, auxStr);
260315 usbProto.sendFrame (strReply);
261316 break ;
262317 case TIME:
263- usbProto.sendFrame (" 002, OK" );
318+ usbProto.sendFrame (" 002| OK" );
264319 strcpy (dispArray[0 ].message , netMessage.message );
265320 dispArray[0 ].messageSize = strlen (netMessage.message );
266321 dispArray[0 ].TTL = millis () + netMessage.TTL ;
267322 dispArray[0 ].startPosition = 0 ;
268323 dispArray[0 ].keepAtZeroPosition = KEEP_AT_ZERO;
269324 break ;
270325 case LECTURE_NAME:
271- usbProto.sendFrame (" 002, OK" );
326+ usbProto.sendFrame (" 002| OK" );
272327 strcpy (dispArray[1 ].message , netMessage.message );
273328 dispArray[1 ].messageSize = strlen (netMessage.message );
274329 dispArray[1 ].TTL = millis () + netMessage.TTL ;
@@ -277,15 +332,15 @@ void loop()
277332
278333 break ;
279334 case SPEAKER:
280- usbProto.sendFrame (" 002, OK" );
335+ usbProto.sendFrame (" 002| OK" );
281336 strcpy (dispArray[2 ].message , netMessage.message );
282337 dispArray[2 ].messageSize = strlen (netMessage.message );
283338 dispArray[2 ].TTL = millis () + netMessage.TTL ;
284339 dispArray[2 ].startPosition = 0 ;
285340 dispArray[2 ].keepAtZeroPosition = KEEP_AT_ZERO;
286341 break ;
287342 case ATTENDEE:
288- usbProto.sendFrame (" 002, OK" );
343+ usbProto.sendFrame (" 002| OK" );
289344 strcpy (dispArray[3 ].message , netMessage.message );
290345 dispArray[3 ].messageSize = strlen (netMessage.message );
291346 dispArray[3 ].TTL = millis () + netMessage.TTL ;
@@ -294,11 +349,11 @@ void loop()
294349 atualizaDisplay (3 ); // Atualiza forçosamente só a linha 3, o display fica mais responsivo a tecladas rápidas.
295350 break ;
296351 case SUCCESS:
297- usbProto.sendFrame (" 002, OK" );
352+ usbProto.sendFrame (" 002| OK" );
298353 tone (BUZZER,1000 ,150 );
299354 break ;
300355 case FAIL:
301- usbProto.sendFrame (" 002, OK" );
356+ usbProto.sendFrame (" 002| OK" );
302357 tone (BUZZER,2000 ,150 );
303358 delay (300 );
304359 tone (BUZZER,2000 ,150 );
0 commit comments