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.
 
 
 
 

450 lines
12 KiB

#include "ozone_work.h"
#define TIMINT_TIME 1800000
#define INTERVAL_TIME 300000
//#define TIMINT_TIME 10000
//#define INTERVAL_TIME 1000
//#define TIMINT_TIME 120000
//#define INTERVAL_TIME 60000
extern uint32_t g_frequency;
extern uint32_t g_sys_sick;
extern uint32_t g_duty[4]; // PWMd的占空比
extern adc_t adc;
ozone_message_t ozone_message = {0};
int interval_key_press_frequency = 0; //每按下4次进行清0
int g_ozen_gears = 1; //上电默认输出100%,按下一次档位按键输出50%的PWM
int time_key_press_frequency = 0; //每按下4次进行清0
//###################### 高低档按键开始 ################//
void ozone_work_mode(int mode) {
if (ozone_message.ozone_work_state != 2) {
ozone_message.ozone_work_state = 1;
}
port_fan_set(true);
switch (mode) {
case 0:
gears_led_on(0);
break;
case 1:
gears_led_on(1);
break;
case 2:
gears_led_on(2);
break;
case 3:
timing_ozone_work_over(); //结束工作
break;
default:
break;
}
}
void update_interval_down_begin_sys_time(void) {
ozone_message.count_interval_down_begin_sys_time = get_sys_ticket();
}
void update_ozer_work_state(void) {
// int gears_time_key_press_frequency = 0;
if (ozone_message.ozone_interva_state == true &&
ozone_message.interva_flag ==
true) { //如果现在是间歇休息时间,直接开始工作
update_interval_down_begin_sys_time();
ozone_message.interva_flag = false;
}
// if (time_key_press_frequency == 0) {
// gears_time_key_press_frequency = 4;
// } else {
// gears_time_key_press_frequency = time_key_press_frequency - 1;
// }
// if (ozone_work_state == 2) {
// timing_led_on(gears_time_key_press_frequency); //打开led灯
// }
}
void set_ozen_gears(int ozen_gears) {
/**
* @brief Construct a new switch object
* 设置pwm输出
*/
update_ozer_work_state(); //如果现在定时时间未结束并且处于间歇休息时间,直接设置为间歇工作时间
switch (ozen_gears) {
case 0:
set_pwm_frequency_duty(g_frequency, g_duty[0]);
g_ozen_gears = 1;
// printf("pwm g_duty:%d", g_duty[0]);
ozone_work_mode(0);
break;
case 1:
set_pwm_frequency_duty(g_frequency, g_duty[1]);
g_ozen_gears = 2;
// printf("pwm g_duty:%d", g_duty[1]);
ozone_work_mode(1);
break;
case 2:
set_pwm_frequency_duty(g_frequency, g_duty[2]);
// g_ozen_gears = 3;
g_ozen_gears = 0;
// printf("pwm g_duty:%d", g_duty[2]);
ozone_work_mode(2);
break;
// case 3:
// set_pwm_frequency_duty(g_frequency, g_duty[3]);
// g_ozen_gears = 0;
// printf("pwm g_duty:%d", g_duty[3]);
// ozone_work_mode(3);
// break;
}
}
/**
* @brief
*
* @param led_number 0亮红灯 1亮绿灯 2亮蓝灯 3全灭
*/
void gears_led_on(uint8_t led_number) {
for (int i = 0; i < 3; i++) {
if (i == led_number) {
s_rgb[i].set_led_state = true;
s_rgb[i].port_led_set(s_rgb[i].set_led_state);
} else {
s_rgb[i].set_led_state = false;
s_rgb[i].port_led_set(s_rgb[i].set_led_state);
}
}
}
#if 0
void gears_led_on(uint8_t led_number) {
switch (led_number) {
case 0:
port_led_r_set(true);
port_led_g_set(false);
port_led_b_set(false);
break;
case 1:
port_led_r_set(false);
port_led_g_set(true);
port_led_b_set(false);
break;
case 2:
port_led_r_set(false);
port_led_g_set(false);
port_led_b_set(true);
break;
case 3:
port_led_r_set(false);
port_led_g_set(false);
port_led_b_set(false);
break;
default:
break;
}
}
#endif
//###################### 高低档按键结束 ################//
//###################### 定时按键开始 ################//ozone_message
void set_ozone_work(void) {
according_now_gear_set_pwm();
}
void set_ozone_work_time(void) {
if (!ozone_message.ozone_work_state) { //如果现在不是工作状态,直接开始工作
set_ozen_gears(0);
} else {
if (ozone_message.ozone_work_state == 2) { //定时工作的时候
set_ozone_work();
}
}
ozone_message.ozone_work_state = 2; //处于定时工作状态
//获取现在的时间,作为判断倒计时时间的基准
ozone_message.count_down_begin_sys_time = get_sys_ticket();
port_fan_set(1); //风扇开始工作
switch (time_key_press_frequency) {
case 5:
time_key_press_frequency = 0;
case 0: // 30min
time_key_press_frequency = 1;
timing_led_on(0);
break;
case 1: // 60min
time_key_press_frequency = 2;
timing_led_on(1);
break;
case 2: // 90min
time_key_press_frequency = 3;
timing_led_on(2);
break;
case 3: // 120min
time_key_press_frequency = 4;
timing_led_on(3);
break;
case 4:
timing_led_on(4);
ozone_message.ozone_work_state = 1; //一直工作
time_key_press_frequency = 0;
break;
default:
break;
}
ozone_message.timing_rank = time_key_press_frequency;
ozone_message.ozone_work_time =
time_key_press_frequency * TIMINT_TIME; //定时时间
printf("ozone_message.ozone_work_time%d\r\n", ozone_message.ozone_work_time);
}
void timing_ozone_work_over(void) {
/**
* @brief 定时结束
*
*/
close_ozone_work();
ozone_message.ozone_work_state = 0;
ozone_message.ozone_work_time = 0;
ozone_message.switch_key_state = false;
time_key_press_frequency = 0;
}
/**
* @brief 定时结束后将
*
*/
void is_ozone_work_time_over(void) {
if (port_haspassedms(ozone_message.count_down_begin_sys_time) >=
TIMINT_TIME) {
ozone_message.count_down_begin_sys_time = get_sys_ticket();
if (ozone_message.timing_rank == 1) {
timing_ozone_work_over();
// interval_key_press_frequency = 0;
ozone_message.ozone_interva_state = false;
interval_key_press_frequency = 0;
printf("time over\r\n");
} else {
printf("time 30min\r\n");
time_key_press_frequency--;
ozone_message.timing_rank--;
timing_led_on(ozone_message.timing_rank - 1);
}
}
}
/**
* @brief 定时时间设定后对应指示灯亮起
*
* @param led_number 0亮led0 1亮led1 2亮led2 3亮led3 4全灭并代表臭氧机结束工作
*/
void timing_led_on(uint8_t led_number) {
if (led_number == 4) {
port_led0_set(false);
port_led1_set(false);
port_led2_set(false);
port_led3_set(false);
} else {
for (int i = 0; i < 4; i++) {
if (i <= led_number) {
s_leds[i].set_led_state = true;
s_leds[i].port_led_set(s_leds[i].set_led_state);
} else {
s_leds[i].set_led_state = false;
s_leds[i].port_led_set(s_leds[i].set_led_state);
}
}
}
}
#if 0
void timing_led_on(uint8_t led_number) {
switch (led_number) {
case 0:
port_led0_set(true);
port_led1_set(false);
port_led2_set(false);
port_led3_set(false);
break;
case 1:
port_led0_set(false);
port_led1_set(true);
port_led2_set(false);
port_led3_set(false);
break;
case 2:
port_led0_set(false);
port_led1_set(false);
port_led2_set(true);
port_led3_set(false);
break;
case 3:
port_led0_set(false);
port_led1_set(false);
port_led2_set(false);
port_led3_set(true);
break;
case 4:
port_led0_set(false);
port_led1_set(false);
port_led2_set(false);
port_led3_set(false);
break;
default:
break;
}
}
#endif
//###################### 定时按键结束 ################//
//###################### 开关按键开始 ################//
bool get_ozone_starting_up_state(void) {
return ozone_message.switch_key_state;
}
/**
* @brief 开机后工作状态
*
*/
void set_ozone_starting_up(void) { according_now_gear_set_pwm(); }
/**
* @brief 关闭工作状态
*
*/
void set_ozone_shutdown(void) {
time_key_press_frequency = 0;
interval_key_press_frequency = 0;
ozone_message.ozone_interva_state = false;
memset(&adc, 0, sizeof(adc));
close_ozone_work();
}
void process_switch_key(void) {
//开机以后按照上次关机前的设置进行工作
ozone_message.switch_key_state = !ozone_message.switch_key_state;
if (ozone_message.switch_key_state) { //开机
set_ozone_starting_up();
} else { //关机
set_ozone_shutdown();
}
}
//###################### 开关按键结束 ################//
//###################### 间歇按键开始 ################//
void set_rgb_on(void) {
int rgbx_flicker = 0;
if (g_ozen_gears == 0) {
rgbx_flicker = 2;
} else {
rgbx_flicker = g_ozen_gears - 1;
}
gears_led_on(rgbx_flicker);
}
void set_rgb_off(void) {
gears_led_on(3); //关闭RGB
}
void set_rgb_flicker(void) {
static uint32_t rgb_ticket = 0;
static uint8_t rgb_ticket_count = 0;
if (port_haspassedms(rgb_ticket) > 1000) {
rgb_ticket = get_sys_ticket();
if (rgb_ticket_count < 3) {
set_rgb_on();
} else {
set_rgb_off();
rgb_ticket_count = 0;
}
rgb_ticket_count++;
}
}
/**
* @brief 按键控制,无间歇时间的时候,臭氧的工作状态
*
*/
void set_stop_interval_ozone_work(void) {
set_rgb_on();
port_fan_set(true);
ozone_interval_begin();
}
void set_interval_time(void) {
update_interval_down_begin_sys_time();
switch (interval_key_press_frequency) {
case 0:
printf("begin interval\n");
ozone_message.ozone_interva_state = true;
ozone_message.ozone_interval_time = INTERVAL_TIME; // 5分钟
interval_key_press_frequency = 1;
break;
case 1:
printf("stop interval");
ozone_message.ozone_interva_state = false;
interval_key_press_frequency = 0;
set_stop_interval_ozone_work();
break;
}
}
static void ozone_interval_begin(void) { according_now_gear_set_pwm(); }
void ozone_interval_over(void) {
set_pwm_frequency_duty(g_frequency, g_duty[3]); //关闭PWM输出
port_fan_set(false); //风扇结束工作
}
void is_ozone_interva_time_over(void) {
if (port_haspassedms(ozone_message.count_interval_down_begin_sys_time) >=
ozone_message.ozone_interval_time) {
update_interval_down_begin_sys_time();
if (ozone_message.interva_flag == false) {
ozone_message.interva_flag = true;
printf("work over\r\n");
ozone_interval_over();
} else if (ozone_message.interva_flag == true) {
ozone_message.interva_flag = false;
printf("work begin\r\n");
ozone_interval_begin();
}
}
}
//###################### 间歇按键结束 ################//
void according_now_gear_set_pwm(void) {
int interval_ozen_gears = 0;
if (g_ozen_gears == 0) {
interval_ozen_gears = 2;
} else {
interval_ozen_gears = g_ozen_gears - 1;
}
//开启PWM输出
set_ozen_gears(interval_ozen_gears);
}
void power_on_ozone_work_state(void) {
close_ozone_work();
g_ozen_gears = 1; //为了点击开关后最高档工作
time_key_press_frequency = 5; //为了点击开关后无定时时间
}
static void close_ozone_work(void) {
set_pwm_frequency_duty(g_frequency, g_duty[3]); //关闭PWM输出
gears_led_on(3); //关闭RGB
timing_led_on(4); //关闭4个led灯
port_fan_set(false); //风扇结束工作
}
/**
* @brief 当电压发生异常的时候
* 关闭臭氧工作,led0闪烁
*
*/
void process_voltage_abnormal(void) {
static uint32_t lastprocess = 0;
static uint8_t led_state = 1;
if (!adc.first_detection_abnormal) {
adc.first_detection_abnormal = true;
close_ozone_work();
}
if (port_haspassedms(lastprocess) > 300) {
lastprocess = get_sys_ticket();
led_state = !led_state;
port_led0_set(led_state);
}
}