/* MAIN.C file
 * 
 * stm32-project
 */
/******************************
修改记录：
1、
修改人：鲍胜文
修改日期：2017年3月18日
修改内容：增加输入总量报警功能

2、
修改人：鲍胜文
修改日期：2017年3月22日
修改内容：1)修改显示界面中的极限量由1~200为1~90
          2)修改在工程模式下的自控流速由0~400调整为0~100


3、
修改人：鲍胜文
修改日期：2017年3月23日
修改内容：1)修改压力采集突然出现数字偏大的问题


4、
修改人：鲍胜文
修改日期：2017年3月24日
修改内容：1)修改预报警后无声音报警，只有光标闪烁       


5、
修改人：鲍胜文
修改日期：2017年4月10日
修改内容：1)修改报警时，按按键蜂鸣器长鸣 
          2)修改自控时报警，按暂停键暂停，再启动乱码问题，现在直接进入主运行界面
					
6、
修改人：鲍胜文
修改日期：2017年4月11日
修改内容：1)修改泵头在进行自控运行时，如果此时出现扣合、堵塞、气泡报警，在对报警
            进行出理时出现乱码，随后再次运行，自控按键失灵的问题
						
7、
修改人：鲍胜文
修改日期：2017年4月15日
修改内容：1)修改首次量不计入极限量计算
          2)修改在运行过程中，进行参数设置后，再次运行，已输入量清零的问题
					
8、
修改人：鲍胜文
修改日期：2017年4月17日
修改内容：1)修改电池预报警，响一声，之后只光标闪烁
          			
9、
修改人：鲍胜文
修改日期：2017年4月18日
修改内容：1)修改在输入量不为零，输入完毕报警不记忆
          2)修改首次量、追加完成后，输入完毕报警不记忆

10、
修改人：鲍胜文
修改日期：2017年5月2日
修改内容：1)修改剩余量在上位机显示负数的问题
      
11、
修改人：鲍胜文
修改日期：2017年5月3日
修改内容：1)修改自控手柄按键按一下会出现无效自控次数变多次	

12、
修改人：鲍胜文
修改日期：2017年5月6日
修改内容：1)修改堵塞报警算法，以前是连续采集五次数据大于设定值，报警，
            现在改为采集十次压力值，去掉一个最大值和最小值，取平均值，大于设定值报警，下次采集的最新值，替代最早的采集值。

13、
修改人：鲍胜文
修改日期：2017年5月19日
修改内容：1)修改预报警后，按键没有声音
         2）修改当电池电压大于4.5V时，系统判断为是异常值，不停的在采集电压，导致霍尔一直有电，指示灯常亮，功耗增加，现在改为4.9
				 
14、
修改人：鲍胜文
修改日期：2017年6月20日
修改内容：1)堵塞报警自适应程序，从按下启动按键后，连续采集五次压力数据，去掉最大值，去剩下四组数据的最大值做为堵塞压力基准值，在
            此值基础上加3，做为堵塞报警的参考值
						
15、
修改人：鲍胜文
修改日期：2017年7月18日
修改内容：1)修改部分ADS1110出现的压力值不变的问题，是由于在没有压力的时候，芯片采集的数据很大，被舍弃掉后，采集次数为0，无法更新数据						
				 
16、
修改人：鲍胜文
修改日期：2017年8月4日
修改内容：1)修改电源按键长按，出现机械故障的问题
         2）修改输入总量报警，偶尔出现误报的问题		


17、
修改人：鲍胜文
修改日期：2017年8月5日
修改内容：1)修改在出现报警前，按静音/密码键，出现死机的问题	

18、
修改人：鲍胜文
修改日期：2017年8月8日
修改内容：1)修改压力采集次数不稳、偏低的问题，目前通过对界面进行优化，提高采集次数

19、
修改人：鲍胜文
修改日期：2017年8月14日
修改内容：1)修改时间显示，秒显示没有变化

20、
修改人：冯伟旗
修改日期：2018年1月31日
修改内容：1）修改电池值刷新和电池图标刷新显示

20、
修改人：鲍胜文
修改日期：2018年3月23日
修改内容：1）针对模块深度睡眠对丢包率有影响，优化lorawan模块深度睡眠的模式。

21、
修改人：鲍胜文
修改日期：2018年4月12日
修改内容：
修改进入睡眠模式的方式，目前有两种情况可以进入睡眠模式：
1）数据发送后，判断lorawan模块是否发送完成，完成就进入睡眠模式，
2）收不到完成标志，为降低功耗，用定时的方式，发送完数据后，最多延时5s进入睡眠模式

22、
修改人：鲍胜文
修改日期：2018年7月23日
修改内容：
1）把“科技创新”修改为“应用创新”
2）当低电量预报警时，电池电压在预报警临界值时，在电机运行或者数据发送时，电池电量在临界值忽高忽低，导致预报警数据一直在发送

23、
修改人：鲍胜文
修改日期：2018年8月06日
修改内容：
1）目前数据包长度为64字节，需要拆分为两个数据包，一个在运行时发送，一个在异常或者修改参数时发送
2）一个数据包长度为：32字节，一个为15字节

24、
修改人：鲍胜文
修改日期：2018年9月05日
修改内容：
1）为增加数据发送的有效性，增加泵头和上位机的握手协议

25、
修改人：鲍胜文
修改日期：2018年12月25日
修改内容：
1）修改泵头和上位机的握手协议，有原来的泵号转变为住院号

26、
修改人：王利阳
修改日期：2019年01月
修改内容：
）增加关机住院号清零函数
）镇痛不足报警触发方式优化
）取消镇痛评分
）泵头历史记录修改100条改5条
）万能密码120，并修改不可设置密码
修改日期：2019年02月
）开机宣传标语修改
）历史记录翻转时间3s改5s
）

25、
修改人：鲍胜文
修改日期：2019年2月15日
修改内容：
1）修改去掉副芯片、在主芯片上增加副芯片的控制功能

26、
修改人：鲍胜文
修改日期：2019年2月25日
修改内容：
1）去掉外挂FLASH芯片，使用芯片内部flash


27、
修改人：鲍胜文
修改日期：2019年3月04日
修改内容：
1）优化报警声音、按键声音
2)修改报警声音，按照注册标准，声音变为滴滴滴三声，声音维持时间为200ms，第一声和第二声间隔为100ms，第二声和第三声间隔为200ms，脉冲群时间间隔为10s
3）背景光频率为0.4HZ，占空比为20%（亮0.5s，灭2秒）
4)修改报警声音，有原来的嘀嘀两声变为滴滴滴三声
5)修改静音按键，原来静音后，无法再回复，现在改为按下静音按键，2分钟后自动回复为非静音状态
6) 静音按键不在控制背光

28、
修改人：鲍胜文
修改日期：2019年3月08日
修改内容：
1）修改静音按键长按的时候，静音图标不显示，并且2min计时到后，静音功能不解除
2) 修改报警时，按静音按键，出现长鸣的情况
3）修改在静音2min内再次按压静音，静音2min重新计时问题

28、
修改人：鲍胜文
修改日期：2019年3月13日
修改内容：
1）修改输入总量报警时，屏幕一直闪烁，界面一直刷新问题
2）修改自控界面持续输注界面暂停图标自动上锁会一直闪烁，手动上锁暂停图标不闪烁
3）修改PCA按压时，连续两次按压时，出现无效次数瞬间增加到很大的问题，

29、
修改人：鲍胜文
修改日期：2019年3月16日
修改内容：
1）处理在关机过程中，预报警电池图标闪烁问题
2）处理在关机过程中，偶尔有按键有效

30、
修改人：鲍胜文
修改日期：2019年4月3日
修改内容：
1）添加LED指示灯功能

31、
修改人：鲍胜文
修改日期：2019年4月10日
修改内容：
1）增加红外气泡检测功能

32、
修改人：鲍胜文
修改日期：2019年4月22日
修改内容：
1）增加电机运行过程中，电流检测

33、
修改人：鲍胜文
修改日期：2019年4月29日
修改内容：
1）优化系统功耗，目前待机电流在12ms左右
2）修改电压检测机制，有原来ADC1连续的DMA采集方式，改为ADC2不连续采集，

34、
修改人：鲍胜文
修改日期：2019年5月6日
修改内容：
1）取消泵头时钟芯片功能
2）修改电池预报警电压值
3）制定预报警到电量耗尽报警的时间间隔，暂定40分钟

34、
修改人：鲍胜文
修改日期：2019年5月28日
修改内容：
1）增加气泡传感器的未装药盒报警功能：当红外气泡传感器采集的数据大于1300、小于1650时i，报未装药盒报警
2）增加电流检测堵塞报警功能：1>当采集电流大于1500，连续三次，直接报堵塞报警
                           2>当按下运行按键，前三个周期采集的电流值，去电一个最大值，去掉一个最小值，取中间值为
                               基准值，后面采集的数值和基准值做比较，当连续两个数值都大于基准值150时，报堵塞报警			
                           3>增加电机失控检测机制，在WORK_OFF状态下，通过检测电机内部电流判断电机失控															 
35、
修改人：鲍胜文
修改日期：2019年6月20日
1）在原有的AD检测电流失控方式上，增加双路控制电机
2）数据存储有原来的0.1ml存储一次，改为1ml存储一下
3）修改电池预报警声音，有原来的循环声音报警改为只响一次		

36、
修改人：王利阳
修改日期：2019.08.15
1）增加堵塞报警后手动解除，回到运行前界面
2）增加检测电池电量小于3.3v，三次后之间报警，且电量耗尽不能解除
修改日期：2020.01.09
1）限制排气量在100ml范围内
37、修改人：王利阳
修改日期：2021.01.14
1）历史记录做100条假数据，真实数据10条，第一条位最新数据，“+”按键一次类推
2）住院号修改为进入住院号设置界面即可
3）开始暂停键具有返回的功能，静音按键有返回功能
4）Enter按键具有长按快速跳转功能
38、修改人：王利阳
修改日期：2021.02.22
1）PCA运行状态下，发生报警，手动或自动解除返回到PCA界面
2）PCA锁时在报警、暂停界面下都能运行
39、修改人：王利阳
修改日期：2021.03.10
1）输注量50ml/h时，30s发送一次数据
2）设置界面电量耗尽报警半小时后喇叭不响
3）报警时屏幕背光闪三次后结束
4）低电压预报警打断其他报警声音
40、修改人：王利阳
修改日期：2021.03.23
1）取消电池预报警LED灯光闪烁
41、修改人：王利阳
修改日期：2021.03.26
1）PCA有效次数无效次数，PCA锁时闪烁，上锁、暂停、呼叫标志单独刷新，不跟随系统
42、修改人：吴连威
修改日期：2022.06.24
1）添加MQTT通信功能
2）添加MQTT注册功能

********************************/
/*-------------------------------------------------------------------------------------------------------
*  System Start Here..																		 
-------------------------------------------------------------------------------------------------------*/
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "TypeDefine.h"
#include "Driver.h"
#include "TimerSetup.h"
#include "ADS1110Setup.h"
#include "ADS1110ASetup.h"
#include "ADCSetup.h"
#include "RTCSetup.h"
#include "History.h"
#include "ControlSystem.h"
#include "DrawLCDGUI.h"
#include "SystemAlarm.h"
#include "ZigbeeDataHandle.h"
#include "HostSlaveHandle.h"
#include "FM31256.h"
#include "lorawan.h"
#include "Bubble_ADCSetup.h"
#include "delay.h"
#include "TypeDefine.h"
#include "regist.h" // add by wulianwei
#include "remote.h" // add by wulianwei
#include "ProgramData.h" // add by wulianwei
#include "module_wrapper.h" // add by wulianwei
#include "CoapHandle.h" // add by wulianwei

