source: asp3_tinet_ecnl_rx/trunk/app5_temp_sensor/src/echonet_main.c@ 364

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

TINETとSocket APIなどを更新

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