source: asp3_tinet_ecnl_arm/trunk/app5_temp_sensor/src/echonet_main.c@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 22.0 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2018 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38/*
39 * サンプルプログラム(1)の本体
40 */
41
42#include <kernel.h>
43#include <t_syslog.h>
44#include <t_stdlib.h>
45#include <sil.h>
46#include <string.h>
47#include "syssvc/serial.h"
48#include "syssvc/syslog.h"
49#include "kernel_cfg.h"
50#include "echonet_main.h"
51#include "echonet_cfg.h"
52#include "target_kernel_impl.h"
53#include "gpio_api.h"
54#include "analogin_api.h"
55#include "adafruit_st7735.h"
56#include "draw_font.h"
57
58/* TODO: メーカーコードを設定 */
59#define MAKER_CODE { 0x00, 0x00, 0xB3 } /* TOPPERSプロジェクト */
60
61/* ノードプロファイルオブジェクト */
62struct ecn_cls0EF0_t node_profile_data = {
63 0x30, /* 動作状態 */
64 { 0x01, 0x0A, { 0x01, 0x00 } }, /* Version情報 */
65 {
66 0xFE, /* 下位通信層IDフィールド */
67 { MAKER_CODE }, /* メーカーコード */
68 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, /* ユニークID部(メーカー独自) */
69 },
70 0x0000, /* 異常内容 */
71 { MAKER_CODE }, /* メーカーコード */
72};
73
74/* 温度センサクラス */
75struct ecn_cls0011_t temperature_sensor1_data = {
76 0x30, /* 動作状態 */
77 0xF554, /* 温度計測値 */
78 0x00, /* 設置場所 */
79 { 0x00, 0x00, 'C', 0x00 }, /* 規格Version情報 */
80 0x42, /* 異常発生状態 */
81 { MAKER_CODE }, /* メーカーコード */
82};
83
84/* 温度センサクラス */
85struct ecn_cls0011_t temperature_sensor2_data = {
86 0x30, /* 動作状態 */
87 0xF554, /* 温度計測値 */
88 0x00, /* 設置場所 */
89 { 0x00, 0x00, 'C', 0x00 }, /* 規格Version情報 */
90 0x42, /* 異常発生状態 */
91 { MAKER_CODE }, /* メーカーコード */
92};
93
94/* 湿度センサクラス */
95struct ecn_cls0012_t humidity_sensor_data = {
96 0x30, /* 動作状態 */
97 0x00, /* 相対湿度計測値 */
98 0x00, /* 設置場所 */
99 { 0x00, 0x00, 'C', 0x00 }, /* 規格Version情報 */
100 0x42, /* 異常発生状態 */
101 { MAKER_CODE }, /* メーカーコード */
102};
103
104/*
105 * 動作状態ON/OFF設定関数(0x30, 0x31のみ受け付け)
106 */
107int onoff_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
108{
109 ER ret;
110 uint8_t data[2];
111
112 /* サイズが1以外は受け付けない */
113 if(size != 1)
114 return 0;
115
116 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
117
118 switch(*(uint8_t *)src){
119 /* ONの場合 */
120 case 0x30:
121 /* OFFの場合 */
122 case 0x31:
123 *((uint8_t *)item->exinf) = *((uint8_t *)src);
124 /* メインタスクに通知 */
125 data[0] = 0x80;
126 data[1] = *(uint8_t *)src;
127 ret = ecn_brk_wai(data, sizeof(data));
128 if(ret != E_OK){
129 syslog(LOG_ERROR, "ecn_brk_wai");
130 return 1;
131 }
132 break;
133 /* 0x30か0x31以外は受け付けない */
134 default:
135 return 0;
136 }
137
138 return 1;
139}
140
141/*
142 * 異常発生状態設定関数(0x41, 0x42のみ受け付け)
143 */
144int alarm_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
145{
146 /* サイズが1以外は受け付けない */
147 if(size != 1)
148 return 0;
149
150 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
151
152 switch(*(uint8_t *)src){
153 /* 異常発生ありの場合 */
154 case 0x41:
155 /* 異常発生なしの場合 */
156 case 0x42:
157 *((uint8_t *)item->exinf) = *((uint8_t *)src);
158 break;
159 /* 0x41か0x42以外は受け付けない */
160 default:
161 return 0;
162 }
163
164 return 1;
165}
166
167/*
168 * 温度測定値設定関数
169 */
170int temperature_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
171{
172 struct ecn_cls0011_t *eobj = (struct ecn_cls0011_t *)item->exinf;
173 int16_t value;
174 ER ret;
175 uint8_t data[1];
176
177 /* サイズが2以外は受け付けない */
178 if(size != 2)
179 return 0;
180
181 value = (((uint8_t *)src)[0] << 8) | (((uint8_t *)src)[1] & 0xFF);
182
183 if((value >= -2732) && (value <= 32766)){
184 eobj->propertyE0 = value;
185 /* メインタスクに通知 */
186 data[0] = 0xE0;
187 ret = ecn_brk_wai(data, sizeof(data));
188 if(ret != E_OK){
189 syslog(LOG_ERROR, "ecn_brk_wai");
190 return 2;
191 }
192 }
193 /* 上記以外は受け付けない */
194 else{
195 return 0;
196 }
197
198 return 2;
199}
200
201/*
202 * 温度計測値取得関数
203 */
204int temperature_get(const EPRPINIB *item, void *dst, int size)
205{
206 struct ecn_cls0011_t *eobj = (struct ecn_cls0011_t *)item->exinf;
207 int16_t value = eobj->propertyE0;
208
209 /* サイズが2以外は受け付けない */
210 if(size != 2)
211 return 0;
212
213 ((uint8_t *)dst)[0] = value >> 8;
214 ((uint8_t *)dst)[1] = value & 0xFF;
215
216 return 2;
217}
218
219static void main_initialize();
220static int main_get_timer();
221static void main_progress(int interval);
222static void main_recv_esv(T_EDATA *esv);
223static void main_break_wait(uint8_t *brkdat, int32_t len);
224static void main_timeout();
225
226/*
227 * メインタスク
228 */
229void echonet_main_task(intptr_t exinf)
230{
231 ER ret, ret2;
232 SYSTIM prev, now;
233 int timer;
234 T_EDATA *esv;
235 uint8_t brkdat[64];
236 int32_t len;
237
238 /* アプリケーションの初期化 */
239 main_initialize();
240
241 ret2 = get_tim(&now);
242 if (ret2 != E_OK){
243 syslog(LOG_ERROR, "get_tim");
244 return;
245 }
246
247 for(;;){
248 prev = now;
249
250 /* タイマー取得 */
251 timer = main_get_timer();
252
253 /* 応答電文待ち */
254 ret = ecn_trcv_esv(&esv, timer);
255 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)){
256 syslog(LOG_ERROR, "ecn_trcv_esv");
257 break;
258 }
259
260 ret2 = get_tim(&now);
261 if (ret2 != E_OK){
262 syslog(LOG_ERROR, "get_tim");
263 break;
264 }
265
266 /* 時間経過 */
267 main_progress(now - prev);
268
269 /* Echonet電文受信の場合 */
270 if (ret == E_OK) {
271 /* Echonet電文受信処理 */
272 main_recv_esv(esv);
273
274 /* 領域解放 */
275 ret = ecn_rel_esv(esv);
276 if (ret != E_OK){
277 syslog(LOG_ERROR, "ecn_rel_esv");
278 break;
279 }
280 }
281 /* 応答電文待ちの割り込みの場合 */
282 else if (ret == E_BRK) {
283 /* 応答電文待ちの割り込みデータ取得 */
284 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len);
285 if (ret != E_OK){
286 syslog(LOG_ERROR, "ecn_get_brk_dat");
287 break;
288 }
289
290 /* 応答電文待ちの割り込み処理 */
291 main_break_wait(brkdat, len);
292
293 /* 領域解放 */
294 ret = ecn_rel_esv(esv);
295 if (ret != E_OK){
296 syslog(LOG_ERROR, "ecn_rel_esv");
297 break;
298 }
299 }
300
301 /* タイムアウト処理 */
302 main_timeout();
303 }
304}
305
306bool_t started = false;
307
308void echonet_change_netif_link(uint8_t link_up, uint8_t up)
309{
310 ER ret;
311
312 if (link_up == 0)
313 return;
314
315 if (up && !started) {
316 started = true;
317
318 /* ECHONETミドルウェアを起動 */
319 ret = ecn_sta_svc();
320 if (ret != E_OK)
321 return;
322
323 /* ECHONETミドルウェアを起動するのを待つ */
324 dly_tsk(100);
325 }
326
327 /* メインタスクに通知 */
328 uint8_t data[2];
329 data[0] = 0x01;
330 data[1] = up ? 0x01 : 0x02;
331 ret = ecn_brk_wai(data, sizeof(data));
332 if (ret != E_OK) {
333 syslog(LOG_ERROR, "ecn_brk_wai");
334 return;
335 }
336}
337
338enum main_state_t{
339 main_state_idle,
340};
341
342int main_timer = TMO_FEVR;
343enum main_state_t main_state = main_state_idle;
344
345int main_lcd_timer = TMO_FEVR;
346int main_lcd_state = 0;
347
348gpio_t pow_led;
349analogin_t analogin[3];
350
351/* ジョイスティック種別 */
352#define BUTTON_NONE 0
353#define BUTTON_DOWN 1
354#define BUTTON_LEFT 2
355#define BUTTON_SELECT 3
356#define BUTTON_UP 4
357#define BUTTON_RIGHT 5
358
359analogin_t joystick;
360static uint8_t main_read_button(analogin_t *obj);
361
362bool_t main_btn1_state;
363int main_btn1_count = 0;
364bool_t main_btn2_state;
365int main_btn2_count = 0;
366
367LCD_Handler_t lcd;
368LCD_DrawProp_t drawProp;
369
370/*
371 * 初期化
372 */
373static void main_initialize()
374{
375 uint8_t btn;
376
377 /* LEDの初期化 */
378 gpio_init_out(&pow_led, LED_USER);
379
380 /* アナログ入力の初期化 */
381 analogin_init(&analogin[0], A0);
382 analogin_init(&analogin[1], A1);
383 analogin_init(&analogin[2], A2);
384
385 /* ジョイスティックの初期化 */
386 analogin_init(&joystick, P1_12);
387
388 /* 10ms後にボタン状態を確認 */
389 main_timer = 10 * 1000;
390
391 /* ボタン状態読み込み */
392 btn = main_read_button(&joystick);
393 main_btn1_state = btn == BUTTON_LEFT;
394 main_btn2_state = btn == BUTTON_RIGHT;
395
396 // 1.8" TFTの初期化
397 spi_init(&lcd.hspi, P10_14, P10_15, P10_12, NC);
398 spi_format(&lcd.hspi, 8, 0, 0);
399 spi_frequency(&lcd.hspi, 1000000);
400
401 gpio_init_out(&lcd.cs_pin, P10_13);
402 gpio_init_out(&lcd.rs_pin, P8_15);
403 gpio_init_out(&lcd.rst_pin, P8_14);
404 gpio_init_out(&lcd.cs2_pin, NC);
405
406 lcd_initR(&lcd, /*INITR_REDTAB?*/INITR_18BLACKTAB);
407
408 drawProp.hlcd = &lcd;
409 drawProp.TextColor = ST7735_BLACK;
410 drawProp.BackColor = ST7735_WHITE;
411 drawProp.pFont = NULL;
412 lcd_fillScreen(&drawProp);
413
414 /* 1秒後にLCD表示を更新 */
415 main_lcd_state = 10;
416 main_lcd_timer = 1000 * 1000;
417
418 ER ret = act_tsk(MAIN_TASK);
419 if (ret != E_OK) {
420 syslog(LOG_ERROR, "act_tsk");
421 }
422}
423
424/*
425 * タイマー取得
426 */
427static int main_get_timer()
428{
429 int result = main_timer;
430
431 if((result == TMO_FEVR)
432 || ((main_lcd_timer != TMO_FEVR) && (main_lcd_timer < result))){
433 result = main_lcd_timer;
434 }
435
436 return result;
437}
438
439/*
440 * 時間経過
441 */
442static void main_progress(int interval)
443{
444 if(main_timer != TMO_FEVR){
445 main_timer -= interval;
446 if(main_timer < 0){
447 main_timer = 0;
448 }
449 }
450
451 if(main_lcd_timer != TMO_FEVR){
452 main_lcd_timer -= interval;
453 if(main_lcd_timer < 0){
454 main_lcd_timer = 0;
455 }
456 }
457}
458
459static bool_t check_response(uint8_t pdc, uint8_t *p_edt);
460
461/*
462 * Echonet電文受信処理
463 */
464static void main_recv_esv(T_EDATA *esv)
465{
466 ER ret;
467 uint8_t epc;
468 uint8_t pdc;
469 uint8_t p_edt[256];
470 T_ENUM_EPC enm;
471 bool_t in_get = false;
472
473 ret = ecn_itr_ini(&enm, esv);
474 if(ret != E_OK){
475 syslog(LOG_ERROR, "ecn_itr_ini");
476 return;
477 }
478
479 for(;;) {
480 while((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
481 switch (epc) {
482 case 0xE0:
483 if(in_get && (esv->hdr.edata.esv == ESV_SET_GET_RES)){
484 check_response(pdc, p_edt);
485 }
486 break;
487 }
488 }
489 if(ret != E_BOVR){
490 syslog(LOG_ERROR, "ecn_itr_nxt");
491 break;
492 }
493 if(enm.is_eof)
494 break;
495
496 /* GET_SETのGETへ */
497 in_get = true;
498 }
499}
500
501/*
502 * 応答電文待ちの割り込み処理
503 */
504static void main_break_wait(uint8_t *brkdat, int32_t len)
505{
506 if (brkdat[0] == 0x01) {
507 // Link up/down
508 return;
509 }
510
511 if ((len == 2) && (brkdat[0] == 0x80)) {
512 switch(brkdat[1]){
513 /* ONの場合 */
514 case 0x30:
515 /* LEDをON */
516 gpio_write(&pow_led, 1);
517 break;
518 /* OFFの場合 */
519 case 0x31:
520 /* LEDをOFF */
521 gpio_write(&pow_led, 0);
522 break;
523 }
524 }
525}
526
527static void main_ontimer();
528static void main_lcd_ontimer();
529
530/*
531 * タイムアウト処理
532 */
533static void main_timeout()
534{
535 if(main_timer == 0){
536 main_ontimer();
537 }
538
539 if(main_lcd_timer == 0){
540 main_lcd_ontimer();
541 }
542}
543
544#define main_ad_count 3
545static int16_t main_ad_tempr[main_ad_count] = { 200, 200, 200 };
546static uint16_t main_ad_table[64];
547#define main_ad_table_count (sizeof(main_ad_table) / sizeof(main_ad_table[0]))
548static int main_ad_pos = 0;
549static uint32_t main_ad_avelage[main_ad_count];
550static int main_count[main_ad_count];
551
552static void main_ad_change(int no, int adv);
553static void main_btn1_change(bool_t push);
554static void main_btn2_change(bool_t push);
555
556static void main_ontimer()
557{
558 uint8_t btn;
559 uint16_t ad_value;
560 int16_t ad_tempr;
561
562 switch(main_state){
563 case main_state_idle:
564 /* 10ms後にボタン状態を確認 */
565 main_timer = 10 * 1000;
566
567 /* ADCの変換結果取得 */
568 for (int i = 0; i < main_ad_count; i++) {
569 main_ad_avelage[i] -= main_ad_table[main_ad_pos];
570 ad_value = analogin_read_u16(&analogin[i]) >> 4; // 16bit値取得->12bit
571 main_ad_table[main_ad_pos] = ad_value;
572 main_ad_avelage[i] += ad_value;
573 }
574
575 main_ad_pos++;
576 if(main_ad_pos >= main_ad_table_count){
577 main_ad_pos = 0;
578 }
579
580 for (int i = 0; i < main_ad_count; i++) {
581 ad_tempr = ((int16_t)(((main_ad_avelage[i] / main_ad_table_count) >> 3) & 0x1FF)) - 100;
582 if (main_ad_tempr[i] != ad_tempr) {
583 /* 1秒変化が続いたら */
584 if (main_count[i] < 100) {
585 main_count[i]++;
586 }
587 else {
588 main_ad_tempr[i] = ad_tempr;
589
590 /* ADC状態変化処理 */
591 main_ad_change(i + 1, ad_tempr);
592 }
593 }
594 else {
595 main_count[i] = 0;
596 }
597 }
598
599 /* ボタン状態読み込み */
600 btn = main_read_button(&joystick);
601
602 /* ボタン1の処理 */
603 if((btn == BUTTON_LEFT) && !main_btn1_state){
604 main_btn1_count++;
605 if(main_btn1_count > 10){
606 main_btn1_count = 0;
607 main_btn1_state = true;
608
609 main_btn1_change(true);
610 }
611 }
612 else if((btn != BUTTON_LEFT) && main_btn1_state){
613 main_btn1_count++;
614 if(main_btn1_count > 10){
615 main_btn1_count = 0;
616 main_btn1_state = false;
617
618 main_btn1_change(false);
619 }
620 }
621
622 /* ボタン2の処理 */
623 if((btn == BUTTON_RIGHT) && !main_btn2_state){
624 main_btn2_count++;
625 if(main_btn2_count > 10){
626 main_btn2_count = 0;
627 main_btn2_state = true;
628
629 main_btn2_change(true);
630 }
631 }
632 else if((btn != BUTTON_RIGHT) && main_btn2_state){
633 main_btn2_count++;
634 if(main_btn2_count > 10){
635 main_btn2_count = 0;
636 main_btn2_state = false;
637
638 main_btn2_change(false);
639 }
640 }
641 break;
642 }
643}
644
645static void main_lcd_ontimer()
646{
647 char temp1[] = "温度1:+00.0℃";
648 char temp2[] = "温度2:+00.0℃";
649 char humid[] = "湿度 :+00.0%";
650 char *btn_texts[] = { "none ", "down ", "left ", "select", "up ", "right " };
651 int temp, btn;
652
653 switch (main_lcd_state) {
654 case 0:
655 temp1[9] = (temperature_sensor1_data.propertyE0 >= 0) ? ' ' : '-';
656 temp = (temperature_sensor1_data.propertyE0 / 1000) % 10;
657 if (temp < 0)
658 temp = -temp;
659 temp1[10] = '0' + temp;
660 temp = (temperature_sensor1_data.propertyE0 / 100) % 10;
661 if (temp < 0)
662 temp = -temp;
663 temp1[11] = '0' + temp;
664 temp = (temperature_sensor1_data.propertyE0 / 10) % 10;
665 if (temp < 0)
666 temp = -temp;
667 temp1[13] = '0' + temp;
668 lcd_drawString(&lcd, &temp1[9], X_LINE_HALF_TO_PIX(&lcd, 8) + 10, Y_ROW_TO_PIX(&lcd, main_lcd_state + 4) + 10, ST7735_BLACK, ST7735_WHITE);
669 main_lcd_state++;
670 break;
671 case 1:
672 temp2[9] = (temperature_sensor2_data.propertyE0 >= 0) ? ' ' : '-';
673 temp = (temperature_sensor2_data.propertyE0 / 1000) % 10;
674 if (temp < 0)
675 temp = -temp;
676 temp2[10] = '0' + temp;
677 temp = (temperature_sensor2_data.propertyE0 / 100) % 10;
678 if (temp < 0)
679 temp = -temp;
680 temp2[11] = '0' + temp;
681 temp = (temperature_sensor2_data.propertyE0 / 10) % 10;
682 if (temp < 0)
683 temp = -temp;
684 temp2[13] = '0' + temp;
685 lcd_drawString(&lcd, &temp2[9], X_LINE_HALF_TO_PIX(&lcd, 8) + 10, Y_ROW_TO_PIX(&lcd, main_lcd_state + 4) + 10, ST7735_BLACK, ST7735_WHITE);
686 main_lcd_state++;
687 break;
688 case 2:
689 humid[9] = ' ';
690 temp = (humidity_sensor_data.propertyE0 / 1000) % 10;
691 humid[10] = '0' + temp;
692 temp = (humidity_sensor_data.propertyE0 / 100) % 10;
693 humid[11] = '0' + temp;
694 temp = (humidity_sensor_data.propertyE0 / 10) % 10;
695 humid[13] = '0' + temp;
696 lcd_drawString(&lcd, &humid[9], X_LINE_HALF_TO_PIX(&lcd, 8) + 10, Y_ROW_TO_PIX(&lcd, main_lcd_state + 4) + 10, ST7735_BLACK, ST7735_WHITE);
697 main_lcd_state++;
698 break;
699 case 3:
700 case 4:
701 case 5:
702 main_lcd_state++;
703 break;
704 case 6:
705 btn = main_read_button(&joystick);
706 lcd_drawString(&lcd, btn_texts[btn], X_LINE_TO_PIX(&lcd, 0) + 10, Y_ROW_TO_PIX(&lcd, 10) + 10, ST7735_BLACK, ST7735_WHITE);
707 main_lcd_state++;
708 break;
709 case 9:
710 main_lcd_state = 0;
711 break;
712 case 10:
713 lcd_drawString(&lcd, "温度湿度計", X_LINE_TO_PIX(&lcd, 9) + 10, Y_ROW_TO_PIX(&lcd, 0) + 10, ST7735_BLACK, ST7735_WHITE);
714 lcd_drawString(&lcd, temp1, X_LINE_TO_PIX(&lcd, 0) + 10, Y_ROW_TO_PIX(&lcd, 0 + 4) + 10, ST7735_BLACK, ST7735_WHITE);
715 lcd_drawString(&lcd, temp2, X_LINE_TO_PIX(&lcd, 0) + 10, Y_ROW_TO_PIX(&lcd, 1 + 4) + 10, ST7735_BLACK, ST7735_WHITE);
716 lcd_drawString(&lcd, humid, X_LINE_TO_PIX(&lcd, 0) + 10, Y_ROW_TO_PIX(&lcd, 2 + 4) + 10, ST7735_BLACK, ST7735_WHITE);
717 main_lcd_state = 0;
718 break;
719 default:
720 main_lcd_state++;
721 break;
722 }
723
724 /* 100ms後にLCD表示を更新 */
725 main_lcd_timer = 100 * 1000;
726}
727
728/*
729 * ADC状態変化処理
730 */
731static void main_ad_change(int no, int adv)
732{
733 ER ret;
734 T_EDATA *esv;
735 uint8_t p_edt[2];
736 uint8_t eobj;
737
738 switch (no) {
739 case 1:
740 eobj = TEMP_SENSOR_01_EOBJ;
741 break;
742 case 2:
743 eobj = TEMP_SENSOR_02_EOBJ;
744 break;
745 case 3:
746 eobj = HUMIDITY_SENSOR_EOBJ;
747 break;
748 default:
749 return;
750 }
751
752 p_edt[0] = ((uint16_t)adv) >> 8;
753 p_edt[1] = ((uint16_t)adv) & 0xFF;
754
755 /* プロパティ設定電文作成 */
756 ret = ecn_esv_setc(&esv, eobj, 0xE0, 2, p_edt);
757 if(ret != E_OK){
758 syslog(LOG_ERROR, "ecn_esv_setc");
759 return;
760 }
761
762 /* 電文送信 */
763 ecn_snd_esv(esv);
764}
765
766static uint8_t main_read_button(analogin_t *obj)
767{
768 float a = analogin_read(obj);
769
770 a *= 5.0;
771
772 //printf("Button read analog = %f\r\n",a);
773 if (a < 0.2)
774 return BUTTON_DOWN;
775 if (a < 1.0)
776 return BUTTON_RIGHT;
777 if (a < 1.7)
778 return BUTTON_SELECT;
779 if (a < 2.6)
780 return BUTTON_UP;
781 if (a < 4.6)
782 return BUTTON_LEFT;
783 else
784 return BUTTON_NONE;
785}
786
787int16_t main_tmpr = 200; /* 20.0℃ */
788
789/*
790 * ボタン1状態変化処理
791 */
792static void main_btn1_change(bool_t push)
793{
794 ER ret;
795 T_EDATA *esv;
796 uint8_t p_edt[2];
797 int trn_pos;
798
799 /* 押されて戻った時に処理する */
800 if(push)
801 return;
802
803 /* 温度計測値 */
804 main_tmpr -= 10; /* - 1.0℃ */
805 if(main_tmpr < -100) /* -10.0℃までとする */
806 main_tmpr = -100;
807
808 p_edt[0] = ((uint16_t)main_tmpr) >> 8;
809 p_edt[1] = ((uint16_t)main_tmpr) & 0xFF;
810
811 /* プロパティ値書き込み・読み出し要求電文作成 */
812 ret = ecn_esv_set_get(&esv, TEMP_SENSOR_02_EOBJ, 0xE0, 2, p_edt);
813 if(ret != E_OK){
814 syslog(LOG_ERROR, "ecn_esv_setc");
815 return;
816 }
817
818 p_edt[0] = 0x30;
819
820 /* 書き込みプロパティ追加 */
821 ret = ecn_add_edt(esv, 0x80, 1, p_edt);
822 if(ret) {
823 syslog(LOG_ERROR, "ecn_add_edt");
824 goto error;
825 }
826
827 /* プロパティ値書き込み・読み出し要求電文作成:折り返し指定 */
828 ret = ecn_trn_set_get(esv, &trn_pos);
829 if(ret) {
830 syslog(LOG_ERROR, "ecn_trn_set_get");
831 goto error;
832 }
833
834 /* 読み出しプロパティ追加 */
835 ret = ecn_add_epc(esv, 0xE0);
836 if(ret) {
837 syslog(LOG_ERROR, "ecn_add_epc");
838 goto error;
839 }
840
841 /* プロパティ値書き込み・読み出し要求電文作成:終了指定 */
842 ret = ecn_end_set_get(esv, trn_pos);
843 if(ret) {
844 syslog(LOG_ERROR, "ecn_end_set_get");
845 goto error;
846 }
847
848 /* 電文送信 */
849 ret = ecn_snd_esv(esv);
850 if(ret != E_OK){
851 syslog(LOG_ERROR, "ecn_snd_esv");
852 }
853 return;
854error:
855 /* 領域解放 */
856 ret = ecn_rel_esv(esv);
857 if (ret != E_OK){
858 syslog(LOG_ERROR, "ecn_rel_esv");
859 }
860}
861
862/*
863 * ボタン2状態変化処理
864 */
865static void main_btn2_change(bool_t push)
866{
867 ER ret;
868 T_EDATA *esv;
869 uint8_t p_edt[2];
870 int trn_pos;
871
872 /* 押されて戻った時に処理する */
873 if(push)
874 return;
875
876 /* 温度計測値 */
877 main_tmpr += 10; /* + 1.0℃ */
878 if(main_tmpr > 400) /* +40.0℃までとする */
879 main_tmpr = 400;
880
881 p_edt[0] = ((uint16_t)main_tmpr) >> 8;
882 p_edt[1] = ((uint16_t)main_tmpr) & 0xFF;
883
884 /* プロパティ値書き込み・読み出し要求電文作成 */
885 ret = ecn_esv_set_get(&esv, TEMP_SENSOR_02_EOBJ, 0xE0, 2, p_edt);
886 if(ret != E_OK){
887 syslog(LOG_ERROR, "ecn_esv_setc");
888 return;
889 }
890
891 p_edt[0] = 0x30;
892
893 /* 書き込みプロパティ追加 */
894 ret = ecn_add_edt(esv, 0x80, 1, p_edt);
895 if(ret) {
896 syslog(LOG_ERROR, "ecn_add_edt");
897 goto error;
898 }
899
900 /* プロパティ値書き込み・読み出し要求電文作成:折り返し指定 */
901 ret = ecn_trn_set_get(esv, &trn_pos);
902 if(ret) {
903 syslog(LOG_ERROR, "ecn_trn_set_get");
904 goto error;
905 }
906
907 /* 読み出しプロパティ追加 */
908 ret = ecn_add_epc(esv, 0xE0);
909 if(ret) {
910 syslog(LOG_ERROR, "ecn_add_epc");
911 goto error;
912 }
913
914 /* プロパティ値書き込み・読み出し要求電文作成:終了指定 */
915 ret = ecn_end_set_get(esv, trn_pos);
916 if(ret) {
917 syslog(LOG_ERROR, "ecn_end_set_get");
918 goto error;
919 }
920
921 /* 電文送信 */
922 ret = ecn_snd_esv(esv);
923 if(ret != E_OK){
924 syslog(LOG_ERROR, "ecn_snd_esv");
925 }
926 return;
927error:
928 /* 領域解放 */
929 ret = ecn_rel_esv(esv);
930 if (ret != E_OK){
931 syslog(LOG_ERROR, "ecn_rel_esv");
932 }
933}
934
935/*
936 * ボタンによる温度設定結果確認
937 */
938static bool_t check_response(uint8_t pdc, uint8_t *p_edt)
939{
940 if((pdc != 2)
941 || (p_edt[0] != ((uint16_t)main_tmpr) >> 8)
942 || (p_edt[1] != ((uint16_t)main_tmpr) & 0xFF))
943 {
944 syslog(LOG_WARNING, "epc_set_get response NG");
945 return false;
946 }
947 return true;
948}
Note: See TracBrowser for help on using the repository browser.