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

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

ASP3版ECNLを追加

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