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

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

syscallが関数呼びになるよう変更
他更新

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