{
  "source": "E2EBotConversation",
  "sessionUuid": "b888ca0f-1871-4e62-b489-b71f59a52447",
  "messages": [
    {
      "id": "43134945",
      "role": "user",
      "status": "success",
      "content": "介绍项目的业务目标、核心功能、整体架构、数据实体、业务流程",
      "payload": {
        "query": "介绍项目的业务目标、核心功能、整体架构、数据实体、业务流程",
        "knowledgeList": []
      },
      "context": {
        "conversationId": 16960096
      }
    },
    {
      "id": "afda2d4f-ec63-4d00-b1c7-4494160a8a87",
      "userMessageId": "43134945",
      "role": "assistant",
      "status": "completed",
      "content": {},
      "elements": [
        {
          "id": "7ee85137-b438-4288-9a09-2401e818465c",
          "type": "TEXT",
          "status": "success",
          "content": "我来帮你分析这个项目的整体情况。让我先查看一些关键文件来了解项目的核心内容。\n\n",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        },
        {
          "id": "752faa40-e2d4-4d33-93b5-36ede442be85",
          "type": "TOOL_CALL",
          "status": "success",
          "toolName": "read_file",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "workflowStatus": "success",
          "displayParams": {
            "path": "main.h"
          },
          "displayResult": {
            "lineCount": 684,
            "readFile": {
              "path": "d:\\AUTOMFL\\Yuhong\\MFL_DYM\\src\\main.h",
              "startLine": 1,
              "endLine": 684
            }
          },
          "workflowSnapshot": {
            "status": "success",
            "result": {
              "name": "read_file",
              "type": "tool_use",
              "params": {
                "path": "main.h"
              },
              "success": true,
              "message": "",
              "code": 0,
              "result": {
                "content": "#ifndef MAIN_H\n#define MAIN_H\n\n#define NULL 0\n\ntypedef unsigned long long \tu64;\ntypedef   signed long long \ts64;\n\n//������ܲɼ�ģ��״ֵ̬\n#define DEBUG_STATUS_INITIAL \t\t0x10\n#define DEBUG_STATUS_CONFIG \t\t0x20\n#define DEBUG_STATUS_WAIT \t\t\t0x30\n#define DEBUG_STATUS_RXD \t\t\t\t0x40\n\n//���巢�ͱ�������\n#define DEBUGCOMMAND_REPORT_STATUS\t\t0xA5\n\n//��������ģ��״ֵ̬\n#define BT_STATUS_INITIAL \t0x10\n#define BT_STATUS_CONFIG \t\t0x20\n#define BT_STATUS_WAIT \t\t\t0x30\n#define BT_STATUS_RXD \t\t\t0x40\n\n//���巢�ͱ�������\n#define BTCOMMAND_REPORT_STATUS\t\t0xA5\n\n//����������״ֵ̬\n#define MAIN_STATUS_WELCOME \t\t\t0x10\n\n#define MAIN_ITEM_NUM 3\n#define MAIN_STATUS_FUNCTION \t\t\t0x20\n#define MAIN_STATUS_PROGRAM \t\t\t0x30\n#define MAIN_STATUS_MESSAGE \t\t\t0x40\n#define MAIN_STATUS_DEBUG   \t\t\t0x80\n#define MAIN_STATUS_INITRESET\t\t\t0x90\n#define MAIN_STATUS_DIS_POWER   \t0xA0\n\n#define FUNCTION_ITEM_NUM 8\n#define FUNCTION_MANHUI 0x21\n#define FUNCTION_KUAIHUI 0x22\n#define FUNCTION_HUIFA 0x23\n#define FUNCTION_ZIXUANA 0x24\n#define FUNCTION_ZIXUANB 0x25\n#define FUNCTION_LUOJIA 0x26\n#define FUNCTION_KUAIHUIB 0x27\n#define FUNCTION_YUYUEA 0x28\n#define FUNCTION_YUYUEB 0x29\n\n#define PROGRAM_ITEM_NUM 6\n#define PROGRAM_ZIXUANA 0x31\n#define PROGRAM_ZIXUANB 0x32\n#define PROGRAM_USER 0x33\n#define PROGRAM_JIAOZHUN 0x34\n#define PROGRAM_PID 0x35\n#define PROGRAM_SYSTEM 0x36\n\n#define PROGRAM_PASSWORD 0x41\n#define SYSTEM_PASSWORD 5200\n\n//����״̬\n#define \tMF_INIT      0\n#define \tMF_WAIT0     1\n#define \tMF_WARMUP1   2\n#define \tMF_HENWEN1   3\n#define \tMF_WARMUP2   4\n#define \tMF_HENWEN2   5\n#define \tMF_WAIT1     6\n#define \tMF_WARMUP3   7\n#define \tMF_RETEST    8\n#define \tMF_WAIT2     9\n#define \tMF_END       10\n\n#define  MF_WARMUP1_WAIT\t11\n#define  MF_HENWEN1_WAIT   12\n\n#define  MF_TEMP_815  815\n#define  MF_TEMP_KEY  810\n#define  MF_TEMP_600  600\n#define  MF_TEMP_500  500\n#define  MF_TEMP_100  100\n\n//���״̬\n#define  KF_INIT      0\n#define  KF_WARMUP1   1\n#define  KF_WARMUP1_WAIT   16\n#define  KF_WAIT0     2\n#define  KF_WAIT1     3\n#define  KF_WAIT2     4\n#define  KF_WAIT3\t    5\n#define  KF_WAIT4\t    6\n#define  KF_WAIT5\t    7\n#define  KF_WAIT6\t    8\n#define  KF_WAIT7\t    9\n#define  KF_WAIT8\t    10\n#define  KF_WAIT9\t    11\n#define  KF_WAIT10\t   12\n#define  KF_HENGWEN1\t 113\n#define  KF_WARMUP2\t  14\n#define  KF_RETEST\t   15\n#define  KF_INIT_WAIT  16\n#define  KF_WAIT0_WAIT 17\n\n#define  KF_HUIWEN_WAIT1 40\n#define  KF_HUIWEN_WAIT2 41\n#define  KF_HUIWEN_WAIT3 42\n\n#define  KF_WARMUP1_WAIT   16\n#define  KF_HENGWEN1_WAIT1 17\n#define  KF_HENGWEN1_WAIT  18\n\n#define  KF_WARMUP1_WAIT1 19\n#define  KF_WARMUP1_WAIT2 20\n#define  KF_REPET_WAIT\t\t21\n\n#define KUAIHUI_805   805\n#define KF_TEMP_850   850\n#define KF_TEMP_KEY   845\n#define KF_TEMP_815   815\n\n#define KUAIHUI_815 815\n\n//�ӷ�״̬\n#define  HF_INIT      0\n#define  HF_WARMUP1   1\n#define  HF_WAIT0     2\n#define  HF_WAIT1     3\n#define  HF_HUIWEN1   4\n#define  HF_HENGWEN2\t\t5\n#define  HF_WAIT2\t\t\t\t\t6\n#define  HF_WAIT3\t\t\t\t\t7\n#define  HF_FAILED\t\t\t\t8\n#define  HF_END\t\t\t\t\t\t\t9\n\n#define\t HF_WARMUP1_WAIT_BACK 19\n#define  HF_WARMUP1_WAIT 10\n#define  HF_HUIWEN1_WAIT 11\n#define  HF_HUIWEN2_WAIT 16\n#define  HF_HUIWEN3_WAIT 17\n#define  HF_HUIWEN4_WAIT 18\n\n#define  HF_WAIT_HUIWEN1 12\n#define  HF_WAIT_HUIWEN2 13\n#define  HF_WAIT_HUIWEN3 14\n#define  HF_WAIT_HUIWEN4 15\n\n#define  HF_TEMP_889\t\t889\n#define  HF_TEMP_895\t 895\n#define  HF_TEMP_900\t\t900\n#define  HF_TEMP_911\t\t911\n#define  HF_TEMP_915\t\t915\n#define  HF_TEMP_920\t\t920\n#define  HF_TEMP_KEY  915\n\n#define SET_TEMP_KEY 1000\n\n//��ѡ״̬\n#define ZX_INIT 0\n#define ZX_WARMUP 1\n#define ZX_HENGWEN 2\n#define ZX_FINISH 3\n#define ZX_WARMUP1 4\n#define ZX_WARMDOWN 5\n#define ZX_WARMDOWN1 6\n\n//У׼״̬\n#define JZ_INIT 0\n#define JZ_WARMUP 1\n#define JZ_HENGWEN 2\n#define JZ_FINISH 3\n\n//�޼�״̬\n#define\tLJ_INIT\t\t      0\n#define\tLJ_WARMUP1_WAIT\t  1\n#define\tLJ_WAIT0\t\t  2\n#define\tLJ_HUIWEN1_WAIT\t  3\n#define\tLJ_WAIT3\t\t  4\n#define\tLJ_END\t\t\t  5\n#define LJ_HUIWEN_WAIT\t  6\n\n#define\tLUOJIA_850 850\n\n//��ѡ����״̬\n#define ZX_SET_SELECT\t 0\n#define ZX_SET_ENT       1\n#define ZX_SET_SAVE\t     2\n#define ZX_SET_ENT_TEST1 3\n#define ZX_SET_ENT_TEST2 4\n#define ZX_SET_ENT_TEST3 5\n#define ZX_SET_WAIT\t\t\t 6\n#define ZX_SET_END\t\t\t 7\n\n//¯��λ��\n#define posNone     0\n#define posAllOpen  1\n#define posMenFeng  2\n#define posHalfOpen 3\n#define posAllClose 4\n\n//��������\n#define KU40 40\n\n//���尴��ֵ\n//�Զ�����¯\n//#define KEY_VALUE_CHANGE 0x07\n//#define KEY_VALUE_ESC 0x06\n//#define KEY_VALUE_UP 0x05\n//#define KEY_VALUE_DOWN 0x04\n//#define KEY_VALUE_LEFT 0x03\n//#define KEY_VALUE_RIGHT 0x02\n//#define KEY_VALUE_SELCTE 0x01`\n//#define KEY_VALUE_ENT 0x00\n\n//������\n/*#define KEY_VALUE_ESC 0x05\n#define KEY_VALUE_RIGHT 0x03\n#define KEY_VALUE_DOWN 0x01\n#define KEY_VALUE_UP 0x02\n#define KEY_VALUE_LEFT 0x04\n#define KEY_VALUE_ENT 0x00*/\n\n\n//2000/D�����\n\n#define KEY_VALUE_JINCHENG \t0x06\n#define KEY_VALUE_ESC \t\t\t0x05\n#define KEY_VALUE_UP \t\t\t\t0x03\n#define KEY_VALUE_DOWN \t\t\t0x00\n#define KEY_VALUE_LEFT \t\t\t0x02\n#define KEY_VALUE_RIGHT \t\t0x07\n#define KEY_VALUE_ENT \t\t\t0x04\n\n\n#define KEY_VALUE_NONE 0xff\n\n//M24C64��ַ����\n#define M24C64_ADDR_WR 0xA0   //1010 A2 A1 A0 R/W \n#define M24C64_ADDR_RD 0xA1\n\n//////////////////////////////////////\n#define KEY_INPUT_MAX_NUM 16\n\n#define KEY_BEEP_NUM 10\n\n#define AD_CHANNAL_NUM_MAX 2\t\t\t\t\t\t\t\t\t//ADͨ����\n#define AD_DATA_NUM_MAX 8\t\t\t\t\t\t\t\t\t\t\t\t//ADÿͨ�����ݸ���/2\n\n#define TEMP_MAX\t1370\n#define TEMP_MIN\t0\n\n#define PWM_COUNT_REF 200           //200*5=1��\n\n#define MOTOR_COUNT_REF 1000         //1000*5=5��\n\n#define FLAG_VALID 0x01\n#define FLAG_INVALID 0x00\n\n//PCF8563��ַ����\n#define PCF8563_ADDR_WR 0xa2   //1010 001 R/W\n#define PCF8563_ADDR_RD 0xa3   //1010 001 R/W\n\n//�������ݿ��ַ\n#define ZIXUAN_PARA_A_BASE 0\n#define ZIXUAN_PARA_B_BASE 2\n#define JIAOZHUN_PARA_BASE 4\n#define PID_PARA_BASE      6\n#define SYSTEM_PARA_BASE   8\n#define USER_PARA_BASE     10\n\n#define ADC_CALC_BASE      12\n#define HFDownTemp_BASE \t 13\n#define YUYUE_PARA_BASE    14\n\n#define POWER_VOL_MAX_BASE    32\n#define POWER_VOL_MIN_BASE    33\n#define POWER_CUR_MAX_BASE    34\n#define POWER_CUR_MIN_BASE    35\n\n#define MENU_SELECT_VALUE_ADD       512\n\n#define TEMP_TABLE_BASE \t 50\n\n#define DATA_SET_FLAG 0x55\n\n//�¶�ϵ��У׼ʱ��\n#define JIAOZHUN_TIME_DEFINE 300\n\n//�̵������źŶ���\n#define MOTER_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_14);GPIO_ResetBits(GPIOB, GPIO_Pin_15)     // PB8 ---- RELAY1 PB9 ---- RELAY2\n\n#define MOTER_CCW  GPIO_SetBits(GPIOB, GPIO_Pin_14)\n#define MOTER_CW   GPIO_SetBits(GPIOB, GPIO_Pin_15)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//���ŷ���\n\n//#define DOOR_POST_OPEN()\t(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9))\t\t\t\t\t\t//PA15 ---- ����\n//#define DOOR_POST_HALF()\t(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10))\t\t\t\t\t \t//PC10 ---- �뿪\n//#define DOOR_POST_GAP()\t  (GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_13))\t\t\t\t\t     \t//PC10 ---- �ŷ�\n//#define DOOR_POST_CLOSE()\t(!GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_13))\t\t\t\t\t    //PC12 ---- ����   //20130709���ſ����޸���\n\n//IO���ã�����궨��\n#define LED1_OFF\t  GPIO_ResetBits(GPIOB, GPIO_Pin_12)\n#define LED1_ON\t  \tGPIO_SetBits(GPIOB, GPIO_Pin_12)\n\n#define LED2_OFF\t  GPIO_ResetBits(GPIOC, GPIO_Pin_15)\n#define LED2_ON\t  \tGPIO_SetBits(GPIOC, GPIO_Pin_15)\n\n#define BEEP_OFF  \tGPIO_ResetBits(GPIOC, GPIO_Pin_7)         // BEEP ---- PC7\n#define BEEP_ON   \tGPIO_SetBits(GPIOC, GPIO_Pin_7)\n\n#define PWM1_OFF  \tGPIO_ResetBits(GPIOC, GPIO_Pin_2)         // PWM ---- PC2\n#define PWM1_ON   \tGPIO_SetBits(GPIOC, GPIO_Pin_2)\n\n//���䳣�ռ̵���\n//#define RELAY_ON  \tGPIO_ResetBits(GPIOC, GPIO_Pin_5)         // RELAY ---- PC5\n//#define RELAY_OFF   \tGPIO_SetBits(GPIOC, GPIO_Pin_5)\n\n//Ӳ���ⲿΪ�����ͼ̵��� DYM20250605\n#define RELAY_OFF  \tGPIO_ResetBits(GPIOC, GPIO_Pin_5)         // RELAY ---- PC5\n#define RELAY_ON   \tGPIO_SetBits(GPIOC, GPIO_Pin_5)\n\n#define IIC1_SCL_L\t\tGPIO_ResetBits(GPIOB, GPIO_Pin_8)\n#define IIC1_SCL_H\t\tGPIO_SetBits(GPIOB, GPIO_Pin_8)\n\n#define IIC1_SDA_L\t\tGPIO_ResetBits(GPIOB, GPIO_Pin_9)\n#define IIC1_SDA_H\t\tGPIO_SetBits(GPIOB, GPIO_Pin_9)\n\n#define AD_CS_L \t\t\tGPIO_ResetBits(GPIOA, GPIO_Pin_4)         \t\t\t// AD_CS ---- PA4\n#define AD_CS_H \t\t\tGPIO_SetBits(GPIOA, GPIO_Pin_4)\n\n#define ADC1220_OFF  \tGPIO_ResetBits(GPIOA, GPIO_Pin_3)         // ADS1220_EN ---- PA3\n#define ADC1220_ON   \tGPIO_SetBits(GPIOA, GPIO_Pin_3)\n\n#define RFIO_1_L\t  \tGPIO_ResetBits(GPIOB, GPIO_Pin_5)\n#define RFIO_1_H\t  \tGPIO_SetBits(GPIOB, GPIO_Pin_5)\n\n#define RFIO_2_L\t  \tGPIO_ResetBits(GPIOB, GPIO_Pin_4)\n#define RFIO_2_H\t  \tGPIO_SetBits(GPIOB, GPIO_Pin_4)\n\n//IO���ã�����궨��\n#define KEY0_STATUS()\t(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11))\n#define KEY1_STATUS()\t(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12))\n#define KEY2_STATUS()\t(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15))\n#define KEY3_STATUS()\t(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10))\n#define KEY4_STATUS()\t(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11))\n#define KEY5_STATUS()\t(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12))\n#define KEY6_STATUS()\t(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2))\n#define KEY7_STATUS()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3))\n\n\n#define MODE0_STATUS()\t(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13))\n#define MODE1_STATUS()\t(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14))\n\n#define POST1_STATUS()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0))\n#define POST2_STATUS()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1))\n#define POST3_STATUS()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2))\n\n#define INPUT1_STATUS()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0))\n#define INPUT2_STATUS()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1))\n#define INPUT3_STATUS()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2))\n\n#define TC_FLAG_STATUS()\t(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2))\n\n#define IIC1_SDA_READ()\t\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9))\n#define BT_STATUS_READ()\t(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5))\n\n#define GET_ADC_BUSY()\t(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4))\t  \t\t//AD-DRDY -- PC4\n\n\n//����ģ��\ntypedef struct\n{\n    uint16_t USART_WordLength;\n    uint16_t USART_StopBits;\n    uint16_t USART_Parity;\n    uint16_t USART_Mode;\n    uint16_t USART_HardwareFlowControl;\n} Wireless_Config_TypeDef;\n\n////////////////////////////////////////////////////////////////////\n#define TEMP_DIS_NUM_REF 4\n\n#define TEMP_AD_DATA_TEMP_NUM_MASK    20\t\t\t //AD����ֵ��������С\n#define TEMP_BACK_UP_VALUE            8      //�����¶��ж����䣬0.8��\n#define TEMP_BACK_DOWN_VALUE          2      //�½��¶��ж����䣬0.2��\n#define TEMP_BACK_VALUE               5      //��ȷ�¶��ж���4��5��\n//��¯����\ntypedef struct\n{\n    volatile u16 RUN_SPEED;             //0-5����5�����ڣ�5��ռ�ձ�\n    volatile u16 RUN_SPEED_NUM;         //���ʱ���źż�����\n    volatile u16 RUN_TIME_OVER;\t        //������Ƴ�ʱ������\n    volatile u8 POST_SET;               //Ԥ��λ��\n    volatile u8 POST_STATUS;            //��ǰλ�ã�0λ�ã�1,2����λ��3�ŷ�λ��4һ��λ��\n\n    volatile u8 POST_CLOSE;\n    volatile u8 POST_GAP;\n    volatile u8 POST_HALF;\n    volatile u8 POST_OPEN;\n\n    volatile u8 POST_CLOSE_BACK[2];\n    volatile u8 POST_GAP_BACK[2];\n    volatile u8 POST_HALF_BACK[2];\n    volatile u8 POST_OPEN_BACK[2];\n\n    volatile u16 YUYUE_TEMP_SET;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//�����¶�ֵ\n    volatile u16 YUYUE_TIME_SET;\n    volatile u16 YUYUE_TIME_DIS;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//��ʾ�¶�ֵ\n\n    volatile u16 TEMP_DIRECTION;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//�¶ȼ��Ƚ���ָʾ\n    volatile u16 TEMP_DIS_MH;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//��ʾ�¶�ֵ\n    volatile u16 TEMP_DIS;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//��ʾ�¶�ֵ\n    volatile u16 TEMP_DIS_START;\n    volatile u16 TEMP_DIS_END;\n    volatile u16 TEMP_DIS_DATA[4];\t\t\t\t\t\t//��ʾ�¶Ȼ�����\n    volatile u32 TEMP_AD_DATA;\t\t\t\t\t\t\t   //AD����ֵ\n    \n    volatile u16 TEMP_VALUE;\t\t\t\t\t\t\t\t\t\t\t\t//˲ʱ�¶�ֵ\n    volatile u16 TEMP_VALUE_ORIGINAL;\t\t\t//˲ʱ�¶�ԭʼֵ\n    volatile u16 TEMP_VALUE_HIGH;\t\t\t\t\t\t\t//˲ʱ�¶�ֵ,0.1��C�ֱ���\n    volatile u16 TEMP_VALUE_HIGH_DATA[4];\t\t\t\t\t\t//˲ʱ�¶Ȼ�������0.1��C�ֱ���\n    volatile u16 TEMP_POWER;            //���ȹ��ʿ���\n    volatile u32 TEMP_MANHUI_INIT;\n    volatile u16 TEMP_VALUE_DISPLAY;\t\t\t\t\t\t\t\t\t\t\t\t//��ʾ�¶�ֵ\n\n    volatile u16 TEMP_VALUE_SET;        //Ŀ���¶�ֵ,0.1��C�ֱ���\n\n    volatile u8 TIME_NUM;\t\t\t\t\t\t\t\t\t\t\t\t\t\t //���źż�����\n    volatile u8 TIME_SEC_FLAG;\t\t\t\t\t\t\t\t\t\t//���źŵ���־\n    volatile u32 TIME;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//������ʱ�䣬��λS\n    volatile u32 TIME_DELAY_NUM;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//������ʱ�䣬��λS\n    volatile u32 TIME_KF_SET;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//����ʱ�䣬��λS\n    volatile u32 TIME_KF_SET_BEEP;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//����ʱ�䣬��λS\n\n    volatile u32 TIME_MF_SET;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//����ʱ�䣬��λS\n    volatile u32 TIME_MF_SET_BEEP;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//����ʱ�䣬��λS\n\n    volatile u8 TIME_DATA_UART_NUM;\n    volatile u8 TIME_DATA_UART_FLAG;\n\n    u16 PID_PARA[10][3];\t\t\t\t\t\t\t\t\t\t//����10��\n\n    u16 EQUIPMENT_PARA[10][3];\t\t\t\t\t\t\t//����10��\n\n    u16 ZIXUAN_A_PARA[10][6];\t\t\t\t\t\t\t//����10�飬�ֱ����¶ȣ�ʱ�䣬���ʣ�������\n\n    u16 ZIXUAN_B_PARA[10][6];\t\t\t\t\t\t\t//����10�飬�ֱ����¶ȣ�ʱ�䣬���ʣ�������\n\n    u8 MASTER_STATUS;\t\t\t\t\t\t\t\t\t\t//��״̬\n    u8 MASTER_STATUS_NEW;\t\t\t\t\t\t//��״̬���±�ʾλ\n    u8 SLAVE_STATUS;\t\t\t\t\t\t\t\t\t\t\t//��״̬\n    u8 SLAVE_STATUS_NEW;\t\t\t\t\t\t\t//��״̬���±�ʾλ\n\n    //u16 PROGRAM_A[10][2];\t\t\t\t  //����10�飬�ֱ��Ǻ����¶ȣ��ͺ���ʱ��\n    //u16 PROGRAM_B[10][2];\n    u32 PROGRAM_TIME_SECOND;   //ʱ����Ϣ����\n    u8 PROGRAM_NUM;\n    u8 PROGRAM_NUM_BACK;\n\n    u8 HF_STATUS_FLAG;\n    u8 HF_STATUS_HUIWEN_VALUE;\n\n    u16 CALIBRATION[15][2];\t\t\t\t  //����15�㣬�ֱ����Բ�����¶ȣ���У׼�¶�\n    u8 CALIBRATION_NUM;\n    u16 CALIBRATION_TEMP[1373];  //У׼����¶�ֵ��ÿ�ȶ�Ӧ\n\n    u8 ERROR;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//�������\n\n    u8 MENU_CHOOSE_VALUE;\t  \t\t //�˵�ѡ������еİ���ֵ\n\n    u8 MENU_SET_STATUS;\t\t\t     //��������ʱ״̬��0��ʾ��Ŀѡ��״̬��1��ʾ������ֵ����״̬\n    u8 MENU_SET_POST_X;\t\t\t     //��������ʱ������ֵƫ����\n    u8 MENU_SET_POST_Y;\t\t\t     //��������ʱ��Ŀƫ����\n\n    u8 MENU_X;\n    u8 MENU_Y;\n\n    u16 MENU_SET_INPUT_DATA[KEY_INPUT_MAX_NUM];\t\t//�������������������\n\n    volatile u8 RELAY_DELAY;\n    volatile u8 RELAY_DELAY_EN;\n\n    volatile u8 MOVE_TIME_NUM;\t\t\t\t\t\t\t\t\t\t\t\t\t\t //���źż�����\n    volatile u8 MOVE_TIME_SEC_FLAG;\t\t\t\t\t\t\t\t\t\t//���źŵ���־\n    volatile u8 MOVE_TIME_OVER_FLAG;\t\t\t\t\t\t\t\t\t//�������ʱ�䵽��־\n    volatile u8 MOVE_TIME_OVER_FLAG_EN;\t\t\t\t\t\t\t\t\t//�������ʱ�䵽��־\n    volatile u16 MOVE_TIME;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//������ʱ�䣬��λS\n    volatile u16 MOVE_TIME_SET;\n\n    u16 USER_DATA[4];\n    u16 MOTER_RUN_NUM;          //���ʱ�����ת����\n    /*\n    u16 MANHUI_MENFENG;\n    u16 KUAIHUI_MENFENG;\n    u16 KUAIHUI_WAIT_TIME1;\n    u16 KUAIHUI_WAIT_TIME2;*/\n\n    u16 SYSTEM_DATA[12];\n\n    /*u16 LENGTH_X;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//¯�峤����Ϣ����λmm\n    u16 LENGTH_Y;\n    u16 LENGTH_Z;\n    u16 LENGTH_L;\n\n    u16 KUAIHUI_TEMP_SET;\t\t\t\t\t\t//��Һ��µ㣬��λ��\n    u16 HUIFA_TEMP_SET;\t\t\t\t\t\t\t\t//�ӷ��ݺ��µ㣬��λ��\n\n    u16 TIME_OPEN_CLOSE;       //���ŵ����ŵ�ʱ�䣬��λS\n\n    u16 MOVE_TIME_1;\n    u16 MOVE_TIME_2;\n    u16 MOVE_TIME_3;\n\n    u16 POST_LENGTH;*/\n\n    //u16 Temp_Test[512];\n\n    u16 Temp_Test_Min;\n    u16 Temp_Test_Time_Start;\n    u16 Temp_Test_Time_End;\n\n    u16 Temp_Para_x1;\n    u16 Temp_Para_y1;\n    u16 Temp_Para_x2;\n    u16 Temp_Para_y2;\n\n    u16 Ad_Data_Temp[2500];\n\n    u32 adc_HeatCur_data;\n    u32 adc_BoardTemp_data;\n    u32 adc_Vref_data;\n    u32 adc_Thermo_data;\n    u32 adc_Compare_data;\n\n    u32 ads1220_ch12_init_data;\n    u32 ads1220_ch23_init_data;\n    u8 board_temp_init_data;\n    u8 ads1220_bipolar_flag;\n\n    u8 temp_bipolar_flag;\n    s32 adc_vol_data;\n    s32 mcu_adc_vol_data;\n    s32 board_vol_data;\n    s32 system_vol_data;\n\n    u8\tmenu_select_post;\n    u16\tFANJIE_DELAY_NUM;\n\n    u32\ttemp_dis_more_flag;\n    u32\tads1220_original_data;\n\n    volatile u16 TEMP_DIS_CALC;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//��ʾ�¶�ֵ\n\n    u16 Heat_work_time[1024];\n    s16 temp_drop_buf[1024];\n    u16 temp_drop_buf_num;\n    u32 temp_drop_run_cycle;\n    u32 temp_drop_new_flag;\n    u32 temp_drop_enable;\n\n    u32 temp_drop_high_temp;\n    u32\ttemp_drop_cont_time;\n    u32 temp_drop_draft_temp;\n\n\n\n    volatile u16 Temp_Table[1373];\n    volatile u32 Redianou_Type;\n\n    volatile u32 Redianou_Check_En_Counter;\n\n    volatile u32 ZIXUAN_DEBUG_TEMP_EN;\n\n} MFL_PARA;\n\n#define RELAY_DELAY_NUM_DEF 40\n#define LENGTH_X MFL_PARA_A.SYSTEM_DATA[0]\t\t\t\t\t\t\t\t\t\t\t//¯�ӳߴ�\n#define LENGTH_Y MFL_PARA_A.SYSTEM_DATA[1]\n#define LENGTH_Z MFL_PARA_A.SYSTEM_DATA[2]\n#define LENGTH_L MFL_PARA_A.SYSTEM_DATA[3]\n#define MANHUI_TEMP_SET  MFL_PARA_A.SYSTEM_DATA[4]\n#define HUIFA_TEMP_SET   MFL_PARA_A.SYSTEM_DATA[5]\n#define TIME_OPEN_CLOSE  MFL_PARA_A.SYSTEM_DATA[6]\t\t  //���ŵ�������ʱ��\n\n#define MOVE_TIME_1 MFL_PARA_A.SYSTEM_DATA[7]\n#define MOVE_TIME_2 MFL_PARA_A.SYSTEM_DATA[8]\n#define MOVE_TIME_3 MFL_PARA_A.SYSTEM_DATA[9]\n#define POST_LENGTH MFL_PARA_A.SYSTEM_DATA[10]\n\n#define TIME_OPEN_GAP  MFL_PARA_A.SYSTEM_DATA[11]\t\t  //���ŵ��ŷ���ʱ��\n\n#define MANHUI_MENFENG     MFL_PARA_A.USER_DATA[0]\n#define KUAIHUI_MENFENG    MFL_PARA_A.USER_DATA[1]\n#define KUAIHUI_WAIT_TIME1 MFL_PARA_A.USER_DATA[2]\n#define KUAIHUI_WAIT_TIME2 MFL_PARA_A.USER_DATA[3]\n#define KUAIHUI_STEP_NUM   9\n\n//500�Ⱥ��µ�������ֱ�����ʼĿ���¶ȣ���ص��¶ȣ����غ��Ŀ���¶�\n/*#define MANHUI_500_CHUWEN  MFL_PARA_A.PID_PARA[4][0]\n#define MANHUI_500_QIKONG  MFL_PARA_A.PID_PARA[4][1]\n#define MANHUI_500_MOWEN   MFL_PARA_A.PID_PARA[4][2]\n\n#define MANHUI_815_CHUWEN  MFL_PARA_A.PID_PARA[5][0]\n#define MANHUI_815_QIKONG  MFL_PARA_A.PID_PARA[5][1]\n#define MANHUI_815_MOWEN   MFL_PARA_A.PID_PARA[5][2]\n\n#define KUAIHUI_850_CHUWEN  MFL_PARA_A.PID_PARA[6][0]\n#define KUAIHUI_850_QIKONG  MFL_PARA_A.PID_PARA[6][1]\n#define KUAIHUI_850_MOWEN   MFL_PARA_A.PID_PARA[6][2]\n\n#define KUAIHUI_815_CHUWEN  MFL_PARA_A.PID_PARA[7][0]\n#define KUAIHUI_815_QIKONG  MFL_PARA_A.PID_PARA[7][1]\n#define KUAIHUI_815_MOWEN   MFL_PARA_A.PID_PARA[7][2]\n\n#define HUIFA_920_CHUWEN  MFL_PARA_A.PID_PARA[8][0]\n#define HUIFA_920_QIKONG  MFL_PARA_A.PID_PARA[8][1]\n#define HUIFA_920_MOWEN   MFL_PARA_A.PID_PARA[8][2]\n\n#define HUIFA_900_CHUWEN  MFL_PARA_A.PID_PARA[9][0]\n#define HUIFA_900_QIKONG  MFL_PARA_A.PID_PARA[9][1]\n#define HUIFA_900_MOWEN   MFL_PARA_A.PID_PARA[9][2]\n\n#define HUIFA_CHAOTIAO_VALUE 5*/\n\n//////////////////////////////////////////////////////////////////////////\n\n#define POWER_VOLTAGE_MAX      \t\tMFL_PARA_A.PID_PARA[0][0]\t\t\t//��ѹ��λV��������ֹͣ��\n#define POWER_CURRENT_MAX      \t\tMFL_PARA_A.PID_PARA[0][1]\t\t\t//������λ0.1A��������ֹͣ\n#define POWER_CURRENT_DELTA      \tMFL_PARA_A.PID_PARA[0][2]\t\t\t//��λ��1��ʾʵʱ��ѹ������ʮλ�͸�λ�ǲ���2/2��xx���������ڴ������ʾ�쳣��ֹͣ\n\n#define HUIFA_TEMP_920  \tMFL_PARA_A.PID_PARA[5][0]\n#define HUIFA_TEMP_918 \t  MFL_PARA_A.PID_PARA[5][1]\n#define HUIFA_TEMP_DROP   MFL_PARA_A.PID_PARA[5][2]\n\n#define HUIFA_TEMP_DROP_ADD 226\n\n#define JDKH_TIME_DELAY  MFL_PARA_A.PID_PARA[2][0]\n#define JDKH_TEMP_STOP   MFL_PARA_A.PID_PARA[2][1]\n#define JDKH_TEMP_ARM    MFL_PARA_A.PID_PARA[2][2]\n\n#define LUOJIA_TIME_DELAY  MFL_PARA_A.PID_PARA[6][0]\n#define LUOJIA_TEMP_STOP   MFL_PARA_A.PID_PARA[6][1]\n#define LUOJIA_TEMP_ARM    MFL_PARA_A.PID_PARA[6][2]\n\n#define HUIFA_TIME_DELAY  \t\t MFL_PARA_A.PID_PARA[7][0]\n#define HUIFA_TEMP_STOP   \t\t MFL_PARA_A.PID_PARA[7][1]\n#define HUIFA_TEMP_ARM    \t\t MFL_PARA_A.PID_PARA[7][2]\n\n#define HUIFA_HUIWEN_PWM1  \t\t\tMFL_PARA_A.PID_PARA[1][0]\t\t//��һ����ʱ������ļ��ȹ��ʣ�0-100\n#define HUIFA_HUIWEN_TEMP_PID \tMFL_PARA_A.PID_PARA[1][1]\t\t//PIDĿ���¶�\n#define HUIFA_HUIWEN_PWM2  \t\t\tMFL_PARA_A.PID_PARA[1][2]\t\t//PIDʹ�õļ��ȹ��ʣ���δʹ��\n\n#define RELAY_DELAY_MAX      \t\tMFL_PARA_A.PID_PARA[9][0]\t\t\t//���ȼ̵�����ʱֵ*5ms\n#define FANJIE_DELAY_MAX      \tMFL_PARA_A.PID_PARA[9][1]\t\t\t//���Ӽ����ʱֵ*1s\n#define FANJIE_VALUE_MAX      \tMFL_PARA_A.PID_PARA[9][2]\t\t\t//�����¶��ж��¶�ֵ\n\n#define KUAIHUI_MOVE_TIME_AVE TIME_OPEN_CLOSE/13\n\n//????\n#define UART_RXD_BUF_SIZE 256\n#define UART_TXD_BUF_SIZE 256\ntypedef struct\n{\n    volatile u8 UART_RXD_NUM_LAST;\n    volatile u8 UART_RXD_NUM_NOW;\n    volatile u8 UART_RXD_FINISH;\n    volatile u8 UART_RXD_EN;\n\n    volatile u16 UART_RXD_BEGIN_POST;\n    volatile u16 UART_RXD_END_POST;\n    volatile u16 UART_RXD_LENTH;\n\n    volatile u16 UART_TXD_SEND_NUM;\n\n    u8 UART_DMA_RXD_BUF[UART_RXD_BUF_SIZE];\n    u8 UART_DMA_RXD_BUF_TEMP[UART_RXD_BUF_SIZE];\n\n    u8 UART_DMA_TXD_BUF[UART_TXD_BUF_SIZE];\n\n    u8 UART_RXD_MODE_FLAG;\n    u8 UART_RXD_MODE_VALUE;\n    u32 UART_RXD_COST_VALUE;\n    u32 UART_RXD_CPUID_VALUE;\n} UART_PARA;\n\n#endif\n",
                "line_count": 684,
                "start_line": 1,
                "end_line": 684
              }
            }
          },
          "params": {
            "path": "main.h"
          }
        },
        {
          "id": "84fc3b71-309c-4ea2-ba87-92dba38d5b60",
          "type": "TEXT",
          "status": "success",
          "content": "让我继续分析项目的核心文件来理解整体架构。我需要查看main.c来了解主要业务逻辑。\n\n",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        },
        {
          "id": "9709d184-2fb9-4d8e-8e08-e631a871c2c8",
          "type": "TOOL_CALL",
          "status": "success",
          "toolName": "read_file",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "workflowStatus": "success",
          "displayParams": {
            "path": "main.c"
          },
          "displayResult": {
            "lineCount": 1000,
            "readFile": {
              "path": "d:\\AUTOMFL\\Yuhong\\MFL_DYM\\src\\main.c",
              "startLine": 1,
              "endLine": 1000
            }
          },
          "workflowSnapshot": {
            "status": "success",
            "result": {
              "name": "read_file",
              "type": "tool_use",
              "params": {
                "path": "main.c"
              },
              "success": true,
              "message": "",
              "code": 0,
              "result": {
                "content": "#include \"STM32Lib\\\\stm32f10x.h\"\n\n#include \"main.h\"\n#include \"hal.h\"\n#include \"lcd_st7920.h\"\n#include \"ADS1220.h\"\n#include \"menu.h\"\n#include \"FUZZY.h\"\n#include <stdio.h>\t//printf ������\n\n#include \"temperature_table.h\"\n\n/////////////////////////////////////////////////////////////////////////\n\nvolatile u8 SECOND_FLAG;             //1S�ļ�ʱ��־λ��0��δ����1���ѵ�\nvolatile u8 SECOND_NUM;              //5ms�ж�200�ε���1��\n\nvolatile u16 BEEP_NUM;               //��������������\nvolatile u16 BEEP_HIGH_TIME;\nvolatile u16 BEEP_CYC_TIME;\nvolatile u16 BEEP_CYC_TIME_NUM;\n\nvolatile u16 RELAY_DELAY_TIMER;\nvolatile u16 RELAY_DELAY_STATUS;\nvolatile u16 RELAY_DELAY_EN;\n\nvolatile u8 KEY_VALUE;               //�����ļ��ֵ��Ϊ0xffʱ��ʾ�޼�����\nvolatile u8 KEY_VALUE_BACK;          //�������ϴμ��ֵ���������бȽϣ���������\nvolatile u8 KEY_VALUE_FLAG;          //�������±�־λ��Ϊ1ʱ�������£�ʵ�ְ����ɿ����ܼ��Ĺ���\nvolatile u8 KEY_MIX_VALUE;\n\nvolatile u32 SYSTEM_TEMP;\t\t\t\t\t\t\t\t\t\t\t\t//�����¶�\n\n//volatile u32 \tTEMP_AD_DATA_TEMP[TEMP_AD_DATA_TEMP_NUM_MASK*2];\t\t//AD����ֵ������\nvolatile u32 \tTEMP_AD_DATA_TEMP[20];\t\t//AD����ֵ������\nvolatile u8 \tAD_READ_NUM;\nvolatile u32 \tADC_DATA_VALUE_REL;\nvolatile u8 \tADC_DATA_VALUE_REL_FLAG;\nvolatile u32 \tADC_CALC_VALUE_DEF;\n\nu8 MAIN_STATUS;\nu8 MAIN_STATUS_BACK;\nu8 STATUS_NEW_FLAG;\n\nu8 BTCOM_STATUS;\n\nu8 MENU_CHOOSE_VALUE;\t  \t\t //�˵�ѡ������еİ���ֵ\n\nu8 MENU_SET_STATUS;\t\t\t     //��������ʱ״̬��0��ʾ��Ŀѡ��״̬��1��ʾ������ֵ����״̬\nu8 MENU_SET_POST_X;\t\t\t     //��������ʱ������ֵƫ����\nu8 MENU_SET_POST_Y;\t\t\t     //��������ʱ��Ŀƫ����\n\nu8 MENU_X, MENU_X1, MENU_X2, MENU_X3;\nu8 MENU_Y;\n\nu16 BOARD_TEMP_PARA;\n\nu8 test_second_flag;\nu32 test_data;\n\nMFL_PARA MFL_PARA_A;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//��¯��������\nAI_CONTROL Ai_CTRL;\n//MFL_UART MFL_UART_1;\nUART_PARA Uart3_Debug;\nUART_PARA Uart1_BTcom;\n\nu8 RDO_FANJIE_FLAG;\nu8 RDO_OPEN_FLAG;\n\n////////////////////////////////////////////////////////////////////////////////////////////////\n//�룬�֣�ʱ���죬���ڣ��£���\nu8 MENU_TIME_DATA[7];\nu8 MENU_TIME_DATA_SET[10];\nu8 MENU_TIME_DATA_DIS[12];\nconst u8 MENU_TIME_DATA_DIS_POST[12] = {0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16};\nconst u8 MENU_TIME_DATA_SET_POST[7] = {0, 1, 3, 4, 8, 9, 10};\n\n//�˵�1������ʾλ��\nconst u8 MENU_DIS_BLACK_FUN[FUNCTION_ITEM_NUM * 3] = {1, 0, 6, 2, 0, 6, 3, 0, 6, 1, 4, 7, 2, 4, 7, 3, 4, 6, 1, 8, 7, 2, 8, 8};\n\n//�˵�2������ʾλ��\nconst u8 MENU_DIS_BLACK_PRO[PROGRAM_ITEM_NUM * 3] = {1, 0, 7, 2, 0, 7, 3, 0, 10, 1, 6, 10, 2, 6, 10, 3, 6, 10};\n\n//Ĭ����ѡ�¶�����\n//�¶ȣ�ʱ�䣬�ٶȣ���ǰ������(���).�ٶ�Ĭ��Ϊ0,��������,��ôȫ�ټ���\nconst u16 MFL_ZIXUAN_PROGRAM_INIT_DATA[] =\n{\n    100, 30, 0, 5,\n    250, 30, 0, 5,\n    0, 30, 0, 5,\n    0, 30, 0, 5,\n    0, 30, 0, 5,\n    0, 30, 0, 5,\n    0, 30, 0, 5,\n    0, 30, 0, 5,\n    0, 30, 0, 5,\n    0, 30, 0, 5,\n};\n\n//Ĭ��У׼�¶�����\nconst u16 MFL_CALIBRATION_INIT_DATA[] =\n{\n    100, 100,\n    200, 200,\n    300, 300,\n    400, 400,\n    480, 480,\n    520, 520,\n    600, 600,\n    700, 700,\n    800, 800,\n    840, 840,\n    860, 860,\n    880, 880,\n    910, 910,\n    930, 930,\n    950, 950,\n};\n\n//Ĭ��PID����Kp=15,Ki=10,Kd=15 (ע��Kiʹ��ʱӦȡ����)\nconst u16 MFL_PID_INIT_DATA[] =\n{\n    //260,250,130,\t\t//01���ܼ�� HQ230126\n    240, 240, 100,\t\t//01���ܼ�� DYM 230129\n    100, 895, 15,\t \t//02���ʻӻ� DYM20220217, ��֮ǰΪ����15,10,15\n    20, 780, 781,\t \t//03������� DYM20200424  //20,750,780,\n    60, 810, 200,\t\t//04\n    40, 835, 200,\t\t//05\n    920, 910, 918,\t//06\n    30, 835, 842,\t\t//07�޼ӻ���\n    10, 860, 880,\t\t//08\n    40, 800, 40,\n    482, 50, 100,\n};  //10��ż����·���䣬�Լ�����\n//(1) ��1��482����·���䣺4��ʾС��400�ȵ�ʱ��һֱ�������(��Ϊ400���¶���һֱ��������;8��?9����������С��Z�Ⱦͱ���;2��ʾZΪ2��\n//(2) ��2��3��������ⷴ�ӣ���2��������30��100�ȣ���5���Ϳ�ʼ������100�Ⱦͱ���\n//Ĭ��system����\t\t//HQ20231230\nconst u16 MFL_EQUIPMENT_INIT_DATA[] =\n{\n    40, 10,  0,\t\t//˿�˵�λ�г̣�Ĭ��40mm�������ٶ�/100r/s��Ĭ��0.1r/S��ʵ��˿�����г̣��Զ�����õ�\n    300, 300,  5,\t\t//�ӷ������ٶ�/100r/s���ӷ������ٶ�/100r/s����λ����ֵ��λmm\n    200, 250, 15,\t\t//���ҿ����ٶ�/100r/s�����ҹ��ŵ��ŷ�ֵ�ٶ�/100r/s���ŷ�ֵ15mm���ŷ����������ٶȹ̶�0.1r/s��\n    200, 120, 15,\t\t//��ҿ����ٶ�/100r/s����ҹ��ŵ��ŷ�ֵ��ʱ��(��λ������100��)���ŷ�ֵ15mm���ŷ����������ٶȹ̶�0.1r/s��\n    200, 120, 15,\t\t//���ٿ�ҿ����ٶ�/100r/s����ҹ��ŵ��ŷ�ֵ��ʱ��(��λ������100��)���ŷ�ֵ15mm���ŷ����������ٶȹ̶�0.1r/s��\n    0, 0, 0,\n    0, 0, 0,\n    0, 0, 0,\n    0, 0, 0,\n    0, 0, 0,\n};\n\n//Ĭ��system�����Ƿ�ָ���ʼֵ��1��ʾ�ɻָ���0��ʾ���ɻָ�\nconst u16 MFL_EQUIPMENT_INIT_DATA_ENABLE[] =\n{\n    0, 0, 0,\n    1, 1, 1,\n    1, 1, 1,\n    1, 1, 1,\n    1, 1, 1,\n    1, 1, 1,\n    1, 1, 1,\n    1, 1, 1,\n    1, 1, 1,\n    0, 0, 0\n};\n\n//Ĭ��ϵͳ����\nconst u16 MFL_SYSTEM_INIT_DATA[] = {305, 185, 60, 255, 850, 920, 85, 55, 104, 152, 120, 83};\n\n//Ĭ��ϵͳ����\nconst u16 MFL_USER_INIT_DATA[] = {1, 1, 30, 30};\n\n//�˵���ʾ\nu8 menu_temp_para_string_init_data[][11] =\n{\n    \"01�������\",\n    \"02���ʻӻ�\",\n    \"03�������\",\n    \"04��������\",\n    \"05�������\",\n    \"06�ӷ�����\",\n    \"07�޼ӻ���\",\n    \"08�ӷ�����\",\n    \"09���ٻ���\",\n    \"10��ż���\",\n};\n\n//�˵���ʾ\nu8 menu_program_para_string_init_data[][11] =\n{\n    \"01��������\",\n    \"02��������\",\n    \"03��������\",\n    \"04��������\",\n    \"05��������\",\n    \"06��������\",\n    \"07��������\",\n    \"08��������\",\n    \"09��������\",\n    \"10��ż����\",\n};\n\n//�˵���ʾ\nu8 menu_zixuan_para_string_init_data[][7] =\n{\n    \"��01��\",\n    \"��02��\",\n    \"��03��\",\n    \"��04��\",\n    \"��05��\",\n    \"��06��\",\n    \"��07��\",\n    \"��08��\",\n    \"��09��\",\n    \"��10��\",\n};\n\n//����ģ�����\nu8 BTCOM_STATUS;\nu8 BTCOM_STATUS_NEW_FLAG;\nu32 BTCOM_TIMER;\nu16 BTCOM_NUM;\nu16 BTCOM_MASTER_ADDRESS;\nu16 BTCOM_CONFIG_ADDRESS;\nu8 BTCOM_CONFIG_SPEED;\nu8 BTCOM_CONFIG_POWER;\nu8 BTCOM_CONFIG_CHANNEL;\nu8 BTCOM_CONFIG_MODE;\nu16 BTCOM_CONFIG_PASSWORD;\n\n//���ܲɼ�ģ�����\nu8 DEBUG_STATUS;\nu8 DEBUG_STATUS_NEW_FLAG;\nu32 DEBUG_TIMER;\nu16 DEBUG_NUM;\nu16 DEBUG_MASTER_ADDRESS;\nu16 DEBUG_CONFIG_ADDRESS;\nu8 DEBUG_CONFIG_SPEED;\nu8 DEBUG_CONFIG_POWER;\nu8 DEBUG_CONFIG_CHANNEL;\nu8 DEBUG_CONFIG_MODE;\nu16 DEBUG_CONFIG_PASSWORD;\nu16 DEBUG_CURRENT_MIN;\nu16 DEBUG_CURRENT_MAX;\n\nu16 TEST_CURRENT_MIN;\nu16 TEST_CURRENT_MAX;\nu16 TEST_VOLTAGE_MIN;\nu16 TEST_VOLTAGE_MAX;\n\nconst u8 RS485_READ_COMMAND_STRING[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x03, 0x05, 0xCB};\nvolatile u16 RS485_READ_VOLTAGE_VALUE;\nvolatile u16 RS485_READ_CURRENT_VALUE;\nvolatile u16 RS485_READ_UPDATA_FLAG;\n\n///////////////////////////////////////////////////////////////////////\n\nvoid system_init (void);\n//������ʼ��\nvoid data_base_init (void);\n//�¶���ʾ����\nvoid temp_dis_lcd (u8 x, u8 y, u32 temp);\n//ʱ����ʾ����\nvoid time_dis_lcd (u8 x, u8 y, u32 temp);\n//¯�ſ��ƺ�����postĿ��λ��\nvoid MoveStove (u8 post);\n//¯�ſ��ƺ�������ʱ�����\nvoid MoveStove_Time (u16 time);\n\n//������Ʋ���\nvoid test_moter (void);\n//��λ����\nvoid test_post (void);\n//�¶Ȳ���\nvoid test_power (void);\n\n//����DMA����\nvoid test_uart (void);\n//���������ƣ���x*0.1�룬Ϩy*0.1�룬�ܹ���num��\nvoid Beep_Set (u16 x, u16 y, u16 num);\n//Bresenham's integer line �¶�У׼\nvoid Bresenham_Temp_Calibrate (void);\n//�ָ��������ò���\nvoid system_para_data_reset (void);\n//��ʾDEBUGģʽ�µĲɼ�ֵ\nvoid debug_com_data_display (u32 board_temp, u32 adc_data, u32 com_vol_data);\n//��ʾDEBUGģʽ�µĹ̶�ֵ\nvoid debug_fix_data_display (u8 board_temp_init, u32 adc_data_init, u32 com_vol_init);\n//����ģʽ�������\nvoid debug_data_save (u8 board_temp_init, u32 adc_data_init);\n//�¶���ʾ����\nvoid temp_dis_lcd_3 (u8 x, u8 y, u32 temp);\n//�¶���ʾ����\nvoid temp_dis_lcd_4 (u8 x, u8 y, u32 temp);\n//�¶�����������ʾ���¶�ֵ��Ŀ���¶�ֵ�������̶�\nu32 temp_calc_value_MH (u32 temp, u32 target_temp, u32 meihua_range);\n//�¶�ƽ��������ʵ�ʵ��¶�ֵ����ǰ��������¶�ֵ\nu32 temp_value_filter_MH (void);\n\n//ʱ���¶���ʾ����\nvoid time_temp_dis_lcd (u8 x, u8 y, u8 *p, u16 temp);\n//ʱ��������ʾ���������ʱ��������\nvoid time_set_dis_lcd (u8 x, u8 y, u8 *p);\n//ʱ���¶�������ʾ����\nvoid time_temp_set_lcd (u8 x, u8 y, u8 *p);\n\nvoid Uart3_Debug_Send (u8 send_data_lenth);\nvoid Uart3_Debug_Recevie_Init (void);\n\n//UART1_SEND\nvoid Uart1_BTcom_Send (u8 send_data_lenth);\nvoid Uart1_BTcom_Recevie_Init (void);\n\n//�����ѹ��ֵ\nvoid power_detect_data_save (u16 address, u16 voltage, u16 current, u8 *date_temp);\n//������ܲ���\nvoid power_detect_data_reset (u16 address);\n//��ʾ��ѹ������ֵ\nvoid power_detect_data_display (u8 x, u8 y, u16 address);\n\n//////////////////////////////////////////////////////////////////////\n\nint main(void)\n{\n    u16 temp, n, rdo_protect_voltage;\n    signed long  x1 = 0;\n    char y1 = 0;\n    u16 time_back;\n    u16 HF_TEMP;\n    u8 LJ_HUIWEN_STEP, crc_num;\n    u32 sum;\n    u32 adc_data_temp[4];\n    u32 temp_sum, time_sum, cur_sum, adc_data, com_data;\n\n    u32 temp_drop_sum, time_drop_sum;\n    u16 cycle_drop_start, cycle_drop_end;\n    s16 temp_drop_min, temp_drop_max;\n\n    u16 x;\n    u8 eeprom_data_temp[32];    //M24C64Ϊ32���ֽ�һ��page\n    u8 para_data_temp[64];\n\n    u16 temp_n, temp_a, temp_b, temp_c, temp_d;\n\n    u32 crc_value, x_crc, y_crc;\n\n    //////////////////////////////////////////////////////////////////////////\n    system_init ();\n\n    MFL_PARA_A.FANJIE_DELAY_NUM = FANJIE_DELAY_MAX;\n    MFL_PARA_A.FANJIE_DELAY_NUM *= 20;\n    for (temp = 0; temp < 20; temp++)\n        TEMP_AD_DATA_TEMP[temp] = 0;\n\n    //��ʼ����������\n    MFL_PARA_A.temp_drop_buf_num = 0;\n    MFL_PARA_A.temp_drop_enable = 0;\n\n    //��ʼ����ѡ�¶ȵ��Թ���\n    if (MFL_PARA_A.EQUIPMENT_PARA[9][2] == 999)\n        MFL_PARA_A.ZIXUAN_DEBUG_TEMP_EN = 1;\n    else\n        MFL_PARA_A.ZIXUAN_DEBUG_TEMP_EN = 0;\n\n    //��ʼ�������¶ȱ�\n    MFL_PARA_A.Redianou_Type = MFL_PARA_A.EQUIPMENT_PARA[9][0];\n    for (temp = 0; temp < 1373; temp++)\n    {\n        if (MFL_PARA_A.Redianou_Type == 1)\n            MFL_PARA_A.Temp_Table[temp] = s_table[temp];\n        else\n            MFL_PARA_A.Temp_Table[temp] = k_table[temp];\n    }\n\n    RELAY_ON;\n\n    MFL_PARA_A.Redianou_Check_En_Counter = 200 * 5; //5���ʼ�ж��ȵ�ż״̬\n\n    //�¶ȱ�����\n    for (temp = 0; temp < 1024; temp++)\n    {\n        MFL_PARA_A.Heat_work_time[temp] = 0;\n        MFL_PARA_A.temp_drop_buf[temp] = 0;\n    }\n\n\n    MFL_PARA_A.temp_drop_high_temp = MFL_PARA_A.PID_PARA[9][0] / 100;\n    MFL_PARA_A.temp_drop_cont_time = (MFL_PARA_A.PID_PARA[9][0] - MFL_PARA_A.temp_drop_high_temp * 100) / 10;\n    MFL_PARA_A.temp_drop_draft_temp = MFL_PARA_A.PID_PARA[9][0] - MFL_PARA_A.temp_drop_high_temp * 100 - MFL_PARA_A.temp_drop_cont_time * 10;\n\n    MFL_PARA_A.temp_drop_high_temp *= 100;\n    MFL_PARA_A.temp_drop_cont_time *= 60;\n    MFL_PARA_A.temp_drop_new_flag = 0;\n\n    MFL_PARA_A.temp_drop_enable = 0;\n    MFL_PARA_A.temp_drop_run_cycle = 0;\n\n    //pcf8563_write_time(2,7,MENU_TIME_DATA);\n\n    /*\tDYM 20240203 ֱ�����ص�����ѹ��ʾ\n    \t\tif (POWER_CURRENT_DELTA>99)\t\t//��ʾʵʱ��ѹ����\n    \t\t\tMFL_PARA_A.temp_dis_more_flag=1;\n    \t\telse\n    */\n    MFL_PARA_A.temp_dis_more_flag = 0;\n\n    //�Ҽ�=7f ���=fb �ϼ�=f7 �¼�=fe\n    if (KEY_MIX_VALUE == 0xf6)  //�ϼ�+�¼�  //�ָ�����ֵ\n    {\n        Beep_Set (10, 10, 1);\n        MAIN_STATUS = MAIN_STATUS_INITRESET;\n        STATUS_NEW_FLAG = 1;\n    }\n    else if (KEY_MIX_VALUE == 0x7b)  //���+�Ҽ�  ������ģʽ\n    {\n        Beep_Set (10, 10, 1);\n        MAIN_STATUS = MAIN_STATUS_DEBUG;\n        STATUS_NEW_FLAG = 1;\n    }\n    else if (KEY_MIX_VALUE == 0xF3)  //�ϼ�+��� ��������ֻ����\n    {\n        Beep_Set (3, 2, 2);\n\n        MFL_PARA_A.temp_dis_more_flag = 2;\n    }\n    else if (KEY_MIX_VALUE == 0x7E)  //�¼�+�Ҽ�����ʾ������������(������ѹ���Сֵ��\n    {\n        Beep_Set (3, 2, 3);\n        MAIN_STATUS = MAIN_STATUS_DIS_POWER;\n        STATUS_NEW_FLAG = 1;\n    }\n\n    //initial wireless module\n    BTCOM_STATUS = BT_STATUS_INITIAL;\n    BTCOM_STATUS_NEW_FLAG = 1;\n    BTCOM_TIMER = 0;\n    BTCOM_NUM = 0;\n    BTCOM_MASTER_ADDRESS = 0xFFFE;\n    BTCOM_CONFIG_ADDRESS = 0;\n    BTCOM_CONFIG_SPEED = 0x04;\n    BTCOM_CONFIG_POWER = 0x00;\n    BTCOM_CONFIG_CHANNEL = 0x19;\n    BTCOM_CONFIG_MODE = 0x40;\n    BTCOM_CONFIG_PASSWORD = 5200;\n\n    //initial wireless module\n    DEBUG_STATUS = DEBUG_STATUS_INITIAL;\n    DEBUG_STATUS_NEW_FLAG = 1;\n    DEBUG_TIMER = 0;\n    DEBUG_NUM = 0;\n    DEBUG_MASTER_ADDRESS = 0xFFFE;\n    DEBUG_CONFIG_ADDRESS = 0;\n    DEBUG_CONFIG_SPEED = 0x04;\n    DEBUG_CONFIG_POWER = 0x00;\n    DEBUG_CONFIG_CHANNEL = 0x19;\n    DEBUG_CONFIG_MODE = 0x40;\n    DEBUG_CONFIG_PASSWORD = 5200;\n\n    DEBUG_CURRENT_MIN = POWER_CURRENT_MAX / 2 - (POWER_CURRENT_DELTA % 100);\n    DEBUG_CURRENT_MAX = POWER_CURRENT_MAX / 2 + (POWER_CURRENT_DELTA % 100);\n\n    while (1)\n    {\n\n        ///////////////////////////////////���ܲɼ�ģ������+ͨ��///////////////////////////////////////////\n        if (DEBUG_STATUS == DEBUG_STATUS_INITIAL)\n        {\n            if (DEBUG_STATUS_NEW_FLAG)\n            {\n                DEBUG_STATUS_NEW_FLAG = 0;\n                Uart3_Debug_Recevie_Init();\n                RS485_READ_UPDATA_FLAG = 0;\n                DEBUG_TIMER = 400;\n            }\n\n            if (DEBUG_TIMER == 0)\n            {\n                DEBUG_STATUS = DEBUG_STATUS_CONFIG;\n                DEBUG_STATUS_NEW_FLAG = 1;\n                DEBUG_TIMER = 100;\n            }\n            else if ((Uart3_Debug.UART_RXD_FINISH == 1))\n            {\n                Uart3_Debug_Recevie_Init();\n\n                DEBUG_STATUS = DEBUG_STATUS_CONFIG;\n                DEBUG_STATUS_NEW_FLAG = 1;\n                DEBUG_TIMER = 100;\n            }\n        }\n        else if (DEBUG_STATUS == DEBUG_STATUS_CONFIG)\n        {\n            if (DEBUG_TIMER == 0)\n            {\n                //01 03 00 00 00 03 05 CB\n                DEBUG_NUM = 0;\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[0];\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[1];\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[2];\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[3];\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[4];\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[5];\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[6];\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++] = RS485_READ_COMMAND_STRING[7];\n\n                /*crc_value=0xFFFF;\n                for (n=0;n<6;n++)\n                {\n                 y_crc = ((crc_value>>8) ^ Uart3_Debug.UART_DMA_TXD_BUF[n]) & 0xff;\n                 crc_value = crc_value << 8;\n                 x_crc = y_crc ^ (y_crc>>4);\n                 crc_value = crc_value ^ (x_crc << 12) ^ (x_crc <<5) ^ x_crc;\n                 crc_value &= 0xffff;  //enable this line for processors with more than 16 bits\n                }\n\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++]=(u8)(crc_value>>8);\n                Uart3_Debug.UART_DMA_TXD_BUF[DEBUG_NUM++]=(u8)(crc_value);*/\n\n                Uart3_Debug_Send (DEBUG_NUM);\n\n                DEBUG_TIMER = 400;\n                DEBUG_STATUS = DEBUG_STATUS_WAIT;\n                DEBUG_STATUS_NEW_FLAG = 1;\n            }\n        }\n        else if (DEBUG_STATUS == DEBUG_STATUS_WAIT)\n        {\n            if (DEBUG_TIMER == 0)\n            {\n                DEBUG_STATUS = DEBUG_STATUS_CONFIG;\n                DEBUG_STATUS_NEW_FLAG = 1;\n            }\n            else if ((Uart3_Debug.UART_RXD_FINISH == 1))\n            {\n                //01 03 06 08 98 00 00 09 2E C5 8B\t\t220V23.5A\n                //01 03 06 0A 8C 00 00 09 2E C5 8B\t\t270V23.5A\n                //01 03 06 08 98 00 00 0A 28 C5 8B\t\t220V26.0A\n                if ((Uart3_Debug.UART_DMA_RXD_BUF[0] == 0x01) && (Uart3_Debug.UART_DMA_RXD_BUF[1] == 0x03) && (Uart3_Debug.UART_DMA_RXD_BUF[2] == 0x06))\n                {\n                    RS485_READ_VOLTAGE_VALUE = Uart3_Debug.UART_DMA_RXD_BUF[3];\n                    RS485_READ_VOLTAGE_VALUE <<= 8;\n                    RS485_READ_VOLTAGE_VALUE += Uart3_Debug.UART_DMA_RXD_BUF[4];\n\n                    RS485_READ_CURRENT_VALUE = Uart3_Debug.UART_DMA_RXD_BUF[7];\n                    RS485_READ_CURRENT_VALUE <<= 8;\n                    RS485_READ_CURRENT_VALUE += Uart3_Debug.UART_DMA_RXD_BUF[8];\n\n                    if (RS485_READ_VOLTAGE_VALUE > TEST_VOLTAGE_MAX)\n                    {\n                        TEST_VOLTAGE_MAX = RS485_READ_VOLTAGE_VALUE;\n                        pcf8563_read_time(2, 7, MENU_TIME_DATA);\n                        power_detect_data_save(POWER_VOL_MAX_BASE, RS485_READ_VOLTAGE_VALUE, RS485_READ_CURRENT_VALUE, MENU_TIME_DATA);\n                    }\n\n                    if (RS485_READ_VOLTAGE_VALUE < TEST_VOLTAGE_MIN)\n                    {\n                        TEST_VOLTAGE_MIN = RS485_READ_VOLTAGE_VALUE;\n                        pcf8563_read_time(2, 7, MENU_TIME_DATA);\n                        power_detect_data_save(POWER_VOL_MIN_BASE, RS485_READ_VOLTAGE_VALUE, RS485_READ_CURRENT_VALUE, MENU_TIME_DATA);\n                    }\n\n                    if (RS485_READ_CURRENT_VALUE > TEST_CURRENT_MAX)\n                    {\n                        TEST_CURRENT_MAX = RS485_READ_CURRENT_VALUE;\n                        pcf8563_read_time(2, 7, MENU_TIME_DATA);\n                        power_detect_data_save(POWER_CUR_MAX_BASE, RS485_READ_VOLTAGE_VALUE, RS485_READ_CURRENT_VALUE, MENU_TIME_DATA);\n                    }\n\n                    if ((RS485_READ_CURRENT_VALUE > (DEBUG_CURRENT_MIN * 10)) && (RS485_READ_CURRENT_VALUE < (DEBUG_CURRENT_MAX * 10)))\n                    {\n                        if ((TEST_CURRENT_MIN == 0) || (TEST_CURRENT_MIN == 0xFFFF))\t\t//��δ��⵽�˷�Χ����\n                        {\n                            TEST_CURRENT_MIN = RS485_READ_CURRENT_VALUE;\n                            pcf8563_read_time(2, 7, MENU_TIME_DATA);\n                            power_detect_data_save(POWER_CUR_MIN_BASE, RS485_READ_VOLTAGE_VALUE, RS485_READ_CURRENT_VALUE, MENU_TIME_DATA);\n                        }\n                    }\n\n                    RS485_READ_UPDATA_FLAG = 1;\n\n                    if ((MAIN_STATUS & 0x0F))\n                    {\n                        if (RS485_READ_VOLTAGE_VALUE > (POWER_VOLTAGE_MAX * 10))\n                        {\n                            lcd_display_string(0, 0, \"                        \");\n                            lcd_display_string(1, 0, \"                        \");\n                            lcd_display_string(2, 0, \"  �����ѹƫ�ߣ����飡\");\n                            lcd_display_string(3, 0, \"                        \");\n                            Beep_Set (1, 1, 50000);\n                            Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n                            while (1);\n                        }\n\n                        if (RS485_READ_CURRENT_VALUE > (POWER_CURRENT_MAX * 10))\n                        {\n                            lcd_display_string(0, 0, \"                        \");\n                            lcd_display_string(1, 0, \"                        \");\n                            lcd_display_string(2, 0, \"  ���ȵ���ƫ�����飡\");\n                            lcd_display_string(3, 0, \"                        \");\n                            Beep_Set (1, 1, 50000);\n                            Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n                            while (1);\n                        }\n\n                        if ((RS485_READ_CURRENT_VALUE > (DEBUG_CURRENT_MIN * 10)) && (RS485_READ_CURRENT_VALUE < (DEBUG_CURRENT_MAX * 10)))\n                        {\n                            lcd_display_string(0, 0, \"                        \");\n                            lcd_display_string(1, 0, \"                        \");\n                            lcd_display_string(2, 0, \"  ���ȵ���ƫС�����飡\");\n                            lcd_display_string(3, 0, \"                        \");\n                            Beep_Set (1, 1, 50000);\n                            Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n                            while (1);\n                        }\n                    }\n                }\n\n                Uart3_Debug_Recevie_Init();\n                DEBUG_STATUS = DEBUG_STATUS_CONFIG;\n                DEBUG_STATUS_NEW_FLAG = 1;\n                DEBUG_TIMER = 100;\n            }\n        }\n\n\n        ///////////////////////////////////����ģ������+ͨ��///////////////////////////////////////////\n        if (BTCOM_STATUS == BT_STATUS_INITIAL)\n        {\n            if (BTCOM_STATUS_NEW_FLAG)\n            {\n                BTCOM_STATUS_NEW_FLAG = 0;\n                RFIO_1_H;\n                RFIO_2_H;\n                BTCOM_TIMER = 10;\n            }\n\n            if (BTCOM_TIMER == 0)\n            {\n                BTCOM_STATUS = BT_STATUS_CONFIG;\n                BTCOM_STATUS_NEW_FLAG = 1;\n            }\n        }\n        else if (BTCOM_STATUS == BT_STATUS_CONFIG)\n        {\n            BTCOM_NUM = 0;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = 0xC2;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = 0x00;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = 0x08;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(BTCOM_CONFIG_ADDRESS >> 8);\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(BTCOM_CONFIG_ADDRESS);\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = 0x60 + BTCOM_CONFIG_SPEED;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = BTCOM_CONFIG_POWER;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = BTCOM_CONFIG_CHANNEL;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = BTCOM_CONFIG_MODE;\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(BTCOM_CONFIG_PASSWORD >> 8);\n            Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(BTCOM_CONFIG_PASSWORD);\n            Uart1_BTcom_Send (BTCOM_NUM);\n\n            Uart1_BTcom_Recevie_Init();\n            BTCOM_TIMER = 100;\n            BTCOM_STATUS = BT_STATUS_WAIT;\n            BTCOM_STATUS_NEW_FLAG = 1;\n        }\n        else if (BTCOM_STATUS == BT_STATUS_WAIT)\n        {\n            if (BTCOM_TIMER == 0)\n            {\n                BTCOM_STATUS = BT_STATUS_CONFIG;\n                BTCOM_STATUS_NEW_FLAG = 1;\n            }\n\n            if ((Uart1_BTcom.UART_RXD_FINISH == 1))\n            {\n                for (BTCOM_NUM = 1; BTCOM_NUM < 11; BTCOM_NUM++)\n                {\n                    if (Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM] != Uart1_BTcom.UART_DMA_RXD_BUF[BTCOM_NUM])\n                        BTCOM_NUM = 0xFE;\n                }\n\n                if (BTCOM_NUM < 0xFE)\n                {\n                    RFIO_1_L;\n                    RFIO_2_L;\n                    BTCOM_STATUS = BT_STATUS_RXD;\n                    BTCOM_STATUS_NEW_FLAG = 1;\n                }\n                else\n                {\n                    BTCOM_STATUS = BT_STATUS_CONFIG;\n                    BTCOM_STATUS_NEW_FLAG = 1;\n                }\n\n                Uart1_BTcom_Recevie_Init();\n            }\n        }\n        else if (BTCOM_STATUS == BT_STATUS_RXD)\n        {\n            if ((Uart1_BTcom.UART_RXD_FINISH == 1))\n            {\n                if (Uart1_BTcom.UART_DMA_RXD_BUF[0] == BTCOMMAND_REPORT_STATUS)\n                {\n                    BTCOM_NUM = 0;\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(BTCOM_MASTER_ADDRESS >> 8);\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(BTCOM_MASTER_ADDRESS);\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = BTCOM_CONFIG_CHANNEL;\n\n                    //sent data\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = BTCOMMAND_REPORT_STATUS;\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = 0;\n\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = MFL_PARA_A.TIME_DATA_UART_NUM++;\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = MAIN_STATUS;\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = MFL_PARA_A.SLAVE_STATUS;\n\n                    temp = MFL_PARA_A.TEMP_DIS;\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(temp >> 8);\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(temp);\n\n                    temp = MFL_PARA_A.TIME;\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(temp >> 8);\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(temp);\n\n                    Uart1_BTcom.UART_DMA_TXD_BUF[4] = BTCOM_NUM - 3;\n\n                    //CRC calculate\n                    crc_num = 0;\n                    for (n = 3; n < BTCOM_NUM; n++)\n                        crc_num += Uart1_BTcom.UART_DMA_TXD_BUF[n];\n                    Uart1_BTcom.UART_DMA_TXD_BUF[BTCOM_NUM++] = (u8)(crc_num);\n\n                    Uart1_BTcom_Send (BTCOM_NUM);\n                }\n\n                Uart1_BTcom_Recevie_Init();\n            }\n        }\n\n        ////////////////////////////////////////////////////////////////////////////////////////\n        if ((MFL_PARA_A.Redianou_Check_En_Counter == 0) && (MAIN_STATUS != MAIN_STATUS_DIS_POWER) && (MAIN_STATUS != MAIN_STATUS_DEBUG) && (MAIN_STATUS != MAIN_STATUS_INITRESET))\n        {\n            if ((MFL_PARA_A.temp_drop_enable) && (MFL_PARA_A.PID_PARA[9][0] >= 111))\n            {\n                if ((MFL_PARA_A.temp_drop_new_flag) && (MFL_PARA_A.FANJIE_DELAY_NUM == 0))\n                {\n                    MFL_PARA_A.temp_drop_new_flag = 0;\n\n                    if ((MFL_PARA_A.TEMP_DIS < MFL_PARA_A.temp_drop_high_temp) && (MFL_PARA_A.temp_drop_run_cycle > MFL_PARA_A.temp_drop_cont_time))\n                    {\n                        temp_drop_sum = 0;\n                        time_drop_sum = 0;\n                        temp_drop_min = 2000;\n                        temp_drop_max = -2000;\n\n                        //����Ҫ�л�\n                        if (MFL_PARA_A.temp_drop_buf_num >= MFL_PARA_A.temp_drop_cont_time)\n                        {\n                            cycle_drop_start = MFL_PARA_A.temp_drop_buf_num - MFL_PARA_A.temp_drop_cont_time;\n                            cycle_drop_end = MFL_PARA_A.temp_drop_buf_num;\n                            for (temp = cycle_drop_start; temp < cycle_drop_end; temp++)\n                            {\n                                if (MFL_PARA_A.temp_drop_buf[temp] > temp_drop_max)\n                                    temp_drop_max = MFL_PARA_A.temp_drop_buf[temp];\n                                else if (MFL_PARA_A.temp_drop_buf[temp] < temp_drop_min)\n                                    temp_drop_min = MFL_PARA_A.temp_drop_buf[temp];\n\n                                time_drop_sum += MFL_PARA_A.Heat_work_time[temp];\n                            }\n                        }\n                        else\n                        {\n                            cycle_drop_start = MFL_PARA_A.temp_drop_buf_num + 1024;\n                            cycle_drop_start -= MFL_PARA_A.temp_drop_cont_time;\n                            cycle_drop_end = MFL_PARA_A.temp_drop_buf_num;\n\n                            for (temp = cycle_drop_start; temp < 1024; temp++)\n                            {\n                                if (MFL_PARA_A.temp_drop_buf[temp] > temp_drop_max)\n                                    temp_drop_max = MFL_PARA_A.temp_drop_buf[temp];\n                                else if (MFL_PARA_A.temp_drop_buf[temp] < temp_drop_min)\n                                    temp_drop_min = MFL_PARA_A.temp_drop_buf[temp];\n\n                                time_drop_sum += MFL_PARA_A.Heat_work_time[temp];\n                            }\n\n                            for (temp = 0; temp < cycle_drop_end; temp++)\n                            {\n                                if (MFL_PARA_A.temp_drop_buf[temp] > temp_drop_max)\n                                    temp_drop_max = MFL_PARA_A.temp_drop_buf[temp];\n                                else if (MFL_PARA_A.temp_drop_buf[temp] < temp_drop_min)\n                                    temp_drop_min = MFL_PARA_A.temp_drop_buf[temp];\n\n                                time_drop_sum += MFL_PARA_A.Heat_work_time[temp];\n                            }\n                        }\n\n                        time_drop_sum *= MFL_PARA_A.temp_drop_draft_temp;\n                        time_drop_sum /= MFL_PARA_A.temp_drop_cont_time;\n                        time_drop_sum /= 200;\n                        temp_drop_max -= temp_drop_min;\n                        if (temp_drop_max < time_drop_sum)\n                        {\n                            lcd_display_string(0, 0, \"                        \");\n                            lcd_display_string(1, 0, \"                        \");\n                            lcd_display_string(2, 0, \"�ȵ�ż�����쳣�����飡\");\n                            lcd_display_string(3, 0, \"                        \");\n                            Beep_Set (1, 1, 50000);\n                            Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n                            RELAY_DELAY_EN = 0;\n                            RELAY_OFF;\t\t//ǿ�ƹرռ��Ȼ�·�̵���\n                            while (1);\n                        }\n                    }\n                }\n            }\n\n            if ((FANJIE_VALUE_MAX > 0) && (MFL_PARA_A.FANJIE_DELAY_NUM == 0))\n            {\n                if ((MFL_PARA_A.temp_bipolar_flag) && (MFL_PARA_A.TEMP_DIS >= FANJIE_VALUE_MAX))\n                {\n                    lcd_display_string(0, 0, \"                        \");\n                    lcd_display_string(1, 0, \"                        \");\n                    lcd_display_string(2, 0, \"  �ȵ�ż���ӣ����飡  \");\n                    lcd_display_string(3, 0, \"                        \");\n                    Beep_Set (1, 1, 50000);\n                    Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n                    RELAY_DELAY_EN = 0;\n                    RELAY_OFF;\t\t//ǿ�ƹرռ��Ȼ�·�̵���\n                    while (1);\n                }\n            }\n            if ((MFL_PARA_A.temp_bipolar_flag == 0) && (MFL_PARA_A.TEMP_DIS >= 1300))\n            {\n                lcd_display_string(0, 0, \"                        \");\n                lcd_display_string(1, 0, \"                        \");\n                lcd_display_string(2, 0, \"  �ȵ�ż��·�����飡  \");\n                lcd_display_string(3, 0, \"                        \");\n                Beep_Set (1, 1, 50000);\n                Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n                RELAY_DELAY_EN = 0;\n                RELAY_OFF;\t\t//ǿ�ƹرռ��Ȼ�·�̵���\n                while (1);\n            }\n            //�쳣���±�����\n            if ((MFL_PARA_A.temp_bipolar_flag == 0) && (MFL_PARA_A.TEMP_DIS >= (MFL_PARA_A.EQUIPMENT_PARA[9][1] + 1000)))\t//+1000+\n            {\n                lcd_display_string(0, 0, \"                        \");\n                lcd_display_string(1, 0, \"                        \");\n                lcd_display_string(2, 0, \"  ���Ȼ�·�쳣������  \");\n                lcd_display_string(3, 0, \"                        \");\n                Beep_Set (1, 1, 50000);\n                Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n                RELAY_DELAY_EN = 0;\n                RELAY_OFF;\t\t//ǿ�ƹرռ��Ȼ�·�̵���\n                while (1);\n            }\n        }\n\n        if (Ai_CTRL.TIME_FLAG)\n        {\n            Ai_CTRL.TIME_FLAG = 0;\n            TaskFuzzy ();\n            //printf(\"%d\\r\\n\",SYSTEM_TEMP);\n        }\n\n        //�����ź�LCD��ʾ\n        if ((MAIN_STATUS >= FUNCTION_MANHUI) && (MAIN_STATUS <= FUNCTION_KUAIHUIB))\n        {\n            if (Ai_CTRL.PWM_STATUS_FLAG)\n            {\n                Ai_CTRL.PWM_STATUS_FLAG = 0;\n                lcd_post (0, 11);\n                if (Ai_CTRL.PWM_STATUS)\n                    lcd_display (0xA1F1);\n                else\n                    lcd_display (0xA1A1);\n            }\n        }\n\n\n        //�ָ���������\n        if (MAIN_STATUS == MAIN_STATUS_INITRESET)\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_reset ();\t\t//��ʾ���ý���\n                KEY_VALUE = KEY_VALUE_NONE;\n            }\n\n            if ((KEY_VALUE == KEY_VALUE_ENT))\n            {\n                Beep_Set (10, 10, 1);\n                lcd_display_string(3, 0, \"    ���ڻָ��У����Ժ�  \");\n                system_para_data_reset ();\n                Beep_Set (10, 10, 1);\n                lcd_display_string(3, 0, \"  �ѻָ��������ã�������\");\n                while (1);\n            }\n            else if ((KEY_VALUE == KEY_VALUE_ESC))\n            {\n                Beep_Set (10, 10, 1);\n                lcd_display_string(3, 0, \"      ��ȡ���ָ���������\");\n                while (1);\n            }\n        }\n        /////////////////////////////��ʾ��ʷ��ѹ��������ģʽ//////////////////////////////////////\n        else if (MAIN_STATUS == MAIN_STATUS_DIS_POWER)\n        {\n            lcd_display_string(0, 0, \"VH:                     \");\n            lcd_display_string(1, 0, \"VL:                     \");\n            lcd_display_string(2, 0, \"AH:                     \");\n            lcd_display_string(3, 0, \"AL:                     \");\n\n            power_detect_data_display(0, 1, POWER_VOL_MAX_BASE);\n            power_detect_data_display(1, 1, POWER_VOL_MIN_BASE);\n            power_detect_data_display(2, 1, POWER_CUR_MAX_BASE);\n            power_detect_data_display(3, 1, POWER_CUR_MIN_BASE);\n\n            //Beep_Set (1,1,50000);\n            Ai_CTRL.PID_SET_ALL = 1;   //ǿ�Ƽ��ȹر�\n            while (1)\n            {\n                if ((KEY_VALUE == KEY_VALUE_ENT))\n                {\n                    Beep_Set (10, 1, 1);\n                    //������ܲ���\n                    power_detect_data_reset (POWER_VOL_MAX_BASE);\n                    power_detect_data_reset (POWER_VOL_MIN_BASE);\n                    power_detect_data_reset (POWER_CUR_MAX_BASE);\n                    power_detect_data_reset (POWER_CUR_MIN_BASE);\n\n                    lcd_display_string(0, 0, \"                        \");\n                    lcd_display_string(1, 0, \"                        \");\n                    lcd_display_string(2, 0, \"  �����ɣ��������豸  \");\n                    lcd_display_string(3, 0, \"                        \");\n\n                    break;\n                }\n            }\n            while (1);\n        }\n\n        /////////////////////////////DEBUG ģʽ//////////////////////////////////////\n        else if (MAIN_STATUS == MAIN_STATUS_DEBUG)\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_debug ();\t\t//��ʾ���Խ���\n                if (MFL_PARA_A.Redianou_Type == 1)\n                    rdo_protect_voltage = 543; //S�ֶ�1000��*G(50.4)=542.153mV\n                else\n                    rdo_protect_voltage = 2274; //K�ֶ�1000��*G(50.4)=2274mV\n\n                debug_fix_data_display (MFL_PARA_A.board_temp_init_data, MFL_PARA_A.ads1220_ch23_init_data, rdo_protect_voltage);\n\n                MENU_Y = 0;\n                KEY_VALUE = KEY_VALUE_NONE;\n            }\n\n            if (GET_ADC_BUSY() == 0)\n            {\n                adc_data = ads1220_read_data ();\n            }\n\n            if (SECOND_FLAG)\n            {\n                SECOND_FLAG = 0;\n\n                debug_com_data_display (MFL_PARA_A.adc_BoardTemp_data, adc_data, MFL_PARA_A.adc_Compare_data);\n            }\n\n            if ((KEY_VALUE == KEY_VALUE_UP))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                if (MFL_PARA_A.board_temp_init_data < 199)\n                {\n                    MFL_PARA_A.board_temp_init_data++;\n                    debug_fix_data_display (MFL_PARA_A.board_temp_init_data, MFL_PARA_A.ads1220_ch23_init_data, rdo_protect_voltage); //1100�㳬��\n                }\n            }\n            else if ((KEY_VALUE == KEY_VALUE_DOWN))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                if (MFL_PARA_A.board_temp_init_data > 1)\n                {\n                    MFL_PARA_A.board_temp_init_data--;\n                    debug_fix_data_display (MFL_PARA_A.board_temp_init_data, MFL_PARA_A.ads1220_ch23_init_data, rdo_protect_voltage);\t\t//1100�㳬��\n                }\n            }\n            else if ((KEY_VALUE == KEY_VALUE_JINCHENG))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                MFL_PARA_A.ads1220_ch23_init_data = adc_data;",
                "line_count": 8456,
                "start_line": 1,
                "end_line": 1000
              }
            }
          },
          "params": {
            "path": "main.c"
          }
        },
        {
          "id": "51b66f7c-3604-4429-b528-deabb4e38e30",
          "type": "TEXT",
          "status": "success",
          "content": "我需要继续查看 [main.c](main.c) 的剩余内容来完整理解项目的业务逻辑。让我继续读取后面的内容。\n\n",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        },
        {
          "id": "22adf5ca-5f49-4626-97cc-15636d9a33a8",
          "type": "TOOL_CALL",
          "status": "success",
          "toolName": "read_file",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "workflowStatus": "success",
          "displayParams": {
            "path": "main.c"
          },
          "displayResult": {
            "lineCount": 1000,
            "readFile": {
              "path": "d:\\AUTOMFL\\Yuhong\\MFL_DYM\\src\\main.c",
              "startLine": 1001,
              "endLine": 2000
            }
          },
          "workflowSnapshot": {
            "status": "success",
            "result": {
              "name": "read_file",
              "type": "tool_use",
              "params": {
                "path": "main.c",
                "start_line": "1001",
                "end_line": "2000"
              },
              "success": true,
              "message": "",
              "code": 0,
              "result": {
                "content": "                debug_fix_data_display (MFL_PARA_A.board_temp_init_data, MFL_PARA_A.ads1220_ch23_init_data, rdo_protect_voltage);\n            }\n            else if ((KEY_VALUE == KEY_VALUE_ENT))\n            {\n                Beep_Set (10, 10, 1);\n                debug_data_save (MFL_PARA_A.board_temp_init_data, MFL_PARA_A.ads1220_ch23_init_data);\n                lcd_display_string(1, 0, \"                        \");\n                lcd_display_string(2, 0, \"                        \");\n                lcd_display_string(3, 0, \"  �ѱ�����Բ�����������\");\n                while (1);\n            }\n        }\n\n        else if (MAIN_STATUS == MAIN_STATUS_WELCOME)\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_welcome ();\t\t//��ʾ��ӭ����\n                Bresenham_Temp_Calibrate ();\n            }\n\n            if (KEY_VALUE != KEY_VALUE_NONE)\n            {\n                MENU_X = 0;\n                MENU_Y = 0;\n\n                MENU_X1 = 0;\n                MENU_X2 = 0;\n                MENU_X3 = 0;\n\n                Beep_Set (10, 10, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                MAIN_STATUS = MAIN_STATUS_FUNCTION;\t\t\t//��ʾ���ܲ˵�\n                STATUS_NEW_FLAG = FLAG_VALID;\n\n                //�˵�ѡ�񱣴�ֵ��ʼ��\n                MENU_X = MFL_PARA_A.menu_select_post;\n                MENU_X1 = MENU_X;\n            }\n        }\n\n        //���ܲ˵���ʾ\n        else if (MAIN_STATUS == MAIN_STATUS_FUNCTION)\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_function ();\t\t//��ʾ���ܽ���\n\n                //���Թ��\n                MENU_X = MENU_X1;\n                lcd_display_black (MENU_DIS_BLACK_FUN[MENU_X * 3], MENU_DIS_BLACK_FUN[MENU_X * 3 + 1], MENU_DIS_BLACK_FUN[MENU_X * 3 + 2], 1);\n            }\n\n            if ((KEY_VALUE == KEY_VALUE_UP))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                lcd_display_black (MENU_DIS_BLACK_FUN[MENU_X * 3], MENU_DIS_BLACK_FUN[MENU_X * 3 + 1], MENU_DIS_BLACK_FUN[MENU_X * 3 + 2], 0);\n\n                if (MENU_X > 0)\n                    MENU_X--;\n                else\n                    MENU_X = FUNCTION_ITEM_NUM - 1;\n\n                lcd_display_black (MENU_DIS_BLACK_FUN[MENU_X * 3], MENU_DIS_BLACK_FUN[MENU_X * 3 + 1], MENU_DIS_BLACK_FUN[MENU_X * 3 + 2], 1);\n            }\n            else if ((KEY_VALUE == KEY_VALUE_DOWN))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                lcd_display_black (MENU_DIS_BLACK_FUN[MENU_X * 3], MENU_DIS_BLACK_FUN[MENU_X * 3 + 1], MENU_DIS_BLACK_FUN[MENU_X * 3 + 2], 0);\n\n                if (MENU_X < (FUNCTION_ITEM_NUM - 1))\n                    MENU_X++;\n                else\n                    MENU_X = 0;\n\n                lcd_display_black (MENU_DIS_BLACK_FUN[MENU_X * 3], MENU_DIS_BLACK_FUN[MENU_X * 3 + 1], MENU_DIS_BLACK_FUN[MENU_X * 3 + 2], 1);\n            }\n            else if ((KEY_VALUE == KEY_VALUE_RIGHT) && (MENU_Y < (MAIN_ITEM_NUM - 1)))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                //����ȡ��\n                lcd_display_black (MENU_DIS_BLACK_FUN[MENU_X * 3], MENU_DIS_BLACK_FUN[MENU_X * 3 + 1], MENU_DIS_BLACK_FUN[MENU_X * 3 + 2], 0);\n                MAIN_STATUS = MAIN_STATUS_PROGRAM;\t\t\t//�����̲˵�״̬\n                STATUS_NEW_FLAG = FLAG_VALID;\n\n                MENU_X1 = MENU_X;\n\n                MENU_X = 0;\n                MENU_Y++;\n            }\n            else if (KEY_VALUE == KEY_VALUE_ENT)\n            {\n                Beep_Set (5, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                MENU_X1 = MENU_X;\n\n                //save the menu select after enter press\n                eeprom_24c64_write_byte(MENU_SELECT_VALUE_ADD, MENU_X);\n\n                lcd_display_black (MENU_DIS_BLACK_FUN[MENU_X * 3], MENU_DIS_BLACK_FUN[MENU_X * 3 + 1], MENU_DIS_BLACK_FUN[MENU_X * 3 + 2], 0);\n\n                MAIN_STATUS = MAIN_STATUS + MENU_X + 1;\t\t\t//���빦�ܺ���ִ�г���\n                STATUS_NEW_FLAG = FLAG_VALID;\n            }\n        }\n\n        //��̲˵���ʾ\n        else if (MAIN_STATUS == MAIN_STATUS_PROGRAM)\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_program ();\t\t//��ʾ��̲˵�\n\n                //���Թ��\n                MENU_X = MENU_X2;\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 1);\n            }\n\n            if ((KEY_VALUE == KEY_VALUE_UP))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 0);\n\n                if (MENU_X > 0)\n                    MENU_X--;\n                else\n                    MENU_X = PROGRAM_ITEM_NUM - 1;\n\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 1);\n            }\n            else if ((KEY_VALUE == KEY_VALUE_DOWN))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 0);\n\n                if (MENU_X < (PROGRAM_ITEM_NUM - 1))\n                    MENU_X++;\n                else\n                    MENU_X = 0;\n\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 1);\n            }\n            else if ((KEY_VALUE == KEY_VALUE_RIGHT) && (MENU_Y < (MAIN_ITEM_NUM - 1)))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                //����ȡ��\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 0);\n                MAIN_STATUS = MAIN_STATUS_MESSAGE;\t\t\t//������Ϣ��ʾ״̬\n                STATUS_NEW_FLAG = FLAG_VALID;\n\n                MENU_X2 = MENU_X;\n\n                MENU_X = 0;\n                MENU_Y++;\n            }\n            else if ((KEY_VALUE == KEY_VALUE_LEFT) && (MENU_Y > 0))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                //����ȡ��\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 0);\n                MAIN_STATUS = MAIN_STATUS_FUNCTION;\t\t\t//���빦�ܲ˵�״̬\n                STATUS_NEW_FLAG = FLAG_VALID;\n\n                MENU_X2 = MENU_X;\n\n                MENU_X = 0;\n                MENU_Y--;\n            }\n            else if (KEY_VALUE == KEY_VALUE_ENT)\n            {\n                Beep_Set (5, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                MENU_X2 = MENU_X;\n\n                lcd_display_black (MENU_DIS_BLACK_PRO[MENU_X * 3], MENU_DIS_BLACK_PRO[MENU_X * 3 + 1], MENU_DIS_BLACK_PRO[MENU_X * 3 + 2], 0);\n\n                //MAIN_STATUS=MAIN_STATUS+MENU_X+1;\t\t\t//���빦�ܺ���ִ�г���\n                MAIN_STATUS_BACK = MAIN_STATUS + MENU_X + 1;\n\n                if (MAIN_STATUS_BACK > 0x33)\n                    MAIN_STATUS = PROGRAM_PASSWORD;\n                else\n                    MAIN_STATUS = MAIN_STATUS_BACK;\n\n                STATUS_NEW_FLAG = FLAG_VALID;\n            }\n        }\n\n        //��Ϣ�˵���ʾ\n        else if (MAIN_STATUS == MAIN_STATUS_MESSAGE)\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_message ();\t\t//��ʾ��Ϣ�˵�\n            }\n\n            if ((KEY_VALUE == KEY_VALUE_LEFT) && (MENU_Y > 0))\n            {\n                Beep_Set (1, 1, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                MAIN_STATUS = MAIN_STATUS_PROGRAM;\t\t\t//������״̬\n                STATUS_NEW_FLAG = FLAG_VALID;\n\n                MENU_X = 0;\n                MENU_Y--;\n            }\n        }\n\n        ///////////////////////////////////////////////////////////////////////////////////////////////\n\n        else if (MAIN_STATUS == FUNCTION_MANHUI)\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_manhui ();\t\t//��ʾ���Ҳ˵�\n\n                MFL_PARA_A.temp_drop_enable = 1;\n                MFL_PARA_A.temp_drop_run_cycle = 0;\n\n                MFL_PARA_A.SLAVE_STATUS = MF_INIT;       //��״̬����λ\n                MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n            }\n\n            if (KEY_VALUE == KEY_VALUE_ESC)\n            {\n                //MOTER_OFF;\n\n                MFL_PARA_A.TIME_NUM = 0;\n\n                Beep_Set (15, 15, 1);\n                KEY_VALUE = KEY_VALUE_NONE;\n\n                CtrlStove(0, 0, KU40);\n\n                //while (MFL_PARA_A.TIME_NUM<150);\n\n                //MoveStove(posAllClose);\n\n\n                MFL_PARA_A.temp_drop_enable = 0;\n                MFL_PARA_A.temp_drop_run_cycle = 0;\n\n                MAIN_STATUS = MAIN_STATUS_FUNCTION;\t\t\t//���빦��ѡ��״̬\n                STATUS_NEW_FLAG = FLAG_VALID;\n            }\n\n            switch(MFL_PARA_A.SLAVE_STATUS)\n            {\n            case MF_INIT:\n            {\n                if(MFL_PARA_A.TEMP_VALUE <= MF_TEMP_100)\n                {\n                    //lcd_display_string(3,0,\"��ʾ���ȴ�¯�Ŵ�...   \");\n                    MFL_PARA_A.SLAVE_STATUS = MF_WAIT0;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n                    //MoveStove(posAllOpen);\n\n                    Ai_CTRL.PID_SET_ALL = 0;\n                }\n                else\n                {\n                    if (MFL_PARA_A.SLAVE_STATUS_NEW)\n                    {\n                        Beep_Set (5, 1, 1);\n                        lcd_display_string(3, 0, \"��ʾ���ȴ�¯���½�...   \");\n                        MFL_PARA_A.SLAVE_STATUS_NEW = 0;\n\n                        //MoveStove(posAllOpen);\n                    }\n                    CtrlStove(0, 0, KU40);\n                }\n\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    //time_dis_lcd (2,5,MFL_PARA_A.TIME);lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n            }\n            break;\n\n            case MF_WAIT0:\n            {\n                if(1)\t\t\t\t\t\t\t\t\t\t\t\t\t//��ȫ����\n                {\n                    if (MFL_PARA_A.TIME_SEC_FLAG)\n                    {\n                        MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                        temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                        lcd_display_temp_space ();\n                        //time_dis_lcd (2,5,MFL_PARA_A.TIME);lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                    }\n\n                    if (MFL_PARA_A.SLAVE_STATUS_NEW)\n                    {\n                        Beep_Set (1, 1, 1);\n                        //lcd_display_string(3,0,\"��ʾ����ȷ�����ŷ�      \");\n                        MFL_PARA_A.SLAVE_STATUS_NEW = 0;\n                    }\n\n                    //if (KEY_VALUE==KEY_VALUE_ENT)\n                    if (1)\n                    {\n                        Beep_Set (1, 1, 1);\n                        KEY_VALUE = KEY_VALUE_NONE;\n\n                        MFL_PARA_A.SLAVE_STATUS = MF_WARMUP1_WAIT;\t\t\t\t//20121030\n                        MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                        CtrlStove(1, MF_TEMP_500, KU40);\n                        //CtrlStove(1,MF_TEMP_600,KU40);\t\t\t\t\t//20121030\n                        //CtrlStove(1,MANHUI_500_CHUWEN,KU40);\t\t\t\t\t//20121101\n\n                        lcd_display_string(0, 0, \"����״̬��������...     \");\n                        lcd_display_string(3, 0, \"��ʾ������̴Ѳ����ŷ�\");\n\n                        MFL_PARA_A.TIME_SEC_FLAG = 0;\n                        MFL_PARA_A.TIME_NUM = 0;\n                        MFL_PARA_A.TIME = 0;\n                        MFL_PARA_A.TEMP_MANHUI_INIT = MFL_PARA_A.TEMP_VALUE;\n                    }\n                    /*else if (KEY_VALUE==KEY_VALUE_ESC)\n                     {\n                    \t  Beep_Set (1,1,1);\n                    \t\t\tKEY_VALUE=KEY_VALUE_NONE;\n\n                    \t\t\tCtrlStove(0,0,KU40);\n\n                    \t\t\tMAIN_STATUS=MAIN_STATUS_FUNCTION;\t\t\t//���빦��ѡ��״̬\n                    \t\t STATUS_NEW_FLAG=FLAG_VALID;\n                    \t} */\n                }\n            }\n            break;\n\n            case MF_WARMUP1_WAIT:\t\t\t\t\t\t\t\t\t\t\t//20121030\n            {\n                /*if(MFL_PARA_A.TEMP_VALUE>=MANHUI_500_QIKONG)\n                \t\t{\n                   CtrlStove(1,MANHUI_500_MOWEN,KU40);\n\n                \t\t\t\tMFL_PARA_A.SLAVE_STATUS=MF_WARMUP1;\n                \t\t\t\tMFL_PARA_A.SLAVE_STATUS_NEW=1;\n                \t\t}\n                \telse\n                \t {\n                \t\t  if (MFL_PARA_A.TIME_SEC_FLAG)\n                \t\t\t\t {\n                \t\t\t\t\t  MFL_PARA_A.TIME_SEC_FLAG=0;\n\n                \t\t\t\t\t\t\ttemp_dis_lcd (1,5,MFL_PARA_A.TEMP_DIS);lcd_display_temp_space ();\n                \t\t\t\t\t\t\ttime_dis_lcd (2,5,MFL_PARA_A.TIME);lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                \t\t\t\t\t}\n                \t\t}*/\n\n                if (MFL_PARA_A.TEMP_VALUE < 500)\n                {\n                    if (MFL_PARA_A.TEMP_VALUE > (MFL_PARA_A.TIME * (500 - MFL_PARA_A.TEMP_MANHUI_INIT) / 1800 + MFL_PARA_A.TEMP_MANHUI_INIT))\n                    {\n                        Ai_CTRL.PID_SET_ALL = 1;\t\t\t\t\t\t\t\t\t//ǿ�йر�\n                    }\n                    else\n                    {\n                        Ai_CTRL.PID_SET_ALL = 0;       //��������\n                    }\n                }\n                else\n                {\n                    MFL_PARA_A.SLAVE_STATUS = MF_WARMUP1;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    Ai_CTRL.PID_SET_ALL = 0;       //��������\n                }\n\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n            }\n            break;\n\n            case MF_WARMUP1:\t\t\t\t\t\t\t           //500�Ⱥ��°�Сʱ\n            {\n                if(MFL_PARA_A.TEMP_VALUE >= MF_TEMP_500)\n                {\n                    Beep_Set (10, 10, 2);\n\n                    lcd_display_string(0, 0, \"����״̬��������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_HENWEN1;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n                }\n                else\n                {\n                    if (MFL_PARA_A.TIME_SEC_FLAG)\n                    {\n                        MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                        temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                        lcd_display_temp_space ();\n                        time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                        lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                    }\n                }\n            }\n            break;\n\n            case MF_HENWEN1:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    if (MFL_PARA_A.TEMP_DIS >= 500)\n                    {\n                        temp_dis_lcd (1, 5, (MFL_PARA_A.TEMP_DIS - 500) / 4 + 500);\n                        lcd_display_temp_space ();\n                    }\n                    else\n                    {\n                        temp_dis_lcd (1, 5, 500 - (500 - MFL_PARA_A.TEMP_DIS) / 4);\n                        lcd_display_temp_space ();\n                    }\n\n                    //temp_dis_lcd (1,5,(MFL_PARA_A.TEMP_DIS+500)/2);lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if(MFL_PARA_A.TIME == 1770)     \t\t\t              //\"29:30\" ��ʾ\n                    Beep_Set (10, 10, 1);\n\n                if(MFL_PARA_A.TIME >= 1800)\n                {\n                    lcd_display_string(0, 0, \"����״̬��������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_WARMUP2;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    MFL_PARA_A.TEMP_DIS_START = MFL_PARA_A.TEMP_DIS;\n                    MFL_PARA_A.TEMP_DIS_END = MFL_PARA_A.PID_PARA[3][1];\n                    MFL_PARA_A.TIME_MF_SET = MFL_PARA_A.PID_PARA[3][0];\n                    MFL_PARA_A.TIME_MF_SET *= 60;\n                    MFL_PARA_A.TIME_MF_SET_BEEP = MFL_PARA_A.TIME_MF_SET - 30;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n\n                    //MoveStove(posAllClose);  \t\t\t\t\t\t\t\t//���ﲻ�رգ����������ŷ�\n                    CtrlStove(1, MF_TEMP_815, KU40);\n                    //CtrlStove(1,MANHUI_815_CHUWEN,KU40);\n\n                    //Beep_Set (1,1,1);\n                }\n            }\n            break;\n\n            //\t\t\t\t\t\t\t\t\t\t\tcase MF_HENWEN1_WAIT:\n            //\t\t\t\t\t\t\t\t\t\t\t {\n            //\t\t\t\t\t\t\t\t\t\t\t\t  if(MFL_PARA_A.TEMP_VALUE>=MANHUI_815_QIKONG)\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n            //\t\t\t\t\t\t\t\t\t\t\t\t     CtrlStove(1,MANHUI_815_MOWEN,KU40);\n            //\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMFL_PARA_A.SLAVE_STATUS=MF_WARMUP2;\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMFL_PARA_A.SLAVE_STATUS_NEW=1;\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\telse\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t {\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  if (MFL_PARA_A.TIME_SEC_FLAG)\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t {\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  MFL_PARA_A.TIME_SEC_FLAG=0;\n            //\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttemp_dis_lcd (1,5,MFL_PARA_A.TEMP_DIS);lcd_display_temp_space ();\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttime_dis_lcd (2,5,MFL_PARA_A.TIME);lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n            //\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n            //\t\t\t\t\t\t\t\t\t\t\t\t}\n            //\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n            case MF_WARMUP2:\t\t\t\t\t\t\t\t\t//815�Ⱥ���һСʱ\n            {\n                if (MFL_PARA_A.TEMP_VALUE >= MF_TEMP_815)\n                {\n                    lcd_display_string(0, 0, \"����״̬��������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_HENWEN2;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n\n                    Ai_CTRL.PID_SET_ALL = 0;       //��������\n\n                    Beep_Set (10, 10, 2);\n                }\n                else if ((MFL_PARA_A.TEMP_VALUE >= MF_TEMP_KEY) && (KEY_VALUE == KEY_VALUE_ENT))\n                {\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    lcd_display_string(0, 0, \"����״̬��������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_HENWEN2;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n\n                    Ai_CTRL.PID_SET_ALL = 0;       //��������\n\n                    Beep_Set (10, 10, 3);\n                }\n                else\n                {\n                    if (MFL_PARA_A.TIME_SEC_FLAG)\n                    {\n                        MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                        temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                        lcd_display_temp_space ();\n                        time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                        lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                    }\n\n                    if (MFL_PARA_A.TEMP_VALUE < MFL_PARA_A.TEMP_DIS_END)\n                    {\n                        if (MFL_PARA_A.TEMP_VALUE > MFL_PARA_A.TEMP_DIS_START)\n                        {\n                            sum = MFL_PARA_A.TIME;\n                            sum *= MFL_PARA_A.PID_PARA[3][2];\n                            sum /= 60;\n                            sum += MFL_PARA_A.TEMP_DIS_START;\n\n                            if (MFL_PARA_A.TEMP_VALUE > (u16)(sum))\n                                Ai_CTRL.PID_SET_ALL = 1;\t\t\t\t\t\t\t\t\t//ǿ�йر�\n                            else\n                                Ai_CTRL.PID_SET_ALL = 0xffff;\n                        }\n                        else\n                        {\n                            Ai_CTRL.PID_SET_ALL = 0xffff;\n                        }\n                    }\n                    else if (MFL_PARA_A.TEMP_VALUE < (KF_TEMP_815))\n                    {\n                        Ai_CTRL.PID_SET_ALL = 0;       //��������\n                    }\n                }\n            }\n            break;\n\n            case MF_HENWEN2:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if(MFL_PARA_A.TIME == MFL_PARA_A.TIME_MF_SET_BEEP)        \t\t//\"59:30\" //��ǰ�������ʾʱ�䵽\n                    Beep_Set (10, 10, 15);\n\n                if(MFL_PARA_A.TIME >= MFL_PARA_A.TIME_MF_SET)\n                {\n                    //�����˳���Ʒ�Ĺ���\n                    //MoveStove(posAllOpen);\n                    lcd_display_string(0, 0, \"����״̬���������      \");\n                    lcd_display_string(3, 0, \"��ʾ����ȷ�ϼ��������  \");\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_WAIT1;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n\n                    //Beep_Set (1,1,1);\n                    //CtrlStove(0,MF_TEMP_100,KU40);\n                    CtrlStove(0, 0, KU40);\n                }\n            }\n            break;\n\n            case MF_WAIT1:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    //time_dis_lcd (2,5,MFL_PARA_A.TIME);lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if(KEY_VALUE == KEY_VALUE_ENT)\n                {\n                    Beep_Set (1, 1, 1);\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    //MoveStove(posAllClose);\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_WARMUP3;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    lcd_display_string(0, 0, \"����״̬��������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n                    lcd_display_string(3, 0, \"��ʾ������̴Ѳ����ŷ�\");\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n\n                    CtrlStove(1, MF_TEMP_815, KU40);\n                }\n                else if (KEY_VALUE == KEY_VALUE_ESC)\n                {\n                    Beep_Set (1, 1, 1);\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    CtrlStove(0, 0, KU40);\n\n                    //MoveStove(posAllClose);\n                    MFL_PARA_A.temp_drop_enable = 0;\n                    MFL_PARA_A.temp_drop_run_cycle = 0;\n\n                    MAIN_STATUS = MAIN_STATUS_FUNCTION;\t\t\t//���빦��ѡ��״̬\n                    STATUS_NEW_FLAG = FLAG_VALID;\n                }\n            }\n            break;\n\n            case MF_WARMUP3:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if (MFL_PARA_A.TEMP_VALUE >= MF_TEMP_815 )\n                {\n                    lcd_display_string(0, 0, \"����״̬��������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_RETEST;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n                }\n            }\n            break;\n\n            case MF_RETEST:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if(MFL_PARA_A.TIME == 1170)    //\"19:00\"\t     //��ǰһ������ʾ\n                    Beep_Set (10, 10, 15);\n\n                if(MFL_PARA_A.TIME >= 1200)\t                  //���������\n                {\n                    //Beep_Set (10,10,1);\n\n                    //MoveStove(posAllOpen);\n                    lcd_display_string(0, 0, \"����״̬���������      \");\n                    lcd_display_string(3, 0, \"��ʾ����ȷ�ϼ��������  \");\n\n                    MFL_PARA_A.SLAVE_STATUS = MF_WAIT2;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    CtrlStove(0, MF_TEMP_100, KU40);\n                }\n            }\n            break;\n\n            case MF_WAIT2:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    //time_dis_lcd (2,5,MFL_PARA_A.TIME);lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if(KEY_VALUE == KEY_VALUE_ENT)\n                {\n                    Beep_Set (1, 1, 1);\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    //MoveStove(posAllClose);\n                    MFL_PARA_A.SLAVE_STATUS = MF_WARMUP3;\n                    MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n\n                    lcd_display_string(0, 0, \"����״̬��������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n                    lcd_display_string(3, 0, \"��ʾ������̴Ѳ����ŷ�\");\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n\n                    CtrlStove(1, MF_TEMP_815, KU40);\n                }\n                else if (KEY_VALUE == KEY_VALUE_ESC)\n                {\n                    //MOTER_OFF;\n\n                    Beep_Set (1, 1, 1);\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    CtrlStove(0, 0, KU40);\n                    //MoveStove(posAllClose);\n\n                    MFL_PARA_A.temp_drop_enable = 0;\n                    MFL_PARA_A.temp_drop_run_cycle = 0;\n\n                    MAIN_STATUS = MAIN_STATUS_FUNCTION;\t\t\t//���빦��ѡ��״̬\n                    STATUS_NEW_FLAG = FLAG_VALID;\n\n                    SECOND_NUM = 0;\n                    while (SECOND_NUM < 190);\n                }\n            }\n            break;\n\n            default:\n                break;\n            }\n        }\n\n        ///////////////////////////////////////////////////////////////////////////////////////////////\n        else if (MAIN_STATUS == FUNCTION_KUAIHUI)\t\t\t\t\t\t\t\t//���\n        {\n            if (STATUS_NEW_FLAG)\n            {\n                STATUS_NEW_FLAG = FLAG_INVALID;\n                menu_display_kuaihui ();\t\t//��ʾ��Ҳ˵�\n\n                Ai_CTRL.PID_SET_ALL = 0;\n\n                MFL_PARA_A.TIME_SEC_FLAG = 0;\n                MFL_PARA_A.TIME_NUM = 0;\n                MFL_PARA_A.TIME = 0;\n\n                MFL_PARA_A.temp_drop_enable = 1;\n                MFL_PARA_A.temp_drop_run_cycle = 0;\n\n                MFL_PARA_A.SLAVE_STATUS = KF_INIT;       //��״̬����λ\n                MFL_PARA_A.SLAVE_STATUS_NEW = 1;\n            }\n\n            switch(MFL_PARA_A.SLAVE_STATUS)\n            {\n            case KF_INIT:\n            {\n                CtrlStove(1, KF_TEMP_850, KU40);\t//���µ�850\n\n                lcd_display_string(0, 0, \"�����ң�����...       \");\n                lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n                lcd_display_string(3, 0, \"��ʾ������̴�        \");\n\n                MFL_PARA_A.SLAVE_STATUS = KF_WARMUP1;\n\n                MFL_PARA_A.TEMP_DIS_START = MFL_PARA_A.TEMP_DIS;\n                MFL_PARA_A.TEMP_DIS_END = MFL_PARA_A.PID_PARA[4][1];\n                MFL_PARA_A.TIME_KF_SET = MFL_PARA_A.PID_PARA[4][0];\n                MFL_PARA_A.TIME_KF_SET *= 60;\n                MFL_PARA_A.TIME_KF_SET_BEEP = MFL_PARA_A.TIME_KF_SET - 30;\n\n                MFL_PARA_A.TIME_SEC_FLAG = 0;\n                MFL_PARA_A.TIME_NUM = 0;\n                MFL_PARA_A.TIME = 0;\n            }\n            break;\n\n            case KF_WARMUP1:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if (MFL_PARA_A.TEMP_VALUE < MFL_PARA_A.TEMP_DIS_END)\n                {\n                    if (MFL_PARA_A.TEMP_VALUE > MFL_PARA_A.TEMP_DIS_START)\n                    {\n                        sum = MFL_PARA_A.TIME;\n                        sum *= MFL_PARA_A.PID_PARA[4][2];\n                        sum /= 60;\n                        sum += MFL_PARA_A.TEMP_DIS_START;\n\n                        if (MFL_PARA_A.TEMP_VALUE > (u16)(sum))\n                            Ai_CTRL.PID_SET_ALL = 1;\t\t\t\t\t\t\t\t\t//ǿ�йر�\n                        else\n                            Ai_CTRL.PID_SET_ALL = 0xffff;\n                    }\n                    else\n                    {\n                        Ai_CTRL.PID_SET_ALL = 0xffff;\n                    }\n                }\n                else if (MFL_PARA_A.TEMP_VALUE < (KF_TEMP_850 - 2))\n                {\n                    Ai_CTRL.PID_SET_ALL = 0;       //��������\n                }\n\n                if (MFL_PARA_A.TEMP_VALUE >= (KF_TEMP_850 - 2))\n                {\n                    lcd_display_string(0, 0, \"�����ң�����...       \");\n                    lcd_display_string(3, 0, \"��ʾ����ȷ�ϼ���ʼ����  \");\n\n                    Ai_CTRL.PID_SET_ALL = 0;       //��������\n                    MFL_PARA_A.SLAVE_STATUS = KF_WAIT0;\n                    Beep_Set (10, 10, 150);\n                }\n                else if ((MFL_PARA_A.TEMP_VALUE >= KF_TEMP_KEY) && (KEY_VALUE == KEY_VALUE_ENT))\n                {\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    lcd_display_string(0, 0, \"�����ң�����...       \");\n                    lcd_display_string(3, 0, \"��ʾ����ȷ�ϼ���ʼ����  \");\n\n                    Ai_CTRL.PID_SET_ALL = 0;       //��������\n                    MFL_PARA_A.SLAVE_STATUS = KF_WAIT0;\n                    Beep_Set (10, 10, 150);\n                }\n            }\n            break;\n\n            case KF_WAIT0:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if (KEY_VALUE != KEY_VALUE_NONE)\n                    Beep_Set (10, 10, 0);\n\n                if ((KEY_VALUE == KEY_VALUE_ENT))\n                {\n                    Beep_Set (1, 1, 1);\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    //MoveStove(posAllOpen); \t\t//��¯��\n\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n                    lcd_display_string(3, 0, \"��ʾ��������ɺ�ȷ�ϼ�\");\n\n\n                    MFL_PARA_A.SLAVE_STATUS = KF_WAIT8;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n                }\n            }\n            break;\n\n            case KF_WAIT8:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_DIS);\n                    lcd_display_temp_space ();\n                    time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                    lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                }\n\n                if (KEY_VALUE == KEY_VALUE_ENT)\n                {\n                    Beep_Set (1, 1, 1);\n                    KEY_VALUE = KEY_VALUE_NONE;\n\n                    lcd_display_string(0, 0, \"�����ң�������...     \");\n                    lcd_display_string(2, 0, \"����ʱ�䣺00-00-00      \");\n                    lcd_display_string(3, 0, \"��ʾ������̴�        \");\n\n                    MFL_PARA_A.SLAVE_STATUS = KF_HENGWEN1_WAIT1;\n\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME_NUM = 0;\n                    MFL_PARA_A.TIME = 0;\n\n                    MFL_PARA_A.SLAVE_STATUS = KF_HUIWEN_WAIT1;\n                    MFL_PARA_A.TIME_NUM = 0;\t\t\t\t\t\t\t\t\t\t\t\t\t//ʱ�����������\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n                    MFL_PARA_A.TIME = 0;\n                    MFL_PARA_A.Temp_Test_Min = 930;\n\n                    CtrlStove(1, KUAIHUI_815, KU40);\n                    Ai_CTRL.SumErrLimit = 0; //20130403 HQ\n\n                    Ai_CTRL.PID_SET_FLAG = 1;\n\n                    Ai_CTRL.PID_TEST_STATUS = 0;\n                }\n            }\n            break;\n\n            case KF_HUIWEN_WAIT1:\n            {\n                if (MFL_PARA_A.TIME_SEC_FLAG)\n                {\n                    MFL_PARA_A.TIME_SEC_FLAG = 0;\n\n                    //MFL_PARA_A.Temp_Test[MFL_PARA_A.TIME]=MFL_PARA_A.TEMP_VALUE;\n\n                    if (MFL_PARA_A.Temp_Test_Min > MFL_PARA_A.TEMP_VALUE)\n                    {\n                        MFL_PARA_A.Temp_Test_Min = MFL_PARA_A.TEMP_VALUE;\n                        MFL_PARA_A.Temp_Test_Time_Start = MFL_PARA_A.TIME;\n                    }\n\n                    //�¶���ʾ����\n                    if (MFL_PARA_A.Temp_Test_Min < MFL_PARA_A.TEMP_VALUE)\t\t\t\t//20130403 HQ\n                    {\n                        if (MFL_PARA_A.TEMP_VALUE < (815 - 10 * 2))\n                        {\n                            HF_TEMP = (MFL_PARA_A.TEMP_VALUE + (MFL_PARA_A.TEMP_VALUE - MFL_PARA_A.Temp_Test_Min) * 10 / ((815 - 10 * 2) - MFL_PARA_A.Temp_Test_Min));\n\n                            MFL_PARA_A.TEMP_VALUE_DISPLAY = (MFL_PARA_A.TEMP_VALUE + (MFL_PARA_A.TEMP_VALUE - MFL_PARA_A.Temp_Test_Min) * 10 / ((815 - 10 * 2) - MFL_PARA_A.Temp_Test_Min));\n                            temp_dis_lcd (1, 5, MFL_PARA_A.TEMP_VALUE_DISPLAY);\n                            lcd_display_temp_space ();\n                            time_dis_lcd (2, 5, MFL_PARA_A.TIME);\n                            lcd_display_time_space ();\t\t      //��ʾ��ǰʱ��\n                        }",
                "line_count": 8456,
                "start_line": 1001,
                "end_line": 2000
              }
            }
          },
          "params": {
            "path": "main.c",
            "start_line": "1001",
            "end_line": "2000"
          }
        },
        {
          "id": "e1fcd789-70c2-4e7c-89aa-eb8f7059c06e",
          "type": "TEXT",
          "status": "success",
          "content": "我继续查看代码内容，让我读取更多内容来完整理解项目。\n\n",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        },
        {
          "id": "db7fe395-4750-455a-ada1-1fa16ce3a034",
          "type": "TOOL_CALL",
          "status": "success",
          "toolName": "read_file",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "workflowStatus": "success",
          "displayParams": {
            "path": "menu.h"
          },
          "displayResult": {
            "lineCount": 81,
            "readFile": {
              "path": "d:\\AUTOMFL\\Yuhong\\MFL_DYM\\src\\menu.h",
              "startLine": 1,
              "endLine": 81
            }
          },
          "workflowSnapshot": {
            "status": "success",
            "result": {
              "name": "read_file",
              "type": "tool_use",
              "params": {
                "path": "menu.h"
              },
              "success": true,
              "message": "",
              "code": 0,
              "result": {
                "content": "#ifndef MENU_H\n#define MENU_H\n\n////////////////////////////////////////////////////////////////\n//����\nvoid menu_display_clean (void);\n//��ʾ��ӭ����\nvoid menu_display_welcome (void);\n//���ܲ˵�����\nvoid menu_display_function (void);\n//��̲˵�����\nvoid menu_display_program (void);\n//��Ϣ�˵�����\nvoid menu_display_message (void);\n\n///////////////////////////////////////////////////////////////////////\n//���ҽ���\nvoid menu_display_manhui (void);\n//��ҽ���\nvoid menu_display_kuaihui (void);\n//���ٿ�ҽ���\nvoid menu_display_kuaihuib (void);\n//�ӷ�����\nvoid menu_display_huifa (void);\n//��ѡa����\nvoid menu_display_zixuan_a (void);\n//��ѡb����\nvoid menu_display_zixuan_b (void);\n//У׼����\nvoid menu_display_calibration (void);\n\n///////////////////////////////////////////////////////////////////////\n//���ò˵���ѡ�����ý���\nvoid menu_display_program_a_user (void);\n//���ò˵���ѡ�����ý���\nvoid menu_display_program_b_user (void);\n//����궨ϵ������\nvoid menu_display_program_parameter (void);\n//���ò˵�����ϵ�����ý���\nvoid menu_display_program_pid (void);\n//���ò˵��û��������ý���\nvoid menu_display_program_user (void);\n//���ò˵�ϵͳ�������ý���\nvoid menu_display_program_system (void);\n//���ò˵��������ý���\nvoid menu_display_program_password (void);\n//���ò˵�����ѯ�ʽ���\nvoid menu_display_program_save (void);\n\n//��ʾDEBUG\nvoid menu_display_debug (void);\n//��ʾ�ָ���������\nvoid menu_display_reset (void);\n//ԤԼ��������\nvoid menu_display_reservation (void);\n\n///////////////////////////////////////////////////////////////////////\n//ʱ�Ӷ�ȡ\nu8 pcf8563_read_time (u8 addr, u8 num, u8 *p);\n//ʱ��д��\nu8 pcf8563_write_time (u8 addr, u8 num, u8 *p);\n\n//��ַΪ�ֽڣ�24C64Ϊ32���ֽ�һ��ҳ����Ҫ��Ҫ��ҳ\nu8 eeprom_24c64_write (u16 addr, u8 num, u8 *p);\n//��ַΪ�ֽڣ�24C64Ϊ32���ֽ�һ��ҳ����Ҫ��Ҫ��ҳ\nu8 eeprom_24c64_read (u16 addr, u8 num, u8 *p);\n\nvoid iic1_start (void);\nvoid iic1_stop (void);\nu8 iic1_write_byte (u8 data);  //����Ӧ���ź�ACK\nu8 iic1_read_byte (u8 ack);\n\n//��ַΪ�ֽڣ�24C64Ϊ32���ֽ�һ��ҳ����Ҫ��Ҫ��ҳ\nu8 eeprom_24c64_read_byte (u16 addr);\n//��ַΪ�ֽڣ�24C64Ϊ32���ֽ�һ��ҳ����Ҫ��Ҫ��ҳ\nu8 eeprom_24c64_write_byte (u16 addr, u8 data);\n\n\n\n#endif\n",
                "line_count": 81,
                "start_line": 1,
                "end_line": 81
              }
            }
          },
          "params": {
            "path": "menu.h"
          }
        },
        {
          "id": "4eecefd3-e6f1-4700-8d33-4180959ae0b4",
          "type": "TEXT",
          "status": "success",
          "content": "让我继续查看其他关键文件来理解项目。我需要查看FUZZY.h来了解模糊控制相关的实现。\n\n",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        },
        {
          "id": "6cc212d2-2946-4430-b1d8-31a11d3eaa19",
          "type": "TOOL_CALL",
          "status": "success",
          "toolName": "read_file",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "workflowStatus": "success",
          "displayParams": {
            "path": "FUZZY.H"
          },
          "displayResult": {
            "lineCount": 109,
            "readFile": {
              "path": "d:\\AUTOMFL\\Yuhong\\MFL_DYM\\src\\FUZZY.H",
              "startLine": 1,
              "endLine": 109
            }
          },
          "workflowSnapshot": {
            "status": "success",
            "result": {
              "name": "read_file",
              "type": "tool_use",
              "params": {
                "path": "FUZZY.H"
              },
              "success": true,
              "message": "",
              "code": 0,
              "result": {
                "content": "#ifndef _FUZZY_H_\n#define _FUZZY_H_\n#include \"stdint.h\"\n\n#define VOL_REF 2480\n#define DAC_OUT(x)\t((((u32)x)*4095)/VOL_REF)\n#define DAC_OUT_1(x) (DAC->DHR12R1=DAC_OUT(x))\n#define DAC_OUT_2(x) (DAC->DHR12R2=DAC_OUT(x))\n//�������޴����ǣ�ֱ�Ӷ�DHR12Rx�Ĵ���дֵ���������������DORx\t!!!\n//DAC�����ʱʧ����ѹ50mV,51mV\n\n#define STOVE_A 0\n#define STOVE_B 1\n\n#define\tPWM_SCAN\t\t2000L\n#define PWM_PERIOD      0xFF\n#define PWM_PITCED\t\t0x00\n\n#define\tKU40\t   40\t    //40��/min,u=[-60uS��+60uS]\n#define\tKU35\t   35\t    //35��/min,u=[-54uS��+54uS]\n#define\tKU30\t   30\t    //30��/min,u=[-48uS��+48uS]\n#define\tKU25\t   25\t    //25��/min,u=[-42uS��+42uS]\n#define\tKU20\t   20\t    //20��/min,u=[-36uS��+36uS]\n#define\tKU15\t   15\t    //15��/min,u=[-30uS��+30uS]\n#define\tKU10\t   10\t    //10��/min,u=[-24uS��+24uS]\n\n/***********************************************************************************\n�����ϵ\n    K���ȵ�ż�����:\n\t0��--0mV,918��--38.042mV\n    CS1242:\n\tLSB Weight=Full\tScaleRage/2^24=2*Vref/PGA/2^24=5/128/2^24=1250/2^24\n    mV��=1250*AD����/2^24\n    �����¶ȴ�Լ�������ȵ�żΪ���ԣ�C=918/38.042*1250/2^24*AD����\n    1���AD=2^24*38.042/918/1250=536\n    0.1��=54\n************************************************************************************/\n#define\tKC\t54L\n//#define\tMAX_TEMP 10000               //����¯���1000�汣��\n#define\tMAX_TEMP 12500               //����¯���1250�汣�� DYM20250618\n#define INTEGRALSWITCH 50L\n//100 ���¿������� ECSUM -24        //���\t\t   \t���¶�\n//        �������� ECSUM -48\n//500 ���¿������� ECSUM -24        //���\t\t   \t���¶�\n//        �������� ECSUM -100\nvoid InitFuzzy(void);\nvoid TaskFuzzy(void);\nvoid CtrlStove(u8 cOpen, long lDefTemp, u8 cRate);\n\n#define MIN_STABLE_CNT 15\ntypedef  struct\n{\n    u16 iStableCnt;\n    u16 iDestTemp;\n    u32 integral;\n} StableTempTab;\n\n#define ERRORCNT  9\t\t\t//����¼\n#define DERRORCNT 10\t\t//���仯�ʼ�¼\n\ntypedef struct\n{\n    long gDest;  \t\t\t//Ŀ���¶�ֵ,0.1��ֱ���\n    long CTEMP;\t\t\t\t//��ʼ�����¶�\n\n    long Error[ERRORCNT];\t\t\t//ƫ��\n    long dErr[DERRORCNT] ;\t\t\t//ƫ��仯��\n    long ECSUM;\t\t\t\t//10S�ڵ�ƫ��仯��֮��\n    long SumErrLimit \t; \t//���ȳ�ֵ\n\n    long PreviewOut;\n    long HFDownTemp ;\n    long du;\n    unsigned int temp_out;//�¶����ֵ\n    unsigned int PID_SET;\n    long DoorOpenValue;\t//����¯����״̬\n    char LowSpeedCnt;\n    unsigned int cur_Temp;//��ǰ�¶�ֵ\n\n    unsigned int  iDestTemp;\t//Ŀ���¶�ֵ\n    unsigned int  iStableCnt;\t//����ȶ�����\n    unsigned int  iPreStabCnt;\t//������ȶ�����\n\n    unsigned int TIME_NUM;\n    unsigned int TIME_FLAG;\n\n    unsigned int PWM_TIME_NUM;\n    unsigned int PWM_TIME_FLAG;\n\n    unsigned int PID_SET_ALL;\n    unsigned int PID_SET_FLAG;\n    unsigned int PID_TEST_STATUS;\n\n    unsigned int PWM_STATUS;\n    unsigned int PWM_STATUS_FLAG;\n} AI_CONTROL;\n\n//extern AI_CONTROL Ai_CTRL;\n\n\nvoid SaveStable(StableTempTab *psTmpTab);\nvoid LoadStable(u16 iTemp, StableTempTab *psTmpTab);\n\nvoid saveHFDownTemp (u8 temp);\nu8 readHFDownTemp (void);\n\n#endif\n\n",
                "line_count": 109,
                "start_line": 1,
                "end_line": 109
              }
            }
          },
          "params": {
            "path": "FUZZY.H"
          }
        },
        {
          "id": "19e8c8e0-0f84-437e-9405-3f5e6ffcccc9",
          "type": "TEXT",
          "status": "success",
          "content": "基于对代码的分析，我来总结这个项目的主要内容：\n\n**1. 业务目标**\n这是一个热处理炉温控系统，主要用于控制和管理工业炉温，实现精确的温度控制和多种加热工艺。\n\n**2. 核心功能**\n1. 温度控制\n   - 精确温度控制（支持到0.1°C的精度）\n   - PID自动调节\n   - 模糊控制算法实现\n   - 防过热保护机制\n\n2. 加热工艺管理\n   - 慢回火(MANHUI)\n   - 快回火(KUAIHUI) \n   - 淬火回火(HUIFA)\n   - 自选程序(ZIXUAN)\n   - 炉温校准功能\n\n3. 人机交互\n   - LCD显示界面(ST7920)\n   - 按键控制\n   - 菜单系统\n   - 实时温度显示\n\n4. 安全监控\n   - 电压监测\n   - 电流监测\n   - 过温保护\n   - 热电偶故障检测\n\n**3. 整体架构**\n\n1. 硬件层\n   - STM32F10x微控制器\n   - ADS1220温度采集模块\n   - LCD显示模块(ST7920)\n   - 按键模块\n   - 电源控制模块\n\n2. 驱动层\n   - GPIO控制\n   - SPI通信\n   - I2C通信\n   - UART通信\n   - ADC采样\n\n3. 控制层\n   - PID控制算法\n   - 模糊控制算法\n   - 温度补偿算法\n   - 工艺流程控制\n\n4. 应用层\n   - 菜单管理\n   - 工艺参数设置\n   - 数据存储\n   - 状态监控\n\n**4. 数据实体**\n1. MFL_PARA结构体：炉温参数\n   - 温度数据\n   - 时间参数\n   - PID参数\n   - 系统配置\n   - 工艺参数\n\n2. AI_CONTROL结构体：智能控制参数\n   - 目标温度\n   - 误差记录\n   - PID输出\n   - 稳定性参数\n\n**5. 业务流程**\n1. 初始化流程\n   - 系统参数初始化\n   - 外设初始化\n   - 控制参数初始化\n\n2. 温度控制流程\n   - 温度采集\n   - PID计算\n   - 输出控制\n   - 状态监控\n\n3. 工艺流程\n   - 慢回火：500℃和815℃两个阶段\n   - 快回火：850℃单阶段\n   - 淬火回火：多温度阶段控制\n   - 自定义：可编程温度曲线\n\n4. 安全保护流程\n   - 温度超限检测\n   - 电压电流监控\n   - 故障报警处理\n   - 安全停机控制\n\n这是一个完整的工业控制系统，集成了温度控制、工艺管理、人机交互和安全保护等功能，适用于工业热处理炉的精确温度控制应用。",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        }
      ]
    },
    {
      "id": "43135152",
      "role": "user",
      "status": "success",
      "content": "给出代码重构建议",
      "payload": {
        "query": "给出代码重构建议",
        "knowledgeList": [
          {
            "id": "FUZZY.C",
            "name": "FUZZY.C",
            "type": "FILE"
          }
        ]
      },
      "context": {
        "conversationId": 16960096
      }
    },
    {
      "id": "4911f7b4-508f-42bf-b1c9-cf224ad8966b",
      "userMessageId": "43135152",
      "role": "assistant",
      "status": "completed",
      "content": {},
      "elements": [
        {
          "id": "0a928890-08de-43e5-8dfe-d10794259940",
          "type": "TEXT",
          "status": "success",
          "content": "让我查看 [FUZZY.C](FUZZY.C) 的内容来进行分析和重构建议。\n\n",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        },
        {
          "id": "489f6cc8-e586-44d3-9a10-3a92ced28248",
          "type": "TOOL_CALL",
          "status": "success",
          "toolName": "read_file",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "workflowStatus": "success",
          "displayParams": {
            "path": "FUZZY.C"
          },
          "displayResult": {
            "lineCount": 301,
            "readFile": {
              "path": "d:\\AUTOMFL\\Yuhong\\MFL_DYM\\src\\FUZZY.C",
              "startLine": 1,
              "endLine": 301
            }
          },
          "workflowSnapshot": {
            "status": "success",
            "result": {
              "name": "read_file",
              "type": "tool_use",
              "params": {
                "path": "FUZZY.C"
              },
              "success": true,
              "message": "",
              "code": 0,
              "result": {
                "content": "/******************************************************************************\n\tFILE:       FUZZY.C\n\tPOPURSE:\n\tWRITER:\n\tDATE:       2007.03.08\n******************************************************************************/\n#include \"STM32Lib\\\\stm32f10x.h\"\n#include \"main.h\"\n#include \"fuzzy.h\"\n//#include <math.h>\n//#include \"temperature_table.h\"\n#include \"MENU.h\"\n\nStableTempTab tabTmp;\n\n//#define DOOROPENSPEED  -15L\t//����ʱ�������ٶ�,������ڴ��¶�,��Ϊ����˿��������ȫɢ���������߿�������\nlong DOOROPENSPEED = -15L;\n#define MAXNEGINTERG   (-200L*KI/Ki)\n//extern const u16 k_table[];\n\n#define  Kp\t\t15           \t\t//�������u��������\n#define  Ki\t\t10 \t\t\t\t//˥��ϵ��;\t\t    \n#define  KI\t\t15\n\n//Kp ��С��ʱ�� kiҪ���\nextern AI_CONTROL Ai_CTRL;\n\nextern MFL_PARA MFL_PARA_A;\n\nextern u8 FLASH_DATA_TEMP[528];\n\nvoid TaskFuzzy(void)\n{\n    char cnt;\n\n    if(Ai_CTRL.cur_Temp > MAX_TEMP)        \t\t\t //���±���\n    {\n        Ai_CTRL.temp_out = PWM_PITCED;\n        Ai_CTRL.PreviewOut = 0;\n        return ;\n    }\n    //��ƫ��\n    for(cnt = ERRORCNT - 1; cnt > 0; cnt--)\n    {\n        Ai_CTRL.Error[cnt]\t= Ai_CTRL.Error[cnt - 1];\n    }                    //�����ϴ�ƫ��ֵ\n    Ai_CTRL.Error[0]\t= (long)((Ai_CTRL.gDest - Ai_CTRL.cur_Temp));\n\n    for(cnt = DERRORCNT - 1; cnt > 0; cnt--)\n    {\n        Ai_CTRL.dErr[cnt]\t= Ai_CTRL.dErr[cnt - 1];\n    }                  \t//�����ϴ�ƫ����ֵ\n    Ai_CTRL.dErr[0] \t= Ai_CTRL.Error[0] - Ai_CTRL.Error[1];\t\t\t\t\t\t\t\t\t\t\t\t\t\t//����ƫ��仯��\n    Ai_CTRL.ECSUM  \t\t= Ai_CTRL.dErr[0] + Ai_CTRL.dErr[1] + Ai_CTRL.dErr[2] + Ai_CTRL.dErr[3] + Ai_CTRL.dErr[4];\t//10s����������\t  =iol\n\n    if(Ai_CTRL.Error[0] < Ai_CTRL.CTEMP)\n    {\n        if((Ai_CTRL.ECSUM > DOOROPENSPEED) && (Ai_CTRL.CTEMP > INTEGRALSWITCH) && (Ai_CTRL.ECSUM < 0) && (Ai_CTRL.LowSpeedCnt++ > 2))\t\t\t //��������60S�����ٶ���,����,���ٿ��Ʒ�Χ\n        {\n            //�����ٶ�\t����\t���� 1.6/10s\n            //�����ٶ�������2s*60��\n            //�¶����������һ�ε���ط�Χ\n            //���ǳ���¯��\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\t//ECSUM >0����\n            if(Ai_CTRL.gDest > 2500)\t\t\t//250��\n            {\n                Ai_CTRL.CTEMP /= 2;\n                DOOROPENSPEED = -10L;\n            }\n            else\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//Ŀ���¶ȹ���,����ı���ص����׳���\n            {\n                Ai_CTRL.CTEMP -= 20;\t\t\t\t\t\t\t\t\t\t\t\t//��ص����2��\n                DOOROPENSPEED = -5L;\n            }\n\n            Ai_CTRL.LowSpeedCnt = 0;\n\n            if(Ai_CTRL.CTEMP < INTEGRALSWITCH)\n                Ai_CTRL.CTEMP = INTEGRALSWITCH;\n        }\n\n        if(((Ai_CTRL.Error[0]*Ai_CTRL.dErr[0]) > 0) || ((Ai_CTRL.Error[0] == 0) && ( Ai_CTRL.dErr[0] != 0))) //���������\n        {\n            Ai_CTRL.SumErrLimit += Ai_CTRL.Error[0]; \t\t\t\t\t//������ʱ��,�����\n            if(Ai_CTRL.SumErrLimit < MAXNEGINTERG)\t\t\t\t\t\t//�޷�,��������������ֵ, ����Ϊ�������ֵ\n                Ai_CTRL.SumErrLimit = MAXNEGINTERG;\n            ////////////////////////////////////////////////////////////\n            Ai_CTRL.du = Ai_CTRL.Error[0] * Kp + Ai_CTRL.SumErrLimit * Ki / KI * Kp;\t  \t//��������ģʽ\t                         //\n        }\n        else              \t\t\t\t\t\t\t\t//��������ģʽ\n        {\n            if(((Ai_CTRL.Error[0]*Ai_CTRL.dErr[0]) < 0) || (Ai_CTRL.dErr[0] == 0))\t\t\t\t  \t//����С�����\n            {\n                Ai_CTRL.du =  Ai_CTRL.SumErrLimit * Ki / KI * Kp;\n            }\n            else\n            {\n                Ai_CTRL.du = Ai_CTRL.PreviewOut;\n            }\n        }\n    }\n    else\n        Ai_CTRL.du = PWM_PERIOD;    //����\n\n\n    if((Ai_CTRL.dErr[0] > 20) && (Ai_CTRL.Error[0] < Ai_CTRL.HFDownTemp))\t\t//�����ٶȺܿ�,�϶��ǿ�¯��,�����ʱ����,��ʱ��Ҫȫ���������ֹ����\n        Ai_CTRL.du = 0;\t\t \t\t\t\t\t\t\t\t\t\t\t//������HFDownTemp/10�Ⱦ��Բ�����\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/*-----����̫��,Ӧ������-------*/\n\n    if((Ai_CTRL.Error[0] < Ai_CTRL.HFDownTemp / 2) && (Ai_CTRL.ECSUM < (-20 + Ai_CTRL.gDest / 10 / 100)) || (Ai_CTRL.Error[0] < -15))\t\t\t\t\t\t\t\t\t//����1.5�ر�            //�رչ�������\n    {\n        Ai_CTRL.du = 0;\n    }\n    if(Ai_CTRL.du < 0) Ai_CTRL.du = 0;\n    if(Ai_CTRL.du > PWM_PERIOD) Ai_CTRL.du = PWM_PERIOD;\n    Ai_CTRL.temp_out = (unsigned int)Ai_CTRL.du;\n    //����ֵ������ȶ�������±���\n    if((Ai_CTRL.PreviewOut == Ai_CTRL.du) && (Ai_CTRL.du != 0xFF) && ((Ai_CTRL.du != 0)))\n    {\n        //�������� ��������ȶ�,����\t ��Ϊ���ȶ���\n        //�����ݶ����Ƚ�, �Ƚ��ȶ�����,����˴��ȶ�����\t�����ϴε��ȶ�����,���豣��\n        //printf(\"Ai_CTRL.iStableCnt = %d ,Ai_CTRL.iPreStabCnt =%d \\n\",Ai_CTRL.iStableCnt,Ai_CTRL.iPreStabCnt);\n        if((Ai_CTRL.iStableCnt++ > Ai_CTRL.iPreStabCnt) && (Ai_CTRL.iStableCnt < 0x7FF))\n        {\n            //StableTempTab tabTmp;\n            tabTmp.iStableCnt = Ai_CTRL.iStableCnt;\n            tabTmp.iDestTemp  = Ai_CTRL.iDestTemp / 100 * 100; //\n            tabTmp.integral   = Ai_CTRL.SumErrLimit;\n            SaveStable(&tabTmp);\n            Ai_CTRL.iPreStabCnt = Ai_CTRL.iStableCnt + 5;\n        }\n    }\n    else\n    {\n        Ai_CTRL.iStableCnt = 0;\n    }\n    Ai_CTRL.PreviewOut = Ai_CTRL.du;\n\n}\n//functions prototype\n/************************************************************************\n�������ܿ�����//Humanoid Intelligent Controller\n************************************************************************/\n\n/*******************************************************************\n    ģ���������ݱ���\n********************************************************************/\nvoid InitFuzzy(void)\n{\n    Ai_CTRL.DoorOpenValue = 0 ;//  ����ͳ�������ٶ�\n    Ai_CTRL.LowSpeedCnt = 0;\n    Ai_CTRL.du = 0;\n}\n\n/*********************************************************************\n    ��������¯\n**********************************************************************/\nvoid CtrlStove(u8 cOpen, long lDefTemp, u8 cRate)\n{\n    StableTempTab  psTmpTab;\n    u8 temp;\n\n    //ֹͣ\n    InitFuzzy();\n    //Ai_CTRL.HFDownTemp=HUIFA_900_QIKONG*10;\n    if(cOpen)       //����\n    {\n        Ai_CTRL.gDest = lDefTemp * 10;  //�� Ŀ�� �¶�ֵ ת�� Ϊ\n        LoadStable(lDefTemp, &psTmpTab);   //�����Ƿ���Ҫ����10 ��\n        if((psTmpTab.iDestTemp / 100) == (lDefTemp / 100))  //�Ѿ���������ֱ�\n        {\n            Ai_CTRL.SumErrLimit  = psTmpTab.integral;                                    //���ر���Ļ�������\n            Ai_CTRL.iPreStabCnt     = psTmpTab.iStableCnt;\n            Ai_CTRL.iDestTemp     = lDefTemp;\n        }\n        else                                    //δ����.\n        {\n            Ai_CTRL.SumErrLimit  = -(1010 - lDefTemp) / 10 * KI * 2;                      //�۵�(1010-lDefTemp)/10������ ;\n            Ai_CTRL.iPreStabCnt     = 10;\n            Ai_CTRL.iDestTemp     = lDefTemp;\n        }\n        //\n        Ai_CTRL.iStableCnt = 0;\n        Ai_CTRL.CTEMP = (1010 - lDefTemp) ;                                            //XC20121108 ���ڿ��·�Χ\n        temp = readHFDownTemp();\n\n        if((temp == 0) || (temp == 0xFF))                  //���ó�ʼֵ\n        {\n            //Ai_CTRL.HFDownTemp = 1000;\n            //Ai_CTRL.HFDownTemp = 600;\n\n            //Ai_CTRL.HFDownTemp=HUIFA_900_QIKONG*10;\n\n            Ai_CTRL.HFDownTemp = 1000;\n\n            saveHFDownTemp (Ai_CTRL.HFDownTemp / 10);\n        }\n        else\n            Ai_CTRL.HFDownTemp = (long)temp * 10;    }\n    else\n    {\n        Ai_CTRL.gDest = 0;\n        Ai_CTRL.temp_out = 0;\n    }\n}\n\nvoid SaveStable(StableTempTab *psTmpTab)\n{\n    u16 n, temp;\n    u8 eeprom_data_temp[32];    //M24C64Ϊ32���ֽ�һ��page\n\n    temp = psTmpTab->iDestTemp / 100;\n    if (temp > 199)\n        temp = 199;\n    temp += TEMP_TABLE_BASE;\n    temp <<= 5;\n\n    n = 0;\n    eeprom_data_temp[n++] = psTmpTab->iStableCnt >> 8;\n    eeprom_data_temp[n++] = psTmpTab->iStableCnt;\n\n    eeprom_data_temp[n++] = psTmpTab->iDestTemp >> 8;\n    eeprom_data_temp[n++] = psTmpTab->iDestTemp;\n\n    eeprom_data_temp[n++] = psTmpTab->integral >> 24;\n    eeprom_data_temp[n++] = psTmpTab->integral >> 16;\n    eeprom_data_temp[n++] = psTmpTab->integral >> 8;\n    eeprom_data_temp[n++] = psTmpTab->integral;\n\n    eeprom_data_temp[31] = DATA_SET_FLAG;\n\n    eeprom_24c64_write (temp, 32, eeprom_data_temp);\n}\n\nvoid LoadStable(u16 iTemp, StableTempTab *psTmpTab)\n{\n    u16 n, temp;\n    u8 eeprom_data_temp[32];    //M24C64Ϊ32���ֽ�һ��page\n\n    temp = iTemp / 100;\n    if (temp > 199)\n        temp = 199;\n    temp += TEMP_TABLE_BASE;\n    temp <<= 5;\n\n    eeprom_24c64_read (temp, 32, eeprom_data_temp);\n\n    n = 0;\n    psTmpTab->iStableCnt = eeprom_data_temp[n++];\n    psTmpTab->iStableCnt <<= 8;\n    psTmpTab->iStableCnt += eeprom_data_temp[n++];\n\n    psTmpTab->iDestTemp = eeprom_data_temp[n++];\n    psTmpTab->iDestTemp <<= 8;\n    psTmpTab->iDestTemp += eeprom_data_temp[n++];\n\n    psTmpTab->integral = eeprom_data_temp[n++];\n    psTmpTab->integral <<= 8;\n    psTmpTab->integral += eeprom_data_temp[n++];\n    psTmpTab->integral <<= 8;\n    psTmpTab->integral += eeprom_data_temp[n++];\n    psTmpTab->integral <<= 8;\n    psTmpTab->integral += eeprom_data_temp[n++];\n}\n\n//\nu8 readHFDownTemp (void)\n{\n    u16 n;\n    u8 eeprom_data_temp[32];    //M24C64Ϊ32���ֽ�һ��page\n\n    //n=HFDownTemp_BASE;\n    //n<<=5;\n\n    n = HUIFA_TEMP_DROP_ADD;\n    eeprom_24c64_read (n, 2, eeprom_data_temp);\n\n    if (eeprom_data_temp[0] == 0)\n        return eeprom_data_temp[1];\n    else\n        return 100;\n}\n\n//\nvoid saveHFDownTemp (u8 temp)\n{\n    u16 n;\n    u8 eeprom_data_temp[32];    //M24C64Ϊ32���ֽ�һ��page\n\n    /*eeprom_data_temp[0]=temp;\n    eeprom_data_temp[31]=DATA_SET_FLAG;\n    n=HFDownTemp_BASE;\n    n<<=5;\n    eeprom_24c64_write (n,32,eeprom_data_temp);*/\n\n\n    eeprom_data_temp[0] = 0;\n    eeprom_data_temp[1] = temp;\n    n = HUIFA_TEMP_DROP_ADD;\n    n <<= 5;\n    eeprom_24c64_write (n, 2, eeprom_data_temp);\n}\n",
                "line_count": 301,
                "start_line": 1,
                "end_line": 301
              }
            }
          },
          "params": {
            "path": "FUZZY.C"
          }
        },
        {
          "id": "94077820-7fcc-4da0-997a-6e136859714c",
          "type": "TEXT",
          "status": "success",
          "content": "基于对 [FUZZY.C](FUZZY.C) 的分析，我提出以下重构建议：\n\n1. **模块化拆分**\n```c\n// 建议将代码拆分为以下模块：\n|- fuzzy/\n   |- fuzzy_control.c    // 模糊控制核心算法\n   |- fuzzy_config.c     // 控制参数配置\n   |- fuzzy_storage.c    // 数据存储相关\n   |- fuzzy_utils.c      // 工具函数\n   |- include/\n      |- fuzzy_control.h\n      |- fuzzy_config.h \n      |- fuzzy_storage.h\n      |- fuzzy_utils.h\n```\n\n2. **参数配置优化**\n```c\n// 将硬编码的参数改为配置文件管理\ntypedef struct {\n    int kp;              // 比例系数\n    int ki;              // 积分系数\n    int door_open_speed; // 开门速度\n    int max_neg_interg;  // 最大负积分\n    int integral_switch; // 积分切换点\n    // ... 其他参数\n} FuzzyConfig;\n\n// 使用配置结构体\nextern FuzzyConfig g_fuzzy_config;\n```\n\n3. **错误处理机制**\n```c\n// 添加错误处理\ntypedef enum {\n    FUZZY_OK = 0,\n    FUZZY_ERR_PARAM,\n    FUZZY_ERR_TEMP_OVER,\n    FUZZY_ERR_STORAGE,\n    // ... 其他错误类型\n} F基于uzzyError对FUZZY;\n\nF.uzzyError fuzzy_controlC的分析，我提出以下重构_init(void);\nF建uzzyError fuzzy_control_process议：(void);\n\n1. **模块化拆分**\n```\n\n4. **状态机优化**\n```c\n// 使用状态机管理控制流程\n```c\n// 建议将代码\ntypedef enum拆分为以下几个模块: {\n    FUZZY_STATE_INIT,\n    FUZZY_STATE_NORMAL\n|- fuzzy/\n   |-|- fuz,\n    FUZZY_STA fuzzy_control.c    /TE_DOOR_OPEN,/ 模糊控制核心算法\n   |- fuzzy_storage.c    // 数据存储相关\n   |- fuzzy_\n    FUZZY_STATE_PROTECTION,\n    FUZZY_STATE_ERRORconfig.h     // 配置参数\n   |- fuz\n} FuzzyState;\n\n// 状态处理函数\ntypedef FuzzyError (*StateHandler)(void);\n```\n\n5. **数据存储优化**\n```c\n// 优化存储接口\ntypedef structzy_types.h      // 类型定义\n   |- fuzzy.h           // 对外接口\n```\n\n2. **改进数据结构** {\n    StorageOps* ops;  \n```c\n// 定义清晰的配置结构体\ntypedef struct {\n    int32_t kp;           // 存储操作接口\n    uint16_t base_addr;\n    uint16_t page_size;// 比例系数\n    int32_t ki;           // 积分系数\n    int32_t door\n} StorageConfig;\n\n// 存储操作接口_speed;   // 开门速度\n    int32_t max\ntypedef struct {\n    int (*read)(uint16_t addr, uint8_t* buf, uint16_t len);\n    int (*write)(uint16_t addr_temp;     // 最大温度\n} FuzzyConfig;\n\n// 定义状态结构体\ntypedef struct {\n    int32_t current_temp;  // 当前温度\n    int32_t target_temp;, const uint8_t* buf, uint16_t len);\n    int (*erase)(uint16_t addr, uint16_t len);\n} Storage   // 目标温度Ops;\n```\n\n6. **安全性增强**\n```c\n// \n    int32_t errort errors添加参数有效性检查s[ERROR_COUNT]; // 误\nstatic inline差历史\n    int32_t output;         bool is_temp_valid(int temp) {\n    return (temp >= MIN_TEMP &&// 输出值\n} FuzzyState;\n```\n\n3. **优化核心算法**\n```c\n// 将TaskFuzzy拆分为多个功能明 temp <= MAX_TEMP);\n}\n\n// 添加CRC校验\nuint确的子函32_t calc_data_crc(数\nvoid fuzzy_calculate_error(FuzzyState *state);\nvoid fuzzy_update_integral(FuzzyState *state);\nvoid fuzzyconst uint8_t* data, uint16_t len);\nbool verify_data_crc(const uint8_t* data, uint16_t len);\n```\n\n7_calculate_output(FuzzyState *state, const FuzzyConfig *config);\nvoid fuzzy_apply_limits(FuzzyState *state);. **性能优化**\n```c\n// 优化计算密\n```\n\n4. **改进错误处理**集型操作\nstatic inline int\n```c32_t calc_pid_output(int32_t error, int32_t\n// 添加错误处理机制\ntypedef integral) {\n    // 使用定点数运 enum算代 {\n    FUZZY_OK = 0,\n    FUZ替浮点运算\n算\n    returnZY_ERROR    return (error * g_fuzzy__config.kpTEMP_ + EXCEEDED,\n    FUZZY_ERROR\n            integral * g_fuzzy_conntegral * g_fuzzy_con *_INVALIDfig.ki /_PARAM,\n    FUZZY_ERROR_STORAGE\n} FuzzyError g_fuzzy_;\n\nFconfig.KI * g_fuzzyuzzyError fuzzy_control__config.kp) >> \n            step(FuzzyFIXED_POINTState *state, const FuzzyConfig *config);\n`\n```_SHIFT;\n}\n```\n\n8.`` **调试功\n\n5. **存能增储机制优化**\n```强**\n```c\n// 添加调试接c\n// 口\n#定ifdef义统 口\ntypedef structENABL口\ntypedef structENABLstructE\ntypedef struct {\n    uint {\n    bool32_t error (*save_)(uint16count;\n    uint32_t protection_t addr,_count; const void *data, size_t size);\n    bool (*load)(uin, void *data\n    uint, void *data\n    uinta32_t door_open_count;\n    float avg, size_t size);\n}_temp_error;\n    // ... 其他调试信息\n} FuzzyDebugInfo;\n\nvoid fuzzy_get StorageOps;\n\n// 改进存储相关函数\nbool fuz_debug_infozy_save_stable(FuzzyDebugInfo* info);\n#endif\n```\n\n9. **注释和文档完善**\n```c\n/**\n * @(const StorageOps *ops, const StableTempTab *data);\nbool fuzbrief 模zy_load_糊控制stable(const StorageOps *ops, uint任务处理函数16_t temp\n * @param, StableT NoneempTab *data\n * @);\n```\n\n6. **参数配return FuzzyError 置优处理结果化**\n```\n *c\n// 将 @note 该函数需要每10ms调用一次\n */\nFuzzyError fuzzy_control_process(void) {\n    //硬编码的参数移到配置文件\n# ... 实现代码\n}\n```\n\n10. **测试用例补充**\n```c\n// 添加单元测试\nvoid test_fuzzy_control(void) {\n    // 初始化测试\n    TEST_ASSERT(fuzzy_control_init() == FUZZY_OK);\n    \n    // 正常控制测试\n    TEST_ASSERT(test_normal_control() == FUZZY_OK);\n    \n    // 异常处理测试\n    TEST_ASSERT(test_error_handling() == FUZZY_OK);\n    \n    // 边界条件测试\n    TEST_ASSERT(test_boundary_conditions() == FUZdefine FUZZY_CONFIG_DEFAULT {   \\\n    .kp = 15,                   \\\n    .ki = 10,                   \\\n    .door_speed = -15,          \\\n    .max_temp = 12500           \\\n}\n```\n\n7. **接口优化**\n```c\n// 简化对外接口\ntypedefZY_OK); struct F\n}uzzyController F\n```\n\n这些重构建议主uzzyController;\n\nFuzzyController* fuzzy_create(const FuzzyConfig *config);\nvoid fuzzy_destroy(Fuzz(Fuzzy要针对：yController *ctrl);\nF\n1. 提高代码的可维uzzyError fuzzy_control(FuzzyController *ctrl,护性和可 float current_temp);\n```\n\n8. **注读性\n2. 增强系释和文档改进**\n```c\n/**统的稳定性和可靠性\n3. 优化性\n * @brief 执行一次模糊控制计算\n * \n * @param ctrl 控制器实例\n * @param current_temp 当前温度\n * @return F能和资源利用\n4. 提供uzzyError 执行结果\n * \n * @note 该函数应该在固定时间间隔内调用\n */\nFuzzyError fuzzy_control(更好的调试和测试支持\n5. 增强代码码的可FuzzyController *c的可扩展性\n\n建trl, float current_temp);\n```\n\n9. **测试友好性**议分阶段实施重构，每个阶段后进行充\n```c\n// 添加测试接口\n#ifdef FUZ分测试，确保系统ZY_TEST\nvoid fuzzy_get_debug稳定性。优_info(const FuzzyController先级建议：\n1. 参数配置优化和 *ctrl, FuzzyDebugInfo *info);\nvoi错误处理 (d fuzzy_set_m_mock高ock)\n2. _temp(FuzzyController *ctrl, float temp);\n#endif模块\n```\n\n10. **安化全性改进**\n```拆分 (高c\n// 添加参数验证\nstatic bool)\n3. 安全性增强 fuzzy_validate_config(const FuzzyConfig *config) {\n    if (! (高)\n4. 状态机优化config) return false;\n    if (config->kp <= 0 || config-> config->ki ",
          "composer": {
            "markdown": "",
            "tasks": []
          },
          "isErrorMessage": false
        }
      ]
    }
  ],
  "title": "介绍项目的业务目标、核心功能、整体架构、数据实体、业务流程",
  "ctime": 1751117572950,
  "utime": 1751117720793,
  "workspaceDirectory": "d:\\AUTOMFL\\Yuhong\\MFL_DYM\\src"
}