#ifndef __IRRIGATION_H
#define __IRRIGATION_H


/* Includes ------------------------------------------------------------------*/
#include "main.h"

#include "stdint.h"
#include "stdio.h"
#include "tim.h"  // 添加定时器头文件
#include "Save_Time.h"
#include "EEPROM.h"
#include "Inf_4G.h"
/* 类型定义 -----------------------------------------------------------------*/
// 工作模式枚举


// 系统状态枚举
typedef enum {
    SYS_STATE_STOP = 0,    // 系统停止
    SYS_STATE_RUNNING      // 系统运行
} SystemState;

// 风机状态枚举
typedef enum {
    FAN_1 = 0,    // 风机1
    FAN_2         // 风机2
} FanState;

/* 外部变量声明 -------------------------------------------------------------*/
// 直排模式时间参数
extern uint32_t DIRECT_HIGH_PUMP_ON_TIME;    // 高水位水泵开启时间
extern uint32_t DIRECT_HIGH_PUMP_OFF_TIME;   // 高水位水泵关闭时间
extern uint32_t DIRECT_HIGH_FAN_ON_TIME;     // 高水位风机开启时间
extern uint32_t DIRECT_HIGH_FAN_OFF_TIME;    // 高水位风机关闭时间
extern uint32_t DIRECT_LOW_FAN_ON_TIME;      // 低水位风机开启时间
extern uint32_t DIRECT_LOW_FAN_OFF_TIME;     // 低水位风机关闭时间
extern uint32_t DIRECT_FIRST_LOW_FAN_ON;     // 首次低水位风机开启时间
extern uint32_t DIRECT_FIRST_LOW_FAN_OFF;    // 首次低水位风机关闭时间

// 冲厕模式时间参数
extern uint32_t FLUSH_HIGH_PUMP_ON_TIME;    // 1分钟
extern uint32_t FLUSH_HIGH_PUMP_OFF_TIME; // 150分钟
extern uint32_t FLUSH_HIGH_FAN_ON_TIME;    // 40分钟
extern uint32_t FLUSH_HIGH_FAN_OFF_TIME;    // 2分钟
extern uint32_t FLUSH_LOW_FAN_ON_TIME;      // 5分钟
extern uint32_t FLUSH_LOW_FAN_OFF_TIME;    // 25分钟
extern uint32_t FLUSH_FIRST_LOW_FAN_ON;    // 40分钟
extern uint32_t FLUSH_FIRST_LOW_FAN_OFF;    // 2分钟

//灌溉模式时间参数
extern uint32_t HIGH_LEVEL_PUMP_ON_TIME;    // 1分钟
extern uint32_t HIGH_LEVEL_PUMP_OFF_TIME; // 120分钟
extern uint32_t HIGH_LEVEL_FAN_ON_TIME;    // 20分钟
extern uint32_t HIGH_LEVEL_FAN_OFF_TIME;    // 5分钟
extern uint32_t FIRST_LOW_FAN_ON_TIME;     // 10分钟
extern uint32_t FIRST_LOW_FAN_OFF_TIME;    // 10分钟
extern uint32_t LOW_LEVEL_FAN_ON_TIME;      // 5分钟
extern uint32_t LOW_LEVEL_FAN_OFF_TIME;    // 40分钟
extern uint32_t debug_pump_state;  // 用于调试的状态变量
// 特殊模式时间参数
// 特殊模式变量
extern uint32_t SPECIAL_INITIAL_STOP_TIME;    // 24小时 = 1440分钟 前5分钟
extern uint32_t SPECIAL_FIRST_PHASE_TIME;     // 48小时 = 2880分钟  后六分钟
extern uint32_t SPECIAL_PUMP_RUN_TIME;            // 前1分钟运行
extern uint32_t SPECIAL_FIRST_STOP_TIME;        // 前359分钟停止
extern uint32_t SPECIAL_SECOND_PHASE_TIME;    // 48小时 = 2880分钟
extern uint32_t SPECIAL_SECOND_STOP_TIME;       // 239分钟停止


// 计时器变量
extern uint32_t pump_timer;      // 水泵计时器
extern uint32_t fan_timer;       // 风机计时器
extern uint32_t first_low_timer; // 首次低液位计时器

// 参数修改标志
extern uint8_t parameters_changed;

// 强制控制标志
extern uint8_t force_pump_off;   // 强制关闭水泵
extern uint8_t force_fan_off;    // 强制关闭风机
extern uint8_t is_first_low;

extern volatile uint8_t time_just_modified;

//模式参数
// 当前工作模式
typedef enum {
    MODE_NONE = 0,       // 无模式/未初始化
    MODE_FLUSH = 1,     // 直排模式    
    MODE_IRRIGATION = 2, // 灌溉模式
    MODE_DIRECT = 3,      // 冲厕模式    
    MODE_SPECIAL = 4     // 特殊模式/培菌模式
} WorkMode;
extern WorkMode current_mode;                 // 当前工作模式
//特殊阶段时间参数

extern uint32_t special_phase_timer ;  // 阶段计时器
extern uint32_t special_cycle_timer;  // 循环计时器
/* 函数声明 ----------------------------------------------------------------*/
// 设备控制函数（这些函数需要在其他地方实现）
void Control_WaterPump(uint8_t state);
void Control_Fan1(uint8_t state);
void Control_Fan2(uint8_t state);

uint8_t Read_FloatBall(void);

// 应用层函数
void Device_Init(void);                    // 设备初始化
uint8_t Read_FloatBall_Stable(void);      // 读取浮球状态（带防抖）



void Direct_Mode_Control(void);            // 直排模式控制
void Irrigation_Mode_Control(void);       // 灌溉模式控制
void Flush_Mode_Control(void);       // 冲洗模式控制
void Special_Mode_Control(void);  // 特殊模式控制

//特殊模式
typedef enum {
    SPECIAL_INITIAL_STOP = 0,  // 初始阶段：24小时停止
    SPECIAL_FIRST_PHASE = 1,   // 第一阶段：48小时，6小时循环
    SPECIAL_SECOND_PHASE = 2,  // 第二阶段：48小时，4小时循环 
    SPECIAL_TO_DIRECT = 3      // 特殊模式结束，切换到直排模式
} SpecialPhase_t;
extern  SpecialPhase_t special_phase;
void Switch_To_Special_Mode(void);  // 切换到特殊模式

void Switch_Mode(WorkMode new_mode);


void Restart_Current_Mode(void);

extern volatile uint8_t timer_pause;  // 计时器暂停标志
#endif /* __APP_WORK_H */



