Files
HECO2/Source/HECO2/User/My_Hood.c
T
jeon b18d9c84bf fix: 260618 룸컨 동기·쾌적조리·시나리오·그래프DB 등 수정
펌웨어(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>
2026-06-18 23:41:34 +09:00

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);
}