source: asp3_tinet_ecnl_rx/trunk/app2_light/src/echonet_main.c@ 400

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

ファイルヘッダーの更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 19.2 KB
Line 
1/*
2 * TOPPERS PROJECT Home Network Working Group Software
3 *
4 * Copyright (C) 2014-2019 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_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
427void echonet_change_netif_link(uint8_t link_up, uint8_t up)
428{
429 ER ret;
430
431 if (link_up == 0)
432 return;
433
434 if (up) {
435 /* インスタンスリスト通知の送信 */
436 ret = ecn_ntf_inl();
437 if (ret != E_OK) {
438 syslog(LOG_ERROR, "ecn_ntf_inl");
439 }
440 }
441
442 /* メインタスクに通知 */
443 uint8_t data[2];
444 data[0] = 0x01;
445 data[1] = up ? 0x01 : 0x02;
446 ret = ecn_brk_wai(data, sizeof(data));
447 if (ret != E_OK) {
448 syslog(LOG_ERROR, "ecn_brk_wai");
449 return;
450 }
451}
452
453enum main_state_t {
454 main_state_start,
455 main_state_idle,
456 main_state_search,
457};
458
459int main_timer = TMO_FEVR;
460int main_btn_timer = TMO_FEVR;
461enum main_state_t main_state = main_state_start;
462bool_t main_btn1_state;
463int main_btn1_count = 0;
464bool_t main_btn2_state;
465int main_btn2_count = 0;
466
467/*
468 * 初期化
469 */
470static void main_initialize()
471{
472 uint8_t btn1, btn2;
473
474 /* LEDを"000"と表示 */
475 sil_wrb_mem((uint8_t *)0x0008C02A, 0x00);
476
477 /* ECHONETミドルウェアを起動するのを待つ */
478 main_state = main_state_start;
479 main_timer = 1000 * 1000;
480
481 /* 10ms後にボタン状態を確認 */
482 main_btn_timer = 10 * 1000;
483
484 /* ボタン状態読み込み */
485 btn1 = sil_reb_mem((uint8_t *)0x0008C04A);
486 /*btn1 = sil_reb_mem((uint8_t *)0x0008C040);*/
487 btn2 = sil_reb_mem((uint8_t *)0x0008C040);
488 main_btn1_state = (btn1 & 0x80/*0x0x20*/) != 0;
489 main_btn2_state = (btn2 & 0x80) != 0;
490
491 /* メインタスクを起動 */
492 ER ret = act_tsk(MAIN_TASK);
493 if (ret != E_OK) {
494 syslog(LOG_ERROR, "act_tsk");
495 }
496}
497
498/*
499 * タイマー取得
500 */
501static int main_get_timer()
502{
503 int result = main_timer;
504
505 if ((result == TMO_FEVR)
506 || ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))) {
507 result = main_btn_timer;
508 }
509
510 return result;
511}
512
513/*
514 * 時間経過
515 */
516static void main_progress(int interval)
517{
518 if (main_timer != TMO_FEVR) {
519 main_timer -= interval;
520 if (main_timer < 0) {
521 main_timer = 0;
522 }
523 }
524
525 if (main_btn_timer != TMO_FEVR) {
526 main_btn_timer -= interval;
527 if (main_btn_timer < 0) {
528 main_btn_timer = 0;
529 }
530 }
531}
532
533/*
534 * Echonet電文受信処理
535 */
536static void main_recv_esv(T_EDATA *esv)
537{
538 ER ret;
539 ID eobjid;
540 uint8_t epc;
541 uint8_t pdc;
542 uint8_t p_edt[256];
543 T_ENUM_EPC enm;
544
545 eobjid = ecn_get_eobj(esv);
546 if (eobjid == EOBJ_NULL) {
547 syslog(LOG_ERROR, "ecn_get_eobj");
548 }
549
550 ret = ecn_itr_ini(&enm, esv);
551 if (ret != E_OK) {
552 syslog(LOG_ERROR, "ecn_itr_ini");
553 return;
554 }
555
556 for (;;) {
557 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
558 switch (epc) {
559 case 0xD6:
560 switch (main_state) {
561 case main_state_search:
562 if (eobjid == HUMAN_DETECTION_SENSER_ENOD) {
563 /* 人体検知センサ検索完了 */
564 main_state = main_state_idle;
565 main_timer = TMO_FEVR;
566 }
567 break;
568 }
569 break;
570 }
571 }
572 if (ret != E_BOVR) {
573 syslog(LOG_ERROR, "ecn_itr_nxt");
574 break;
575 }
576 if (enm.is_eof)
577 break;
578 }
579}
580
581static void human_detectino_changed(uint8_t state);
582
583/*
584 * 応答電文待ちの割り込み処理
585 */
586static void main_break_wait(uint8_t *brkdat, int32_t len)
587{
588 ER ret;
589
590 switch (main_state) {
591 case main_state_idle:
592 if (len < 2)
593 break;
594
595 switch (brkdat[0]) {
596 case 0x01:
597 break;
598 case 0xB1:
599 human_detectino_changed(brkdat[1]);
600 break;
601 }
602 break;
603 }
604}
605
606static void main_ontimer();
607static void main_btn_ontimer();
608
609/*
610 * タイムアウト処理
611 */
612static void main_timeout()
613{
614 if (main_timer == 0) {
615 main_ontimer();
616 }
617
618 if (main_btn_timer == 0) {
619 main_btn_ontimer();
620 }
621}
622
623static void main_search();
624
625static void main_ontimer()
626{
627 ER ret;
628
629 switch (main_state) {
630 case main_state_start:
631 /* ECHONETミドルウェアを起動 */
632 ret = ecn_sta_svc();
633 if (ret != E_OK) {
634 syslog(LOG_ERROR, "ecn_sta_svc");
635 }
636
637 /* 1秒後に人体検知センサを検索 */
638 main_state = main_state_search;
639 main_timer = 1000 * 1000;
640 break;
641 case main_state_search:
642 /* 人体検知センサ再検索 */
643 main_search();
644 main_state = main_state_search;
645 main_timer = 5000 * 1000;
646 break;
647 }
648}
649
650static void main_search()
651{
652 ER ret;
653 T_EDATA *esv;
654
655 /* 人体検知センサ検索 */
656 ret = ecn_esv_inf_req(&esv, EOBJ_NULL, 0xD6);
657 if (ret != E_OK) {
658 syslog(LOG_ERROR, "ecn_esv_inf_req");
659 return;
660 }
661
662 /* 電文送信 */
663 ret = ecn_snd_esv(esv);
664 if (ret != E_OK) {
665 syslog(LOG_ERROR, "ecn_snd_esv");
666 }
667}
668
669static void main_btn1_change(bool_t push);
670static void main_btn2_change(bool_t push);
671
672/*
673 * タイムアウト処理
674 */
675static void main_btn_ontimer()
676{
677 uint8_t btn1, btn2;
678
679 /* 10ms後にボタン状態を確認 */
680 main_btn_timer = 10 * 1000;
681
682 /* ボタン状態読み込み */
683 btn1 = sil_reb_mem((uint8_t *)0x0008C04A);
684 /*btn1 = sil_reb_mem((uint8_t *)0x0008C040);*/
685 btn2 = sil_reb_mem((uint8_t *)0x0008C040);
686
687 /* ボタン1の処理 */
688 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 = true;
693
694 main_btn1_change(true);
695 }
696 }
697 else if (((btn1 & 0x80/*0x20*/) == 0) && main_btn1_state) {
698 main_btn1_count++;
699 if (main_btn1_count > 10) {
700 main_btn1_count = 0;
701 main_btn1_state = false;
702
703 main_btn1_change(false);
704 }
705 }
706
707 /* ボタン2の処理 */
708 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 = true;
713
714 main_btn2_change(true);
715 }
716 }
717 else if (((btn2 & 0x80) == 0) && main_btn2_state) {
718 main_btn2_count++;
719 if (main_btn2_count > 10) {
720 main_btn2_count = 0;
721 main_btn2_state = false;
722
723 main_btn2_change(false);
724 }
725 }
726}
727
728enum lighting_mode_t {
729 lighting_mode_auto, /* 自動の場合 */
730 lighting_mode_normal, /* 通常灯の場合 */
731 lighting_mode_night, /* 常夜灯の場合 */
732 lighting_mode_coler /* カラー灯の場合 */
733};
734bool_t main_on = false;
735enum lighting_mode_t main_mode = lighting_mode_auto;
736
737/*
738 * ボタン1状態変化処理
739 */
740static void main_btn1_change(bool_t push)
741{
742 ER ret;
743 T_EDATA *esv;
744 uint8_t p_edt[1];
745
746 /* 押されて戻った時に処理する */
747 if (push)
748 return;
749
750 /* ON/OFF状態の切り替え */
751 main_on = !main_on;
752 p_edt[0] = main_on ? 0x30 : 0x31;
753
754 /* プロパティ設定電文作成 */
755 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt);
756 if (ret != E_OK) {
757 syslog(LOG_ERROR, "ecn_esv_setc");
758 return;
759 }
760
761 /* 電文送信 */
762 ecn_snd_esv(esv);
763}
764
765/*
766 * ボタン2状態変化処理
767 */
768static void main_btn2_change(bool_t push)
769{
770 ER ret;
771 T_EDATA *esv;
772 uint8_t p_edt[1];
773
774 /* 押されて戻った時に処理する */
775 if (push)
776 return;
777
778 /* 点灯モードの切り替え */
779 switch (main_mode) {
780 /* 自動の場合 */
781 case lighting_mode_auto:
782 /* 通常灯に変更 */
783 main_mode = lighting_mode_normal;
784 p_edt[0] = 0x42;
785 break;
786 /* 通常灯の場合 */
787 case lighting_mode_normal:
788 /* 常夜灯の場合 */
789 main_mode = lighting_mode_night;
790 p_edt[0] = 0x43;
791 break;
792 /* 常夜灯の場合 */
793 case lighting_mode_night:
794 /* カラー灯の場合 */
795 main_mode = lighting_mode_coler;
796 p_edt[0] = 0x45;
797 break;
798 /* カラー灯の場合 */
799 case lighting_mode_coler:
800 default:
801 /* 自動の場合 */
802 main_mode = lighting_mode_auto;
803 p_edt[0] = 0x41;
804 break;
805 }
806
807 /* プロパティ設定電文作成 */
808 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0xB6, 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
818static void human_detectino_changed(uint8_t state)
819{
820 ER ret;
821 T_EDATA *esv;
822 uint8_t p_edt[1];
823
824 /* 照明がOFFで人体検出ありの場合 */
825 if (!main_on && state == 0x41) {
826 /* 照明をON */
827 main_on = true;
828 }
829 /* 照明がOFFで人体検出ありの場合 */
830 else if (main_on && state == 0x42) {
831 /* 照明をOFF */
832 main_on = false;
833 }
834 else
835 return;
836
837 p_edt[0] = main_on ? 0x30 : 0x31;
838
839 /* プロパティ設定電文作成 */
840 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt);
841 if (ret != E_OK) {
842 syslog(LOG_ERROR, "ecn_esv_setc");
843 return;
844 }
845
846 /* 電文送信 */
847 ecn_snd_esv(esv);
848}
Note: See TracBrowser for help on using the repository browser.