You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

280 lines
4.6 KiB

/**
* digital-screen Functions
*
* @category digital-clock
* @package digital-screen.h
* @copyright Copyright (c) 2019 iotcat (https://iotcat.me)
* @license GNU General Public License 2.0
* @version 0.0.1
*/
#ifndef _DIGITAL_SCREEN_H
#define _DIGITAL_SCREEN_H
#include "ovo.h"
#ifndef INTERVAL_TIME
#define INTERVAL_TIME 1000
#endif
#ifndef DIG_1_1
#define DIG_1_1 9
#endif
#ifndef DIG_1_2
#define DIG_1_2 10
#endif
#ifndef DIG_1_3
#define DIG_1_3 11
#endif
#ifndef DIG_1_4
#define DIG_1_4 12
#endif
#ifndef DIG_2_1
#define DIG_2_1 5
#endif
#ifndef DIG_2_2
#define DIG_2_2 6
#endif
#ifndef DIG_2_3
#define DIG_2_3 7
#endif
#ifndef DIG_2_4
#define DIG_2_4 8
#endif
class DigitalClock{
public:
DigitalClock(int group = 22){
this->_group = group;
_ice = 0;
_cnt = 0;
};
/**
* control digital screens
*
* @Author yimian
* @param int num # 待显示数字
* @return void
*/
inline void digital_show(int num){
if(num == -1 || _ice == 1){
//digital_show_1(15);
//digital_show_2(15);
return;
}
digital_show_1(num % 10);
digital_show_2((num / 10) % 10);
}
void core(){
setInterval([&](){
this->digital_show(this->_cnt % (this->_group + 1));
if(this->_ice != 1) this->_cnt++;
}, INTERVAL_TIME);
}
inline void hide(){
this->_ice = 1;
}
inline void show(){
this->_ice = 0;
}
inline void change(){
this->_ice = !(this->_ice);
}
inline void reset(){
this->_cnt = 0;
}
private:
int _group;
int _ice;
unsigned int _cnt;
/**
* control digital screen 1
*
* @Author yimian
* @param int num # 待显示数字
* @return void
*/
void digital_show_1(int num){
digitalWrite(DIG_1_1, !!(num & (0x01<<0)));
digitalWrite(DIG_1_2, !!(num & (0x01<<1)));
digitalWrite(DIG_1_3, !!(num & (0x01<<2)));
digitalWrite(DIG_1_4, !!(num & (0x01<<3)));
}
/**
* control digital screen 2
*
* @Author yimian
* @param int num # 待显示数字
* @return void
*/
void digital_show_2(int num){
digitalWrite(DIG_2_1, !!(num & (0x01<<0)));
digitalWrite(DIG_2_2, !!(num & (0x01<<1)));
digitalWrite(DIG_2_3, !!(num & (0x01<<2)));
digitalWrite(DIG_2_4, !!(num & (0x01<<3)));
}
};
/**
* digital-clock setup
*
* @Author yimian
* @param void
* @return void
*/
void digital_clock_ini(){
pinMode(DIG_1_1, OUTPUT);
pinMode(DIG_1_2, OUTPUT);
pinMode(DIG_1_3, OUTPUT);
pinMode(DIG_1_4, OUTPUT);
pinMode(DIG_2_1, OUTPUT);
pinMode(DIG_2_2, OUTPUT);
pinMode(DIG_2_3, OUTPUT);
pinMode(DIG_2_4, OUTPUT);
}
#ifdef DEBUG_MODE
class Debug_DigitalClock{
public:
Debug_DigitalClock(int group = 22){
this->_group = group;
_ice = 0;
_cnt = 0;
};
/**
* control digital screens
*
* @Author yimian
* @param int num # 待显示数字
* @return void
*/
inline void digital_show(int num){
if(num == -1 || _ice == 1){
//digital_show_1(15);
//digital_show_2(15);
return;
}
digital_show_1(num % 10);
digital_show_2(num % 10);
}
void core(){
setInterval([&](){
this->digital_show(this->_cnt % (this->_group + 1));
if(this->_ice != 1) this->_cnt++;
}, INTERVAL_TIME);
}
inline void hide(){
this->_ice = 1;
}
inline void show(){
this->_ice = 0;
}
inline void change(){
this->_ice = !(this->_ice);
}
inline void reset(){
this->_cnt = 0;
}
private:
int _group;
int _ice;
unsigned int _cnt;
/**
* control digital screen 1
*
* @Author yimian
* @param int num # 待显示数字
* @return void
*/
void digital_show_1(int num){
digitalWrite(DIG_1_1, !!(num & (0x01<<0)));
digitalWrite(DIG_1_2, !!(num & (0x01<<1)));
digitalWrite(DIG_1_3, !!(num & (0x01<<2)));
digitalWrite(DIG_1_4, !!(num & (0x01<<3)));
}
/**
* control digital screen 2
*
* @Author yimian
* @param int num # 待显示数字
* @return void
*/
void digital_show_2(int num){
digitalWrite(DIG_2_1, !!(num & (0x01<<0)));
digitalWrite(DIG_2_2, !!(num & (0x01<<1)));
digitalWrite(DIG_2_3, !!(num & (0x01<<2)));
digitalWrite(DIG_2_4, !!(num & (0x01<<3)));
}
};
#endif
#endif