source: asp3_tinet_ecnl_arm/trunk/app2_light/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: 19.4 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 "rtc_api.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_cls0290_t general_lighting_class_data = {
74 0x30, /* 動作状態 */
75 0x41, /* 点灯モード設定 */
76 0x00, /* 設置場所 */
77 { 0x00, 0x00, 'C', 0x00 }, /* 規格Version情報 */
78 0x42, /* 異常発生状態 */
79 { MAKER_CODE }, /* メーカーコード */
80 {
81 0x00, /* 時 */
82 0x00, /* 分 */
83 },
84 {
85 0x0001, /* 年 */
86 0x01, /* 月 */
87 0x01, /* 日 */
88 },
89};
90
91/* ノードプロファイルオブジェクト */
92struct ecn_cls0EF0_t human_detection_sensor_node_data = {
93 0x30, /* 動作状態 */
94 { 0x01, 0x0A, { 0x01, 0x00 } }, /* Version情報 */
95 {
96 0xFE, /* 下位通信層IDフィールド */
97 { MAKER_CODE }, /* メーカーコード */
98 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, /* ユニークID部(メーカー独自) */
99 },
100 0x0000, /* 異常内容 */
101 { MAKER_CODE }, /* メーカーコード */
102};
103
104/* 人体検知センサクラス */
105struct ecn_cls0007_t human_detection_sensor_data = {
106 0x30, /* 動作状態 */
107 0x41, /* 人体検知状態 */
108 0x00, /* 設置場所 */
109 { 0x00, 0x00, 'C', 0x00 }, /* 規格Version情報 */
110 0x41, /* 異常発生状態 */
111 { MAKER_CODE }, /* メーカーコード */
112};
113
114/* 電源LED */
115gpio_t pow_led;
116/* リレー出力 */
117gpio_t relay_sw;
118/* カラーLED */
119gpio_t led_blue, led_green, led_red;
120/* ユーザースイッチ CN16-4 */
121gpio_t sw1, sw2;
122
123/*
124 * 動作状態ON/OFF設定関数(0x30, 0x31のみ受け付け)
125 */
126int onoff_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
127{
128 /* サイズが1以外は受け付けない */
129 if (size != 1)
130 return 0;
131
132 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
133
134 switch (*(uint8_t *)src) {
135 /* ONの場合 */
136 case 0x30:
137 *((uint8_t *)item->exinf) = *((uint8_t *)src);
138 /* LEDをON */
139 gpio_write(&pow_led, 1);
140 /* リレー出力をON */
141 gpio_write(&relay_sw, 1);
142 break;
143 /* OFFの場合 */
144 case 0x31:
145 *((uint8_t *)item->exinf) = *((uint8_t *)src);
146 /* LEDをOFF */
147 gpio_write(&pow_led, 0);
148 /* リレー出力をOFF */
149 gpio_write(&relay_sw, 0);
150 break;
151 /* 0x30か0x31以外は受け付けない */
152 default:
153 return 0;
154 }
155
156 return 1;
157}
158
159/*
160 * 異常発生状態設定関数(0x41, 0x42のみ受け付け)
161 */
162int alarm_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
163{
164 /* サイズが1以外は受け付けない */
165 if (size != 1)
166 return 0;
167
168 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
169
170 switch (*(uint8_t *)src) {
171 /* 異常発生ありの場合 */
172 case 0x41:
173 /* 異常発生なしの場合 */
174 case 0x42:
175 *((uint8_t *)item->exinf) = *((uint8_t *)src);
176 break;
177 /* 0x41か0x42以外は受け付けない */
178 default:
179 return 0;
180 }
181
182 return 1;
183}
184
185/*
186 * 点灯モード設定設定関数
187 */
188int lighting_mode_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
189{
190 /* サイズが1以外は受け付けない */
191 if (size != 1)
192 return 0;
193
194 switch (*(uint8_t *)src) {
195 /* 自動の場合 */
196 case 0x41:
197 *((uint8_t *)item->exinf) = *((uint8_t *)src);
198 /* カラーLEDを緑で点灯 */
199 gpio_write(&led_blue, 0);
200 gpio_write(&led_green, 1);
201 gpio_write(&led_red, 0);
202 break;
203 /* 通常灯の場合 */
204 case 0x42:
205 *((uint8_t *)item->exinf) = *((uint8_t *)src);
206 /* カラーLEDを赤で点灯 */
207 gpio_write(&led_blue, 0);
208 gpio_write(&led_green, 0);
209 gpio_write(&led_red, 1);
210 break;
211 /* 常夜灯の場合 */
212 case 0x43:
213 *((uint8_t *)item->exinf) = *((uint8_t *)src);
214 /* カラーLEDを赤で点灯 */
215 gpio_write(&led_blue, 0);
216 gpio_write(&led_green, 0);
217 gpio_write(&led_red, 1);
218 break;
219 /* カラー灯の場合 */
220 case 0x45:
221 *((uint8_t *)item->exinf) = *((uint8_t *)src);
222 /* カラーLEDを白で点灯 */
223 gpio_write(&led_blue, 1);
224 gpio_write(&led_green, 1);
225 gpio_write(&led_red, 1);
226 break;
227 default:
228 /* 上記以外は受け付けない */
229 return 0;
230 }
231
232 return 1;
233}
234
235/*
236 * 人体検知状態設定関数
237 */
238int human_detection_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
239{
240 ER ret;
241 uint8_t data[2];
242
243 if (size != 1)
244 return 0;
245
246 switch (*(uint8_t *)src) {
247 /* 人体検出ありの場合 */
248 case 0x41:
249 *((uint8_t *)item->exinf) = *((uint8_t *)src);
250
251 /* メインタスクに通知 */
252 data[0] = 0xB1;
253 data[1] = *(uint8_t *)src;
254 ret = ecn_brk_wai(data, sizeof(data));
255 if (ret != E_OK) {
256 syslog(LOG_ERROR, "ecn_brk_wai");
257 return 1;
258 }
259 break;
260 /* 人体検出なしの場合 */
261 case 0x42:
262 *((uint8_t *)item->exinf) = *((uint8_t *)src);
263
264 /* メインタスクに通知 */
265 data[0] = 0xB1;
266 data[1] = *(uint8_t *)src;
267 ret = ecn_brk_wai(data, sizeof(data));
268 if (ret != E_OK) {
269 syslog(LOG_ERROR, "ecn_brk_wai");
270 return 1;
271 }
272 break;
273 default:
274 /* 上記以外は受け付けない */
275 return 0;
276 }
277
278 return 1;
279}
280
281/*
282 * 現在時刻設定関数
283 */
284int time_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
285{
286 uint8_t *p_src;
287 time_t temp;
288 struct tm _tm;
289
290 if (size != 2)
291 return 0;
292
293 temp = rtc_read();
294 gmtime_r(&temp, &_tm);
295
296 /* 時刻設定 */
297 p_src = (uint8_t *)src;
298 _tm.tm_hour = *p_src++;
299 _tm.tm_min = *p_src++;
300 _tm.tm_sec = 0x00;
301
302 temp = mktime(&_tm);
303 rtc_write(temp);
304
305 return (intptr_t)p_src - (intptr_t)src;
306}
307
308/*
309 * 現在時刻取得関数
310 */
311int time_prop_get(const EPRPINIB *item, void *dst, int size)
312{
313 uint8_t *p_dst;
314 time_t temp;
315 struct tm _tm;
316
317 if (size != 2)
318 return 0;
319
320 temp = rtc_read();
321 gmtime_r(&temp, &_tm);
322
323 /* 時刻設定 */
324 p_dst = (uint8_t *)dst;
325 *p_dst++ = _tm.tm_hour;
326 *p_dst++ = _tm.tm_min;
327
328 return (intptr_t)p_dst - (intptr_t)dst;
329}
330
331/*
332 * 現在年月日設定関数
333 */
334int date_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
335{
336 uint8_t *p_src;
337 time_t temp;
338 struct tm _tm;
339
340 if (size != 4)
341 return 0;
342
343 temp = rtc_read();
344 gmtime_r(&temp, &_tm);
345
346 /* 年月日設定 */
347 p_src = (uint8_t *)src;
348 _tm.tm_year = (*(p_src++) * 100) + *p_src++;
349 _tm.tm_mon = (*p_src++) - 1;
350 _tm.tm_mday = *p_src++;
351
352 temp = mktime(&_tm);
353 rtc_write(temp);
354
355 return (intptr_t)p_src - (intptr_t)src;
356}
357
358/*
359 * 現在年月日取得関数
360 */
361int date_prop_get(const EPRPINIB *item, void *dst, int size)
362{
363 uint8_t *p_dst;
364 time_t temp;
365 struct tm _tm;
366
367 if (size != 4)
368 return 0;
369
370 temp = rtc_read();
371 gmtime_r(&temp, &_tm);
372
373 p_dst = (uint8_t *)dst;
374 *p_dst++ = _tm.tm_year / 100;
375 *p_dst++ = _tm.tm_year % 100;
376 *p_dst++ = _tm.tm_mon + 1;
377 *p_dst++ = _tm.tm_mday;
378
379 return (intptr_t)p_dst - (intptr_t)dst;
380}
381
382static void main_initialize();
383static int main_get_timer();
384static void main_progress(int interval);
385static void main_recv_esv(T_EDATA *esv);
386static void main_break_wait(uint8_t *brkdat, int32_t len);
387static void main_timeout();
388
389/*
390 * メインタスク
391 */
392void echonet_main_task(intptr_t exinf)
393{
394 ER ret, ret2;
395 SYSTIM prev, now;
396 int timer;
397 T_EDATA *esv;
398 uint8_t brkdat[64];
399 int32_t len;
400
401 /* アプリケーションの初期化 */
402 main_initialize();
403
404 ret2 = get_tim(&now);
405 if (ret2 != E_OK) {
406 syslog(LOG_ERROR, "get_tim");
407 return;
408 }
409
410 for (;;) {
411 prev = now;
412
413 /* タイマー取得 */
414 timer = main_get_timer();
415
416 /* 応答電文待ち */
417 ret = ecn_trcv_esv(&esv, timer);
418 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) {
419 syslog(LOG_ERROR, "ecn_trcv_esv");
420 break;
421 }
422
423 ret2 = get_tim(&now);
424 if (ret2 != E_OK) {
425 syslog(LOG_ERROR, "get_tim");
426 break;
427 }
428
429 /* 時間経過 */
430 main_progress(now - prev);
431
432 /* Echonet電文受信の場合 */
433 if (ret == E_OK) {
434 /* Echonet電文受信処理 */
435 main_recv_esv(esv);
436
437 /* 領域解放 */
438 ret = ecn_rel_esv(esv);
439 if (ret != E_OK) {
440 syslog(LOG_ERROR, "ecn_rel_esv");
441 break;
442 }
443 }
444 /* 応答電文待ちの割り込みの場合 */
445 else if (ret == E_BRK) {
446 /* 応答電文待ちの割り込みデータ取得 */
447 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len);
448 if (ret != E_OK) {
449 syslog(LOG_ERROR, "ecn_get_brk_dat");
450 break;
451 }
452
453 /* 応答電文待ちの割り込み処理 */
454 main_break_wait(brkdat, len);
455
456 /* 領域解放 */
457 ret = ecn_rel_esv(esv);
458 if (ret != E_OK) {
459 syslog(LOG_ERROR, "ecn_rel_esv");
460 break;
461 }
462 }
463
464 /* タイムアウト処理 */
465 main_timeout();
466 }
467}
468
469void echonet_change_netif_link(uint8_t link_up, uint8_t up)
470{
471 ER ret;
472
473 if (link_up == 0)
474 return;
475
476 if (up) {
477 /* インスタンスリスト通知の送信 */
478 ret = ecn_ntf_inl();
479 if (ret != E_OK) {
480 syslog(LOG_ERROR, "ecn_ntf_inl");
481 }
482 }
483
484 /* メインタスクに通知 */
485 uint8_t data[2];
486 data[0] = 0x01;
487 data[1] = up ? 0x01 : 0x02;
488 ret = ecn_brk_wai(data, sizeof(data));
489 if (ret != E_OK) {
490 syslog(LOG_ERROR, "ecn_brk_wai");
491 return;
492 }
493}
494
495enum main_state_t {
496 main_state_start,
497 main_state_idle,
498 main_state_search,
499};
500
501int main_timer = TMO_FEVR;
502int main_btn_timer = TMO_FEVR;
503enum main_state_t main_state = main_state_start;
504bool_t main_btn1_state;
505int main_btn1_count = 0;
506bool_t main_btn2_state;
507int main_btn2_count = 0;
508
509/*
510 * 初期化
511 */
512static void main_initialize()
513{
514 uint8_t btn1, btn2;
515
516 /* LEDの初期化 */
517 gpio_init_out(&pow_led, LED_USER);
518 gpio_init_out(&relay_sw, P4_4);
519 gpio_init_out(&led_blue, LED_BLUE);
520 gpio_init_out(&led_green, LED_GREEN);
521 gpio_init_out(&led_red, LED_RED);
522
523 /* スイッチの初期化 */
524 gpio_init_in(&sw1, USER_BUTTON0);
525 gpio_init_in(&sw2, P1_12);
526
527 /* カラーLEDを消灯 */
528 gpio_write(&led_blue, 0);
529 gpio_write(&led_green, 0);
530 gpio_write(&led_red, 0);
531
532 /* ECHONETミドルウェアを起動するのを待つ */
533 main_state = main_state_start;
534 main_timer = 1000 * 1000;
535
536 /* 10ms後にボタン状態を確認 */
537 main_btn_timer = 10 * 1000;
538
539 /* ボタン状態読み込み */
540 btn1 = gpio_read(&sw1);
541 btn2 = gpio_read(&sw2);
542 main_btn1_state = btn1 != 0;
543 main_btn2_state = btn2 != 0;
544
545 /* メインタスクを起動 */
546 ER ret = act_tsk(MAIN_TASK);
547 if (ret != E_OK) {
548 syslog(LOG_ERROR, "act_tsk");
549 }
550}
551
552/*
553 * タイマー取得
554 */
555static int main_get_timer()
556{
557 int result = main_timer;
558
559 if ((result == TMO_FEVR)
560 || ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))) {
561 result = main_btn_timer;
562 }
563
564 return result;
565}
566
567/*
568 * 時間経過
569 */
570static void main_progress(int interval)
571{
572 if (main_timer != TMO_FEVR) {
573 main_timer -= interval;
574 if (main_timer < 0) {
575 main_timer = 0;
576 }
577 }
578
579 if (main_btn_timer != TMO_FEVR) {
580 main_btn_timer -= interval;
581 if (main_btn_timer < 0) {
582 main_btn_timer = 0;
583 }
584 }
585}
586
587/*
588 * Echonet電文受信処理
589 */
590static void main_recv_esv(T_EDATA *esv)
591{
592 ER ret;
593 ID eobjid;
594 uint8_t epc;
595 uint8_t pdc;
596 uint8_t p_edt[256];
597 T_ENUM_EPC enm;
598
599 eobjid = ecn_get_eobj(esv);
600 if (eobjid == EOBJ_NULL) {
601 syslog(LOG_ERROR, "ecn_get_eobj");
602 }
603
604 ret = ecn_itr_ini(&enm, esv);
605 if (ret != E_OK) {
606 syslog(LOG_ERROR, "ecn_itr_ini");
607 return;
608 }
609
610 for (;;) {
611 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
612 switch (epc) {
613 case 0xD6:
614 switch (main_state) {
615 case main_state_search:
616 if (eobjid == HUMAN_DETECTION_SENSER_ENOD) {
617 /* 人体検知センサ検索完了 */
618 main_state = main_state_idle;
619 main_timer = TMO_FEVR;
620 }
621 break;
622 }
623 break;
624 }
625 }
626 if (ret != E_BOVR) {
627 syslog(LOG_ERROR, "ecn_itr_nxt");
628 break;
629 }
630 if (enm.is_eof)
631 break;
632 }
633}
634
635static void human_detectino_changed(uint8_t state);
636
637/*
638 * 応答電文待ちの割り込み処理
639 */
640static void main_break_wait(uint8_t *brkdat, int32_t len)
641{
642 ER ret;
643
644 switch (main_state) {
645 case main_state_idle:
646 if (len < 2)
647 break;
648
649 switch (brkdat[0]) {
650 case 0x01:
651 break;
652 case 0xB1:
653 human_detectino_changed(brkdat[1]);
654 break;
655 }
656 break;
657 }
658}
659
660static void main_ontimer();
661static void main_btn_ontimer();
662
663/*
664 * タイムアウト処理
665 */
666static void main_timeout()
667{
668 if (main_timer == 0) {
669 main_ontimer();
670 }
671
672 if (main_btn_timer == 0) {
673 main_btn_ontimer();
674 }
675}
676
677static void main_search();
678
679static void main_ontimer()
680{
681 ER ret;
682
683 switch (main_state) {
684 case main_state_start:
685 /* ECHONETミドルウェアを起動 */
686 ret = ecn_sta_svc();
687 if (ret != E_OK) {
688 syslog(LOG_ERROR, "ecn_sta_svc");
689 }
690
691 /* 1秒後に人体検知センサを検索 */
692 main_state = main_state_search;
693 main_timer = 1000 * 1000;
694 break;
695 case main_state_search:
696 /* 人体検知センサ再検索 */
697 main_search();
698 main_state = main_state_search;
699 main_timer = 5000 * 1000;
700 break;
701 }
702}
703
704static void main_search()
705{
706 ER ret;
707 T_EDATA *esv;
708
709 /* 人体検知センサ検索 */
710 ret = ecn_esv_inf_req(&esv, EOBJ_NULL, 0xD6);
711 if (ret != E_OK) {
712 syslog(LOG_ERROR, "ecn_esv_inf_req");
713 return;
714 }
715
716 /* 電文送信 */
717 ret = ecn_snd_esv(esv);
718 if (ret != E_OK) {
719 syslog(LOG_ERROR, "ecn_snd_esv");
720 }
721}
722
723static void main_btn1_change(bool_t push);
724static void main_btn2_change(bool_t push);
725
726/*
727 * タイムアウト処理
728 */
729static void main_btn_ontimer()
730{
731 uint8_t btn1, btn2;
732
733 /* 10ms後にボタン状態を確認 */
734 main_btn_timer = 10 * 1000;
735
736 /* ボタン状態読み込み */
737 btn1 = gpio_read(&sw1);
738 btn2 = gpio_read(&sw2);
739
740 /* ボタン1の処理 */
741 if ((btn1 != 0) && !main_btn1_state) {
742 main_btn1_count++;
743 if (main_btn1_count > 10) {
744 main_btn1_count = 0;
745 main_btn1_state = true;
746
747 main_btn1_change(true);
748 }
749 }
750 else if ((btn1 == 0) && main_btn1_state) {
751 main_btn1_count++;
752 if (main_btn1_count > 10) {
753 main_btn1_count = 0;
754 main_btn1_state = false;
755
756 main_btn1_change(false);
757 }
758 }
759
760 /* ボタン2の処理 */
761 if ((btn2 != 0) && !main_btn2_state) {
762 main_btn2_count++;
763 if (main_btn2_count > 10) {
764 main_btn2_count = 0;
765 main_btn2_state = true;
766
767 main_btn2_change(true);
768 }
769 }
770 else if ((btn2 == 0) && main_btn2_state) {
771 main_btn2_count++;
772 if (main_btn2_count > 10) {
773 main_btn2_count = 0;
774 main_btn2_state = false;
775
776 main_btn2_change(false);
777 }
778 }
779}
780
781enum lighting_mode_t {
782 lighting_mode_auto, /* 自動の場合 */
783 lighting_mode_normal, /* 通常灯の場合 */
784 lighting_mode_night, /* 常夜灯の場合 */
785 lighting_mode_coler /* カラー灯の場合 */
786};
787bool_t main_on = false;
788enum lighting_mode_t main_mode = lighting_mode_auto;
789
790/*
791 * ボタン1状態変化処理
792 */
793static void main_btn1_change(bool_t push)
794{
795 ER ret;
796 T_EDATA *esv;
797 uint8_t p_edt[1];
798
799 /* 押されて戻った時に処理する */
800 if (push)
801 return;
802
803 /* ON/OFF状態の切り替え */
804 main_on = !main_on;
805 p_edt[0] = main_on ? 0x30 : 0x31;
806
807 /* プロパティ設定電文作成 */
808 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt);
809 if (ret != E_OK) {
810 syslog(LOG_ERROR, "ecn_esv_setc");
811 return;
812 }
813
814 /* 電文送信 */
815 ecn_snd_esv(esv);
816}
817
818/*
819 * ボタン2状態変化処理
820 */
821static void main_btn2_change(bool_t push)
822{
823 ER ret;
824 T_EDATA *esv;
825 uint8_t p_edt[1];
826
827 /* 押されて戻った時に処理する */
828 if (push)
829 return;
830
831 /* 点灯モードの切り替え */
832 switch (main_mode) {
833 /* 自動の場合 */
834 case lighting_mode_auto:
835 /* 通常灯に変更 */
836 main_mode = lighting_mode_normal;
837 p_edt[0] = 0x42;
838 break;
839 /* 通常灯の場合 */
840 case lighting_mode_normal:
841 /* 常夜灯の場合 */
842 main_mode = lighting_mode_night;
843 p_edt[0] = 0x43;
844 break;
845 /* 常夜灯の場合 */
846 case lighting_mode_night:
847 /* カラー灯の場合 */
848 main_mode = lighting_mode_coler;
849 p_edt[0] = 0x45;
850 break;
851 /* カラー灯の場合 */
852 case lighting_mode_coler:
853 default:
854 /* 自動の場合 */
855 main_mode = lighting_mode_auto;
856 p_edt[0] = 0x41;
857 break;
858 }
859
860 /* プロパティ設定電文作成 */
861 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0xB6, 1, p_edt);
862 if (ret != E_OK) {
863 syslog(LOG_ERROR, "ecn_esv_setc");
864 return;
865 }
866
867 /* 電文送信 */
868 ecn_snd_esv(esv);
869}
870
871static void human_detectino_changed(uint8_t state)
872{
873 ER ret;
874 T_EDATA *esv;
875 uint8_t p_edt[1];
876
877 /* 照明がOFFで人体検出ありの場合 */
878 if (!main_on && state == 0x41) {
879 /* 照明をON */
880 main_on = true;
881 }
882 /* 照明がOFFで人体検出ありの場合 */
883 else if (main_on && state == 0x42) {
884 /* 照明をOFF */
885 main_on = false;
886 }
887 else
888 return;
889
890 p_edt[0] = main_on ? 0x30 : 0x31;
891
892 /* プロパティ設定電文作成 */
893 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt);
894 if (ret != E_OK) {
895 syslog(LOG_ERROR, "ecn_esv_setc");
896 return;
897 }
898
899 /* 電文送信 */
900 ecn_snd_esv(esv);
901}
Note: See TracBrowser for help on using the repository browser.