b18d9c84bf
펌웨어(SOURCE/HECO2/User): - My_Hood.c: 후드 전원 OFF 시 쾌적조리 토글 자동 해제 (6) - My_RJ2.c/My_Homenet.c/My_define.h: 룸컨 전용 pending(RoomCtrl_Push) 도입 → 전원 ON 간헐 미동작·전원 OFF 후 룸컨 옛모드(공청) 표시 해소 (11)(12) (공유 Command_request_type 레이스 + 716 equalize 조기클리어 + 분배기 wipe 회피) 대시보드(TestProgram/PCDashBoard): - 쾌적조리 미선택+후드 ON 시 다른 시나리오 버튼 선택 가능 (7) - 시나리오 버튼 항상 선택 가능 + 상호배타 로직 삭제 (8)(9) - 데모 루틴 전체 삭제 (DemoStatus.cs 포함) (9) - 전원 OFF 시 풍량 버튼(0 포함) 비활성 (13) - 그래프 DB(HERV_Log.db)를 임시폴더가 아닌 exe 폴더에 저장 (14) 문서/메모리: doc/260618_*.md 정리, command-request-type-shared-race 메모리 추가 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
251 lines
7.6 KiB
C
251 lines
7.6 KiB
C
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#include "Nano100Series.h"
|
|
#include "adc.h"
|
|
#include "gpio.h"
|
|
#include "pwm.h"
|
|
#include "timer.h"
|
|
#include "uart.h"
|
|
#include "sys.h"
|
|
#include "clk.h"
|
|
|
|
#include "My_define.h"
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////// HOOD 485 //////////////////////////////////////////////
|
|
extern uint16_t Hood_polling_timer;
|
|
extern uint8_t rx_hood_485_TimeOut;
|
|
uint8_t Tx_Hood_Buff[20], Rx_Hood_Buff[20];
|
|
uint8_t Yeungong_Status = 0;
|
|
uint8_t Hood_Power_On = 0;
|
|
uint8_t Hood_Fan_Mode = 0;
|
|
uint8_t Hood_Control = 0;
|
|
uint8_t Hood_Rx_Complete = 0;
|
|
uint8_t Hood_Status = 0;
|
|
|
|
uint8_t CheckSum_Creator(uint8_t *buf, uint8_t len)
|
|
{
|
|
uint8_t i, rt;
|
|
|
|
rt = 0;
|
|
|
|
for(i=0; i<len; i++)
|
|
{
|
|
rt ^= buf[i];
|
|
}
|
|
|
|
return(rt);
|
|
}
|
|
|
|
|
|
uint8_t Rx_hood_Pos = 0;
|
|
/* 후드 응답 수신 파서 — Rev1.3 9바이트 : AA 11 ID FANSTATUS LIGHT 00 연동CMD ERROR CS(XOR byte0~7)
|
|
(구버전 13바이트는 My_Hood_old.c 보관) */
|
|
void rx_hood_check(uint8_t data)
|
|
{
|
|
if(rx_hood_485_TimeOut == 0)Rx_hood_Pos = 0;
|
|
|
|
switch(Rx_hood_Pos)
|
|
{
|
|
case 0:
|
|
if(data != 0xAA)break;
|
|
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
|
break;
|
|
case 1:
|
|
if(data != 0x11)
|
|
{
|
|
Rx_hood_Pos = 0;
|
|
}
|
|
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
|
break;
|
|
case 8:
|
|
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
|
if(data == CheckSum_Creator(Rx_Hood_Buff, 8)) /* CS = XOR(byte0~7) */
|
|
{
|
|
Hood_Rx_Complete = 1;
|
|
}
|
|
Rx_hood_Pos = 0;
|
|
break;
|
|
default:
|
|
Rx_hood_Pos = 0;
|
|
break;
|
|
}
|
|
}
|
|
//-------------------------------------
|
|
void UART0_HANDLE()
|
|
{
|
|
uint8_t u8InChar=0xFF;
|
|
uint32_t u32IntSts= UART0->ISR;
|
|
|
|
if(u32IntSts & UART_ISR_RDA_IS_Msk)
|
|
{
|
|
u8InChar = UART_READ(UART0); /* Rx trigger level is 1 byte*/
|
|
|
|
rx_hood_check(u8InChar);
|
|
rx_hood_485_TimeOut = 10;
|
|
}
|
|
|
|
if(u32IntSts & UART_ISR_THRE_IS_Msk)
|
|
{
|
|
;
|
|
}
|
|
}
|
|
|
|
|
|
void UART0_IRQHandler(void)
|
|
{
|
|
UART0_HANDLE();
|
|
}
|
|
//----------------------------------
|
|
|
|
void Hood_Tx_packet(void)
|
|
{
|
|
/* 후드 Rev1.3 마스터 프레임(9바이트) : AA 21 ID MODE FAN 연동EN 연동운전중 ERROR CS(XOR byte0~7)
|
|
구버전 13B는 ERV→후드 제어필드(Power/Fan)를 포함했으나 Rev1.3 스펙엔 없음(ERV는 후드 단수 추종). */
|
|
Tx_Hood_Buff[0] = 0xAA;
|
|
Tx_Hood_Buff[1] = 0x21;
|
|
Tx_Hood_Buff[2] = 0x01; /* ID */
|
|
Tx_Hood_Buff[3] = Run_Mode; /* MODE */
|
|
Tx_Hood_Buff[4] = Fan_Mode; /* FAN */
|
|
Tx_Hood_Buff[5] = Hood_YeunDong_Enable; /* 연동 Enable */
|
|
Tx_Hood_Buff[6] = Yeungong_Status; /* 연동 운전중 */
|
|
Tx_Hood_Buff[7] = 0x00; /* ERROR */
|
|
Tx_Hood_Buff[8] = CheckSum_Creator(Tx_Hood_Buff, 8);
|
|
|
|
HOOD_485_DIR = 1; // DIR
|
|
UART_Write(UART0,Tx_Hood_Buff, 9);
|
|
while ( !(UART0->FSR & UART_FSR_TX_EMPTY_F_Msk) );
|
|
while ( !(UART0->FSR & UART_FSR_TE_F_Msk) );
|
|
HOOD_485_DIR = 0; // DIR;
|
|
}
|
|
|
|
void Hood_RS485_process(void)
|
|
{
|
|
if(Hood_Rx_Complete == 1)
|
|
{
|
|
Hood_Rx_Complete = 0;
|
|
Hood_Conn_Timeout = 1500; /* 유효 응답 수신 -> 통신연결 생존(폴 500ms 기준 ~3회 누락 허용) */
|
|
Hood_Status = Rx_Hood_Buff[3];
|
|
// if((Hood_Status == 1)&&(Hood_Yeundong_flag == 0))Command_request_type |= TYPE_HOOD_STATE;// add 2022.1.25
|
|
// if((Hood_Status == 0)&&(Hood_Yeundong_flag == 1))Command_request_type |= TYPE_HOOD_STATE;// add 2022.1.25
|
|
// Hood_Yeundong_flag = Hood_Status;
|
|
}
|
|
else
|
|
{
|
|
if(Hood_polling_timer == 0)
|
|
{
|
|
Hood_polling_timer = 500;
|
|
Hood_Tx_packet();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
uint8_t HREV_Hood_Control = 0;
|
|
uint16_t Hood_Warming_up_Timer = 0;
|
|
uint8_t Pre_Hood_Status = 0;
|
|
uint8_t Tx_Yeundong_Delay = 0;
|
|
|
|
/* 후드 단수 -> 환기장치 풍량 추종 매핑(사양 260613 9p 3.2) : 1->1,2->2,3->3,4->4,5->4 */
|
|
static uint8_t Hood_Step_To_Fan(uint8_t hs)
|
|
{
|
|
if(hs == 0) return 0;
|
|
return (hs > 4) ? 4 : hs;
|
|
}
|
|
|
|
uint8_t Hood_process(void)//200ms
|
|
{
|
|
if((Hood_YeunDong_Enable == 0)||(HREV_Hood_Control == 1))return(0);
|
|
|
|
if(Hood_Status != Pre_Hood_Status)
|
|
{
|
|
if((Pre_Hood_Status == 0)&&(Hood_Status != 0)) // 후드 ON : 메이크업 에어 진입(자동/수동 일시정지)
|
|
{
|
|
My_Memory_Run_Mode = Run_Mode;
|
|
if((Run_Mode == MODE_AUTO)&&(Fan_Mode == 0))My_Memory_Fan_Mode = 1;
|
|
else My_Memory_Fan_Mode = Fan_Mode;
|
|
|
|
Set_Run_Mode = Run_Mode = MODE_VENTILATION;
|
|
Set_Fan_Mode = Fan_Mode = Hood_Step_To_Fan(Hood_Status); // 후드 단수 추종(사양 260613 9p 3.2)
|
|
|
|
if(Set_Reserve_timer_sec != 0)
|
|
{
|
|
Set_Reserve_timer_sec = 0;
|
|
Command_request_type |= (TYPE_RESERVATION);
|
|
}
|
|
|
|
Command_request_type |= (TYPE_MODE|TYPE_FAN_SPEED);
|
|
/* [모드변경댐퍼테스트] 마스터 정렬 : 모드변경(→환기) 시 명령경로 즉시 팬설정 제거.
|
|
팬 복원은 Fan_Speed_process wait==1 에서 수행. */
|
|
//Fan_Speed_Setting(Run_Mode, Fan_Mode); /* 즉시 반영(룸컨 echo 대기 없이 — CTRL_FAN 동일) */
|
|
Tx_Yeundong_Delay = 30;
|
|
}
|
|
else if(Hood_Status == 0) // 후드 OFF : 즉시 원래 모드/풍량 복귀 (메이크업 유지는 후드측 담당, 사양 260613 9p 3.3)
|
|
{
|
|
Set_Run_Mode = Run_Mode = My_Memory_Run_Mode;
|
|
Set_Fan_Mode = Fan_Mode = My_Memory_Fan_Mode;
|
|
|
|
if(Set_Reserve_timer_sec != 0)
|
|
{
|
|
Set_Reserve_timer_sec = 0;
|
|
Command_request_type |= (TYPE_RESERVATION);
|
|
}
|
|
|
|
Command_request_type |= (TYPE_MODE|TYPE_FAN_SPEED|TYPE_HOOD_STATE);
|
|
/* [모드변경댐퍼테스트] 마스터 정렬 : 모드복귀 시 명령경로 즉시 팬설정 제거.
|
|
팬 복원은 Fan_Speed_process wait==1 에서 수행. */
|
|
//if(Run_Mode != MODE_AUTO) Fan_Speed_Setting(Run_Mode, Fan_Mode); /* 즉시 복귀 반영 */
|
|
Hood_Yeundong_flag = 0;
|
|
Hood_Warming_up_Timer = 0;
|
|
Tx_Yeundong_Delay = 0;
|
|
/* [쾌적조리자동해제] 후드 전원 OFF(단수 0) → 쾌적조리 토글 자동 해제.
|
|
사장님 요청(2026-06-18) : 후드 OFF 후 대시보드 쾌적조리 버튼이 저절로 꺼지게.
|
|
Enable=0 이면 STATUS byte4 bit1/byte5 bit0 모두 0 → 대시보드 _state.ComfortCook 자동 해제.
|
|
(기존 사양 9p 3.3 'armed 유지'와 반대 — 본 요청으로 변경) */
|
|
Hood_YeunDong_Enable = 0;
|
|
}
|
|
else // 후드 단수 변경(1~5) : 메이크업 풍량 단수 추종 갱신
|
|
{
|
|
uint8_t f = Hood_Step_To_Fan(Hood_Status);
|
|
if(Set_Fan_Mode != f)
|
|
{
|
|
Set_Fan_Mode = Fan_Mode = f;
|
|
Command_request_type |= (TYPE_FAN_SPEED);
|
|
if(Run_Mode != MODE_AUTO) Fan_Speed_Setting(Run_Mode, Fan_Mode); /* 즉시 반영(룸컨 echo 대기 없이) */
|
|
Tx_Yeundong_Delay = 30; // 룸컨(My_RJ2)이 연동 풍량변경을 수동명령으로 오인하지 않도록 디바운스
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 메이크업 진입/단수변경 MODE/FAN 전송 후 연동 플래그 set + 룸컨 통지.
|
|
Tx_Yeundong_Delay 는 룸컨(My_RJ2)이 연동 명령을 사용자 수동명령과 구분하는 데 사용(불변).
|
|
조리 종료 후 잔여 배출(메이크업 유지)은 후드측이 담당하므로 여기서 롤백 타이머는 두지 않음. */
|
|
if(Tx_Yeundong_Delay)
|
|
{
|
|
Tx_Yeundong_Delay--;
|
|
if(Tx_Yeundong_Delay == 0)
|
|
{
|
|
Hood_Yeundong_flag = 1;
|
|
Command_request_type |= TYPE_HOOD_STATE;// add 2022.1.25
|
|
}
|
|
}
|
|
|
|
Pre_Hood_Status = Hood_Status;
|
|
|
|
return(1);
|
|
}
|