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