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

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

ECHONETミドルウェアを起動後、少し待つよう変更。

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