extern uint8_t  time_1sflag;
extern uint8_t  time_3sflag;
uint8_t test_buf[50] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,
                        0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};
extern uint8_t lorawan_init_flag;//lorawan初始化完成标志
extern uint8_t self_check_finish;                         //自检完成标志 
/*********************************************************************************
*  Function:	main			                                                           
*  Object:		系统主函数
*  输入:			无
*  输出:			无	                                     
*  备注:			1、对底层初始化HWSetup();
*							2、对系统初始化SystemSWInit();
*							3、控制系统初始化工作CntlSysInitWork();
*							4、按键工作控制ScanKeyWorkType();
*							5、系统工作步骤控制CntlSystemWorkStep();
*							6、传感器电源控制CntlSensorPWWork();
*							7、LCD显示刷新LCDPictureDisplay();
*							8、系统报警判断SystemAlarmJudge();
*							9、系统时间更新SystemTimeUpdate();
*							10、系统休眠控制CntlSystemStandby();	
*							11、zigbee数据发送ZigbeeXmitHandle();
*							12、zigbee数据接收处理ZigbeeRecvHandle();
*							13、主从通信处理HostToSlaveHandle();
*							14、蜂鸣器工作控制CntlSpeakerWork();
*							15、自动关机控制CntlAutoPowerOff();
*							16、背光工作控制CntlLCDBlackWork();
*							17、系统按顺序执行函数，每个函数中都会有相应的标志位，
*									如果有标志位置位则进行相应函数操作，否则直接跳出进入下一函数执行
**********************************************************************************/
int main(void)
{
	//对底层初始化HWSetup()
	HWSetup();
	//对系统初始化SystemSWInit();
	SystemSWInit();	
	// LoraNode_OTAA_Config(); //lorawan OTAA模式配置*/ // update by wulianwei
	
	ModelRegister(); //加载通讯模块 add by wulianwei
	if( EngineeringModeValue.networkState ==  ENGINEERINGMODE_ON )
	{
			DeviceRegist();//注册设备 add by wulianwei
			//GetDeviceConf();
	}
	
	if(EngineeringModeValue.networkState !=  ENGINEERINGMODE_ON || registInfo->flag != 'Y') at_module_low_power(); //网络模式关或注册失败，关闭通信模块射频功能
	
	//transparent_mode();     //透传模式配置
	while(1)
	{ 	
		lorawan_Sleep(); //调用lorawan睡眠函数
		
		//控制系统初始化工作CntlSysInitWork();
		CntlSysInitWork();
		
		//按键工作控制ScanKeyWorkType();
		if( realTimeData.stateRun != Poweroff )//处理在关机过程中，偶尔有按键有效
		{
 		  ScanKeyWorkType();
		}
		
		//系统工作步骤控制CntlSystemWorkStep();
		CntlSystemWorkStep();
		
		//传感器电源控制CntlSensorPWWork();
		CntlSensorPWWork();
		
		//lec进度条刷新
		DrawScheduleDisplay();
		
		//LCD显示刷新LCDPictureDisplay();
		LCDPictureDisplay();	
		
		//系统报警判断SystemAlarmJudge();
		SystemAlarmJudge();	

    //系统时间更新SystemTimeUpdate();		
		SystemTimeUpdate();
		
		//读取触力传感器的值
	//	ContactForceUpdate(); 
		
		//采集电池电压
		BatteryVoltADCGet();
		
		//气泡检测
		OPB350L_ADCGet();
		
		//电机运行过程中的电流检测
		Electricity_ADCGet();
		
		//检测电机失控
		Electricity_WorkOffGet();
		
		//实时数据及状态更新
		RealTimeStateUpdate();
		
		//系统休眠控制CntlSystemStandby();	
		//CntlSystemStandby();	

    //zigbee数据发送ZigbeeXmitHandle();
		//ZigbeeXmitHandle(); // update by wulianwei
		
		//zigbee数据接收处理ZigbeeRecvHandle();
		ZigbeeRecvHandle(); 

		if( EngineeringModeValue.networkState ==  ENGINEERINGMODE_ON && registInfo->flag == 'Y')
		{
			CoapHandle(); // 处理MQTT通信 add by wulianwei
			remoteHandle();//远程配置功能
		}
		
		else
		{
			if(realTimeData.stateRun == Poweroff)
			{
				TaskSchedulerFlag.sysPowerOffFlag = TASK_FLAG_SET;//关机
			}
		}
		
		//处理uart2接收到的数据
		Uart2RecvHandle();
		
		//发送历史数据到PC
//		HistorySendToPC();
		
		//主从通信处理HostToSlaveHandle();
		HostToSlaveHandle();
		
		//蜂鸣器工作控制CntlSpeakerWork();
		CntlSpeakerWork();
		
//		CntlHornWork();
		
		//自动关机控制CntlAutoPowerOff();
//        CntlAutoPowerOff();
		
		//30min无操作自动提示
		CntlNoActionHint();
		
		CntlHornWork();
		
		//背光工作控制CntlLCDBlackWork();
		CntlLCDBlackWork();
	
	}
	/*while(1)
	{
		CntAlarmSpeaker(0x01);//喇叭单声提示音
		Delay_ms(500);
	}*/
}



