== MCU产气，补水流程 ==

=== 补水 ===
补水阶段涉及到一楼水箱和二楼湿化杯，j6电磁阀1，j15电磁阀2，j8真空泵，加水是加到二楼湿化杯里面，一楼水箱是机器工作时用的水，补水时一楼会向二楼进行吸水，一楼的水能供机器产8h；

==== 一楼二楼都没水 ====
* 一楼二楼都没水时，点击运行提示“若为新设备首次补水，请继续补水，否则请检测设备是否漏水”，然后向二楼湿化杯加水，当二楼水位大于等于L时，进入补水——j6、j15分别on\off 2个循环，然后再on，再将j8真空泵on，在补水过程中，若二楼湿化杯的水位到H或者VH都要播报语音：“请暂停加水”，检测到一楼等于H后，补水结束，并自动产气12s，自动产气结束后判断二楼水位，并根据水位播报相应语音；
* 若在补水过程中，二楼水位小于L，则会停止补水，当二楼水位再次满足条件时才会继续进行补水——j6、j15分别on\off 2个循环，然后再on，再将j8真空泵on；

==== 一楼水位为非H，二楼没水 ====
* 若一楼水位为非H，点击运行提示“补水箱水位低，请加水”，向二楼湿化杯加水，水位大于等于L时，进入补水——j6、j15分别on\off 2个循环，然后再on，再将j8真空泵on，在补水过程中，若二楼湿化杯的水位到H或者VH都要播报语音：“请暂停加水”，检测到一楼等于H后，补水结束，并自动产气12s，自动产气结束后判断二楼水位，并根据水位播报相应语音；
* 若在补水过程中，二楼水位小于L，则会停止补水，当二楼水位再次满足条件时才会继续进行补水——j6、j15分别on\off 2个循环，然后再on，再将j8真空泵on；

==== 一楼水位为H，二楼没水 ====
* 若一楼水位为H，则判断二楼水位，并根据二楼水位来播报语音，当一楼二楼双H之后，播报“补水箱水位已满，请旋紧注水口盖”，之后可进行产气；

=== 产气 ===
* 产气时会记录每次产气的时间，并进行累加，每次点开始产气时，会判断累加的产气值+设定的产气时间是否大于8h，若大于8h则会进入上述补水流程；
* 产气过程中当二楼的水位为低时，会强制停止产气，播报“水位太低，停止产气”，若再次点击开始则会进入补水流程，若直接向二楼加水到L后可继续产气；
* 产气过程中当一楼的水位为低时，会强制停止产气，播报“水位太低，停止产气”，直接进入补水流程；
* 当已累计时间+设定时间小于8h并且一楼和二楼的水位都大于L时，均可产气；

==== 额外条件 ====

* 若产气停止，电源软关机，产气暂停后，j15要等待10min后才能关闭，若10min期间开始产气，则计时清零；
* 若（累计已产气时间）＜7.5H，系统不自动补水，若（累计已产气时间）≥7.5H，系统自动补水；
* 产气过程中，累计产气时间4小时自动补水一次至1楼=H；
* 当进行补水时，若补水时间大于100s则强制停止补水；
* 每次补水时都会清空累计产气时间；

== 上位机更新MCU流程 ==
* 上位机写入”AT+VER\r\n”到ttyS3串口；
* MCU读取串口数据，然后以”+VER,”+版本号形式写入ttyS3串口；
* 上位机读取串口数据，并判断stm32.bin文件是否存在；
* stm32.bin存在则写入”AT+IAP\r\n”到ttyS3串口；
* MCU读取串口数据，然后将”+IAP,OK”写入ttyS3串口，再将C写入串口；
* 上位机读取串口数据，读取到”+IAP,OK”后创建Ymodem对象，并将串口传入Ymodem;
* Ymodem通过串口读取到C后，发送SOH数据包到串口；
* MCU接收到SOH后，先发送ACK到串口，再发送C;
* 上位机接收到ACK和C后发送STX数据包到串口；
* MCU接收到STX后发送ACK到串口；
* 重复STX和ACK的流程，STX的数据帧大小为1024字节，当最后一帧不足1024字节，上位机发送SOH到串口；
* Ymodem收到MCU回复的ACK后，发送EOT到串口；
* Ymodem收到MCU回复的NAK后，再次发送EOT到串口；
* MCU回复ACK和C;
* Ymodem回复SOH结束帧；
* MCU回复ACK后，传输结束；
* MCU对接收到的stm32.bin文件进行校验，校验成功后将APP对应的地址进行擦除，然后stm32.bin复制到相应地址上，升级完成；