動作中を示すためのLチカは良く使うのにライブラリ化してなかったりする。コードが簡単すぎてライブラリ化するまでもないということもあるがもっと簡単に一行だけでも少なくしたいと思ったりすることもある。なのであえてライブラリ化してみた。最大8個まで、どのピンにLEDが繋がっていて点灯にはHIGH/LOWのどちらを出力すればいいのかを指定し登録する。指定時間毎に点滅や指定時間後に点灯或いは消灯などの機能も盛り込んでみた。自分でいうのもなんだが以外に使い勝手はいいかも。
【サンプル】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include "device.h" void setup(void) { /* LEDピンを登録 */ LED::setup(0, Gpio::DIO18, HIGH); /* 点灯 */ LED::on(0); /* 消灯 */ LED::off(0); /* 点灯消灯切替 */ LED::toggle(0); /* 1秒後に消灯 */ LED::off(0, 1000); /* 1秒後に点灯 */ LED::on(0, 1000); /* 1秒毎に点灯消灯切替(連続モード) */ LED::toggle(0, 1000); } void loop(void) { } |
【ライブラリ】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* led.h - LED Library for NXP-JN516x Copyright (c) 2022 Sasapea's Lab. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #pragma once #include "alarm.h" #include "gpio.h" #ifndef LED_BIT_LEN #define LED_BIT_LEN 1 #endif #define LED_BIT_COUNT (1 << LED_BIT_LEN) #define LED_BIT_MASK (LED_BIT_COUNT - 1) class LED { public: LED(void); static void init(void); static void setup(uint8 led, Gpio::PIN pin, uint8 off); static void off(uint8 led = 0, uint16 ms = 0); static void on(uint8 led = 0, uint16 ms = 0); static void toggle(uint8 led = 0, uint16 ms = 0); static bool status(uint8 led = 0); static bool expire(uint8 led = 0); static void handle(void); private: typedef enum { MODE_DISABLE, MODE_OFF, MODE_ON, MODE_TOGGLE, } MODE; typedef struct { Gpio::PIN pin; uint32 off; MODE mode; bool expire; Alarm alarm; } LEDCTRL; static LEDCTRL _leds[LED_BIT_COUNT]; static void control(LEDCTRL& ctrl, MODE mode, uint16 ms); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
/* led.cpp - LED Library for NXP-JN516x Copyright (c) 2022 Sasapea's Lab. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "led.h" LED::LEDCTRL LED::_leds[]; LED::LED(void) { init(); } void LED::init(void) { LEDCTRL *ctrl = _leds; for (uint8 i = 0; i < LED_BIT_COUNT; ++i, ++ctrl) { ctrl->pin = (Gpio::PIN)-1; ctrl->off = LOW; ctrl->mode = MODE_DISABLE; ctrl->expire = false; } } void LED::setup(uint8 led, Gpio::PIN pin, uint8 off) { LEDCTRL& ctrl = _leds[led & LED_BIT_MASK]; ctrl.pin = pin; ctrl.off = off; ctrl.mode = MODE_DISABLE; ctrl.expire = false; Gpio::digitalWrite(pin, off); Gpio::pinMode(pin, Gpio::OUTPUT); } void LED::off(uint8 led, uint16 ms) { control(_leds[led & LED_BIT_MASK], MODE_OFF, ms); } void LED::on(uint8 led, uint16 ms) { control(_leds[led & LED_BIT_MASK], MODE_ON, ms); } void LED::toggle(uint8 led, uint16 ms) { control(_leds[led & LED_BIT_MASK], MODE_TOGGLE, ms); } void LED::control(LEDCTRL& ctrl, MODE mode, uint16 ms) { ctrl.expire = false; if (ms) { ctrl.mode = mode; ctrl.alarm.interval(ms * 1000UL); } else { ctrl.mode = MODE_DISABLE; switch (mode) { case MODE_OFF: Gpio::digitalWrite(ctrl.pin, ctrl.off); break; case MODE_ON: Gpio::digitalWrite(ctrl.pin, !ctrl.off); break; case MODE_TOGGLE: Gpio::digitalWrite(ctrl.pin, !Gpio::digitalRead(ctrl.pin)); break; default: break; } } } bool LED::status(uint8 led) { LEDCTRL& ctrl = _leds[led & LED_BIT_MASK]; return Gpio::digitalRead(ctrl.pin) != ctrl.off; } bool LED::expire(uint8 led) { LEDCTRL& ctrl = _leds[led & LED_BIT_MASK]; bool rv = ctrl.expire; ctrl.expire = false; return rv; } void LED::handle(void) { LEDCTRL *ctrl = _leds; for (uint8 i = 0; i < LED_BIT_COUNT; ++i, ++ctrl) { MODE mode = ctrl->mode; if ((mode != MODE_DISABLE) && ctrl->alarm.expire()) { control(*ctrl, mode, 0); ctrl->expire = true; if (mode == MODE_TOGGLE) ctrl->mode = mode; } } } |
【関連投稿】
NXP JN516X (TWELITE) をプログラミングする(開発環境の構築)
NXP JN516X (TWELITE) をプログラミングする(メイン・ルーチン)
NXP JN516X (TWELITE) をプログラミングする(TICKTIMER)
NXP JN516X (TWELITE) をプログラミングする(UART)
NXP JN516X (TWELITE) をプログラミングする(SYSTEM)
NXP JN516X (TWELITE) をプログラミングする(GPIO)
NXP JN516X (TWELITE) をプログラミングする(TIMER)
NXP JN516X (TWELITE) をプログラミングする(ALARM)
NXP JN516X (TWELITE) をプログラミングする(WAKETIMER)
NXP JN516X (TWELITE) をプログラミングする(WATCHDOG)
NXP JN516X (TWELITE) をプログラミングする(I2C)
NXP JN516X (TWELITE) をプログラミングする(SPI)
NXP JN516X (TWELITE) をプログラミングする(ADC)
NXP JN516X (TWELITE) をプログラミングする(COMPARATOR)
NXP JN516X (TWELITE) をプログラミングする(CLOCK)
NXP JN516X (TWELITE) をプログラミングする(BROWNOUT)
NXP JN516X (TWELITE) をプログラミングする(PULSCOUNTER)
NXP JN516X (TWELITE) をプログラミングする(INFRARED)
NXP JN516X (TWELITE) をプログラミングする(RANDOM-GENERATOR)
NXP JN516X (TWELITE) をプログラミングする(FLASH)
NXP JN516X (TWELITE) をプログラミングする(EEPROM)
NXP JN516X (TWELITE) をプログラミングする(WPAN)
NXP JN516X (TWELITE) をプログラミングする(Eclipse-CDT+MWSTAGE)
NXP JN516X (TWELITE) をプログラミングする(乗算と除算)
NXP JN516X (TWELITE) をプログラミングする(マルチタスク)
NXP JN516X (TWELITE) をプログラミングする(フラッシュ・プログラマー)
NXP JN516X (TWELITE) をプログラミングする(OTA UPDATE)
NXP JN516X (TWELITE) をプログラミングする(TWELITE CUE/MC3630)
NXP JN516X (TWELITE) をプログラミングする(LED)
NXP JN516X (TWELITE) をプログラミングする(AES)
NXP JN516X (TWELITE) をプログラミングする(Downloads)