feat: 06-17 신규 작업본 반영 (개발사양서/기능검토/승인원/Source 등 추가)

.claude/ 제외(.gitignore 추가). 기존 초기커밋(5a96a69) 위에 신규·수정·이동분 커밋.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 07:54:58 +09:00
parent 5a96a696b1
commit 096111e983
529 changed files with 12439 additions and 1166 deletions
@@ -0,0 +1,733 @@
#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"
extern volatile uint8_t Rx_rs485_TimeOut ;
extern volatile uint8_t Power_On;
extern volatile uint8_t Tx_Run_Mode;
extern volatile uint8_t Tx_Fan_Speed;
extern volatile uint8_t Tx_Reservation_Hour;
extern uint8_t Ventilation_SA[5];
extern uint8_t Ventilation_EA[5];
extern uint8_t AirClean_SA[5];
extern uint8_t AirClean_EA[5];
extern uint8_t Bypass_SA[5];
extern uint8_t Bypass_EA[5];
extern uint8_t Test_Mode_Step;
volatile uint8_t Tx_Data_Mode = TX_DATA_MODE_REQUEST1;
uint16_t Main_Err_Code = 0;
volatile uint16_t Update_Event = 0;
const unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
// Table of CRC values for low-order byte
const unsigned char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
uint16_t CRC16(uint8_t *puchMsg, uint16_t usDataLen)
{
uint8_t uchCRCHi = 0xFF ; // high CRC byte initialized
uint8_t uchCRCLo = 0xFF ; // low CRC byte initialized
uint8_t uIndex ; // will index into CRC lookup table
while (usDataLen--) // pass through message buffer
{
uIndex = uchCRCHi ^ *puchMsg++ ; // calculate the CRC
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return ((uint16_t)uchCRCHi << 8 | (uint16_t)uchCRCLo) ;
}
uint16_t Aeverage_calculator(uint16_t val, uint16_t * array_val)
{
uint8_t i;
uint16_t max = 0;
uint16_t min = 10000;
uint32_t sum = 0;
uint16_t Rval = 0;
for(i=9; i>0; i--)
{
*(array_val+i) = *(array_val+i-1);
}
*array_val = val;
for(i=0; i<10; i++)
{
if(array_val[i] >= max)
{
max = array_val[i];
}
if(array_val[i] <= min)
{
min = array_val[i];
}
sum += array_val[i];
}
Rval = (uint16_t)((sum - max - min)/8);
return(Rval);
}
///////////////////////////////////////////////////////////////////////////////
////////////////////////////////
extern volatile uint8_t Rx_modbus_TimeOut;
void Rx_modbus_Check(uint8_t data)
{
}
void SC0_IRQHandler(void)
{
uint8_t data;
data = SCUART_READ(SC0);
Rx_modbus_Check(data);
Rx_modbus_TimeOut = 5;
return;
}
uint8_t Tx_rs485_buffer[25];
uint8_t Rx_rs485_buffer[25];
uint8_t Rx_rs485_Pos = 0;
volatile uint8_t Rx_rs485_complete = 0;
void Rx_rs485_Check(uint8_t data)
{
uint16_t cksum = 0, iTmp = 0;
if(Rx_rs485_TimeOut == 0)Rx_rs485_Pos = 0;
switch(Rx_rs485_Pos)
{
case 0:
if(data != 0xAA)break;
Rx_rs485_buffer[Rx_rs485_Pos++] = data;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
Rx_rs485_buffer[Rx_rs485_Pos++] = data;
break;
case 20:
Rx_rs485_buffer[Rx_rs485_Pos++] = data;
iTmp = (uint16_t)Rx_rs485_buffer[19]<<8;
cksum = iTmp + (uint16_t)Rx_rs485_buffer[20] ;
if(cksum == CRC16(Rx_rs485_buffer, 19))
{
Rx_rs485_complete = 1;
}
Rx_rs485_Pos = 0;
break;
default:
Rx_rs485_Pos = 0;
break;
}
}
extern uint8_t In_Com_Error_Count;
extern uint8_t Out_Com_Error_Count ;
extern uint8_t Sensor_Error_Count;
void com_rs485_process(void)
{
if(Rx_rs485_complete == 1)
{
Rx_rs485_complete = 0;
if(Rx_rs485_buffer[1] == 0x10)//main
{
Rx_Main_Parsing();
In_Com_Error_Count = 0;
Main_Err_Code &= ~ERROR_IN_COM;
}
else if(Rx_rs485_buffer[1] == 0x01)
{
if(Rx_rs485_buffer[2] == 1) // id 1 - sensor pack
{
Rx_Sensor_Parsing();
Sensor_Error_Count = 0;
Main_Err_Code &= ~(ERROR_CO2 | ERROR_DUST);
}
}
}
}
volatile uint8_t Filter_Reset_Flag = 0;
uint16_t Used_Filter_Time = 0;
uint16_t Used_Soja_Time = 0;
uint8_t Main_BxD_Version = 0;
int8_t Ex_Temperature = 0;
int8_t In_Temperature = 0;
uint16_t SA_rpm = 0, EA_rpm = 0;
uint8_t Vsp_Mode = 0;
uint8_t Wifi_Status = 0;
extern uint8_t Main_Modbus_ID;
uint8_t Main_BxD_FW_Version[3];
void Rx_Main_Parsing(void)
{
uint16_t Tmp_Err = 0;
if(Rx_rs485_buffer[2] != 0x00)return; // My id = 0
Vsp_Mode = Rx_rs485_buffer[3];
switch(Vsp_Mode)
{
case 0x00: // nomal mode
if(Rx_rs485_buffer[4] & 0x10)
{
Tx_Run_Mode = Rx_rs485_buffer[4]&0x0F;
if(Rx_rs485_buffer[4] == 0x10)
{
if((Power_On == 1)&&(Tx_Run_Mode == MODE_OFF))power_off_process();
}
else
{
if((Power_On == 0)&&(Tx_Run_Mode != MODE_OFF))power_on_process_by_roomcon();
}
}
if(Rx_rs485_buffer[5] & 0x10)Tx_Fan_Speed = Rx_rs485_buffer[5]&0x0F;
if(Rx_rs485_buffer[6] & 0x10)
{
Tx_Reservation_Hour = Rx_rs485_buffer[6]&0x0F;
}
Tmp_Err = (((uint16_t)Rx_rs485_buffer[7]<<8) |( (uint16_t)Rx_rs485_buffer[8]&0x00FF))&0x00FF;
Main_Err_Code &= ~0x00FF;
Main_Err_Code |= Tmp_Err;
if(Filter_Reset_Flag == 1)
{
if((Main_Err_Code&0x000F) == 0)Filter_Reset_Flag = 0;
}
Used_Filter_Time = ((uint16_t)Rx_rs485_buffer[11]<<8) |( (uint16_t)Rx_rs485_buffer[12]&0x00FF);
Used_Soja_Time = ((uint16_t)Rx_rs485_buffer[13]<<8) |( (uint16_t)Rx_rs485_buffer[14]&0x00FF);
Main_BxD_FW_Version[0] = Rx_rs485_buffer[15];
Main_BxD_FW_Version[1] = Rx_rs485_buffer[16];
Main_BxD_FW_Version[2] = Rx_rs485_buffer[17];
Wifi_Status = Rx_rs485_buffer[18];
break;
case 0x01: // vent request mode
Ventilation_SA[0] = Rx_rs485_buffer[4]; // VENT 1 SA
Ventilation_EA[0] = Rx_rs485_buffer[5]; // VENT 1 EA
Ventilation_SA[1] = Rx_rs485_buffer[6]; // VENT 2 SA
Ventilation_EA[1] = Rx_rs485_buffer[7]; // VENT 2 EA
Ventilation_SA[2] = Rx_rs485_buffer[8]; // VENT 3 SA
Ventilation_EA[2] = Rx_rs485_buffer[9];// VENT 3 EA
Ventilation_SA[3] = Rx_rs485_buffer[10]; // VENT 4 SA
Ventilation_EA[3] = Rx_rs485_buffer[11]; // VENT 4 EA
Ventilation_SA[4] = Rx_rs485_buffer[12]; // VENT 5 SA
Ventilation_EA[4] = Rx_rs485_buffer[13]; // VENT 6 EA
Main_Modbus_ID = Rx_rs485_buffer[14]; // Modbus set id
Tx_Data_Mode = TX_DATA_MODE_REQUEST2;
break;
case 0x02: // air request mode
AirClean_SA[0] = Rx_rs485_buffer[4]; // AIR 1 SA
AirClean_EA[0] = Rx_rs485_buffer[5]; // AIR 1 EA
AirClean_SA[1] = Rx_rs485_buffer[6]; // AIR 2 SA
AirClean_EA[1] = Rx_rs485_buffer[7]; // AIR 2 EA
AirClean_SA[2] = Rx_rs485_buffer[8]; // AIR 3 SA
AirClean_EA[2] = Rx_rs485_buffer[9];// AIR 3 EA
AirClean_SA[3] = Rx_rs485_buffer[10]; // AIR 4 SA
AirClean_EA[3] = Rx_rs485_buffer[11]; // AIR 4 EA
AirClean_SA[4] = Rx_rs485_buffer[12]; // AIR 5 SA
AirClean_EA[4] = Rx_rs485_buffer[13]; // AIR 6 EA
Tx_Data_Mode = TX_DATA_MODE_REQUEST3;
break;
case 0x03: // bypass request mode
Bypass_SA[0] = Rx_rs485_buffer[4]; // BY 1 SA
Bypass_EA[0] = Rx_rs485_buffer[5]; // BY 1 EA
Bypass_SA[1] = Rx_rs485_buffer[6]; // BY 2 SA
Bypass_EA[1] = Rx_rs485_buffer[7]; // BY 2 EA
Bypass_SA[2] = Rx_rs485_buffer[8]; // BY 3 SA
Bypass_EA[2] = Rx_rs485_buffer[9];// BY 3 EA
Bypass_SA[3] = Rx_rs485_buffer[10]; // BY 4 SA
Bypass_EA[3] = Rx_rs485_buffer[11]; // BY 4 EA
Bypass_SA[4] = Rx_rs485_buffer[12]; // BY 5 SA
Bypass_EA[4] = Rx_rs485_buffer[13]; // BY 6 EA
Tx_Data_Mode = TX_DATA_MODE_NORMAL;
break;
case 0x10:
SA_rpm = ((uint16_t)Rx_rs485_buffer[10]<<8) |( (uint16_t)Rx_rs485_buffer[11]&0x00FF);
EA_rpm = ((uint16_t)Rx_rs485_buffer[12]<<8) |( (uint16_t)Rx_rs485_buffer[13]&0x00FF);
break;
default:
Tx_Data_Mode = TX_DATA_MODE_NORMAL;
break;
}
Tx_Main_process();
}
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);
}
extern volatile uint8_t Tx_Mode_Event, Tx_Fan_Event, Tx_Reserve_Event;
extern uint8_t Wifi_Command ;
void Tx_Main_process(void)
{
uint16_t cksum = 0;
uint8_t i = 0;
for(i=0; i<20; i++)Tx_rs485_buffer[i] = 0;
Tx_rs485_buffer[0] = 0xAA;
Tx_rs485_buffer[1] = 0x01;
Tx_rs485_buffer[2] = 0x00; // ID = 0
Tx_rs485_buffer[3] = Tx_Data_Mode;
switch(Tx_Data_Mode)
{
case TX_DATA_MODE_NORMAL:
Tx_rs485_buffer[4] = Tx_Run_Mode|Tx_Mode_Event;
Tx_rs485_buffer[5] = Tx_Fan_Speed|Tx_Fan_Event;
Tx_rs485_buffer[6] = Tx_Reservation_Hour|Tx_Reserve_Event;
Tx_Mode_Event = 0;
Tx_Fan_Event = 0;
Tx_Reserve_Event = 0;
Tx_rs485_buffer[7] = 0x00;
Tx_rs485_buffer[8] = Filter_Reset_Flag;
Tx_rs485_buffer[9] = 0;//(signed char)Out_Temperature;
Tx_rs485_buffer[10] = 0;//(signed char)In_Temperature;
Tx_rs485_buffer[11] = (uint8_t)(Used_Filter_Time>>8);
Tx_rs485_buffer[12] = (uint8_t)(Used_Filter_Time&0x00FF);
Tx_rs485_buffer[13] = (uint8_t)(Used_Soja_Time>>8);
Tx_rs485_buffer[14] = (uint8_t)(Used_Soja_Time&0x00FF);
Tx_rs485_buffer[15] = 'S';
Tx_rs485_buffer[16] = 'I';
Tx_rs485_buffer[17] = ROOMCON_FW_VERSION;
Tx_rs485_buffer[18] = Wifi_Command;
Wifi_Command = 0;
break;
case TX_DATA_MODE_REQUEST1:
break;
case TX_DATA_MODE_REQUEST2:
break;
case TX_DATA_MODE_REQUEST3:
break;
case TX_DATA_MODE_SETTING:
Tx_rs485_buffer[4] = Test_Mode_Step;
switch(Test_Mode_Step)
{
case 0x01:
Tx_rs485_buffer[5] = Ventilation_SA[0];
Tx_rs485_buffer[6] = Ventilation_EA[0];
break;
case 0x02:
Tx_rs485_buffer[5] = Ventilation_SA[1];
Tx_rs485_buffer[6] = Ventilation_EA[1];
break;
case 0x03:
Tx_rs485_buffer[5] = Ventilation_SA[2];
Tx_rs485_buffer[6] = Ventilation_EA[2];
break;
case 0x04:
Tx_rs485_buffer[5] = Ventilation_SA[3];
Tx_rs485_buffer[6] = Ventilation_EA[3];
break;
case 0x05:
Tx_rs485_buffer[5] = Ventilation_SA[4];
Tx_rs485_buffer[6] = Ventilation_EA[4];
break;
case 0x06:
Tx_rs485_buffer[5] = AirClean_SA[0];
Tx_rs485_buffer[6] = AirClean_EA[0];
break;
case 0x07:
Tx_rs485_buffer[5] = AirClean_SA[1];
Tx_rs485_buffer[6] = AirClean_EA[1];
break;
case 0x08:
Tx_rs485_buffer[5] = AirClean_SA[2];
Tx_rs485_buffer[6] = AirClean_EA[2];
break;
case 0x09:
Tx_rs485_buffer[5] = AirClean_SA[3];
Tx_rs485_buffer[6] = AirClean_EA[3];
break;
case 0x0A:
Tx_rs485_buffer[5] = AirClean_SA[4];
Tx_rs485_buffer[6] = AirClean_EA[4];
break;
case 0x0B:
Tx_rs485_buffer[5] = Bypass_SA[0];
Tx_rs485_buffer[6] = Bypass_EA[0];
break;
case 0x0C:
Tx_rs485_buffer[5] = Bypass_SA[1];
Tx_rs485_buffer[6] = Bypass_EA[1];
break;
case 0x0D:
Tx_rs485_buffer[5] = Bypass_SA[2];
Tx_rs485_buffer[6] = Bypass_EA[2];
break;
case 0x0E:
Tx_rs485_buffer[5] = Bypass_SA[3];
Tx_rs485_buffer[6] = Bypass_EA[3];
break;
case 0x0F:
Tx_rs485_buffer[5] = Bypass_SA[4];
Tx_rs485_buffer[6] = Bypass_EA[4];
break;
case 0x10:
Tx_rs485_buffer[5] = Main_Modbus_ID;
Tx_rs485_buffer[6] = 0;
break;
default:
break;
}
break;
default:
break;
}
cksum = CRC16(Tx_rs485_buffer, 19) ;
Tx_rs485_buffer[19] = (uint8_t)(cksum>>8) ;
Tx_rs485_buffer[20] = (uint8_t)cksum & 0x00FF ;
delay_ms(1);
PB6 = 1; // DIR
UART_Write(UART1, Tx_rs485_buffer, 21);
while ( !(UART1->FSR & UART_FSR_TX_EMPTY_F_Msk) );
while ( !(UART1->FSR & UART_FSR_TE_F_Msk) );
PB6 = 0; // DIR
}
void UART1_HANDLE() // modbus
{
uint8_t u8InChar=0xFF;
uint32_t u32IntSts= UART1->ISR;
if(u32IntSts & UART_ISR_RDA_IS_Msk)
{
u8InChar = UART_READ(UART1); /* Rx trigger level is 1 byte*/
Rx_rs485_Check(u8InChar);
Rx_rs485_TimeOut = 5;
}
if(u32IntSts & UART_ISR_THRE_IS_Msk)
{
;
}
}
void UART1_IRQHandler(void) // modbus
{
UART1_HANDLE();
}
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////
uint16_t CO2_Value = 0;
uint16_t Pm_1_0_value = 0;
uint16_t Pm_2_5_value = 0;
uint16_t Pm_10_value = 0;
signed int temperature_val = 0, humidity_val = 0;
signed int tvoc_val = 0;
uint8_t Sensor_BxD_Version = 0;
extern uint8_t IR_Event_Code;
extern volatile uint8_t IR_Event_Flag;
void Rx_Sensor_Parsing(void)
{
uint16_t iTmp, cksum;
uint8_t Sensor_id = 0;
uint16_t temp_pm10 = 0;
uint16_t temp_pm2_5 = 0;
uint16_t temp_pm1_0 = 0;
uint16_t temp_co2 = 0;
uint16_t temp_humi = 0;
uint16_t temp_temp = 0; // signed
uint16_t temp_voc = 0;
iTmp = (uint16_t)Rx_rs485_buffer[19]<<8;
cksum = iTmp + (uint16_t)Rx_rs485_buffer[20] ;
if(cksum != CRC16(Rx_rs485_buffer, 19))return;
temp_pm10 = (uint16_t)Rx_rs485_buffer[3]<<8;
temp_pm10 += (uint16_t)Rx_rs485_buffer[4];
temp_pm2_5 = (uint16_t)Rx_rs485_buffer[5]<<8;
temp_pm2_5 += (uint16_t)Rx_rs485_buffer[6];
temp_pm1_0 = (uint16_t)Rx_rs485_buffer[7]<<8;
temp_pm1_0 += (uint16_t)Rx_rs485_buffer[8];
temp_co2 = (uint16_t)Rx_rs485_buffer[9]<<8;
temp_co2 += (uint16_t)Rx_rs485_buffer[10];
temp_humi = (uint16_t)Rx_rs485_buffer[11]<<8;
temp_humi += (uint16_t)Rx_rs485_buffer[12];
temp_temp = (uint16_t)Rx_rs485_buffer[13]<<8;
temp_temp += (uint16_t)Rx_rs485_buffer[14];
temp_voc = (uint16_t)Rx_rs485_buffer[15]<<8;
temp_voc += (uint16_t)Rx_rs485_buffer[16];
IR_Event_Code = Rx_rs485_buffer[18];
if(IR_Event_Code)IR_Event_Flag = 1;
Pm_10_value = temp_pm10;
Pm_2_5_value = temp_pm2_5;
Pm_1_0_value = temp_pm1_0;
CO2_Value = temp_co2;
if(temp_temp & 0x8000)
{
temp_temp &= ~0x8000;
temperature_val = (signed int)temp_temp * -1;
}
else
{
temperature_val = (signed int)temp_temp;
}
humidity_val = (signed int)temp_humi;
tvoc_val = (signed int)temp_voc;
}
void UART0_HANDLE() // co2
{
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*/
}
if(u32IntSts & UART_ISR_THRE_IS_Msk)
{
;
}
}
void UART0_IRQHandler(void) // co2
{
UART0_HANDLE();
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////
void Tx_modbus_process(void)
{
uint16_t i;
for(i=0; i<7; i++)
{
//UART_WRITE(UART1, Tx_modbus_Buff[i]);
}
}
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////
extern volatile uint8_t Rx_wifi_TimeOut;
volatile uint8_t Rx_wifi_complete = 0;
uint8_t Rx_wifi_buffer[40];
uint8_t Tx_wifi_buffer[40];
uint8_t Rx_wifi_Pos = 0;
void Rx_wifi_Check(uint8_t data)
{
if(Rx_wifi_TimeOut == 0)Rx_wifi_Pos = 0;
switch(Rx_wifi_Pos)
{
case 0:
if(data != 0x42){Rx_wifi_Pos = 0;break;}
Rx_wifi_buffer[Rx_wifi_Pos++]=data;
break;
case 31:
Rx_wifi_buffer[Rx_wifi_Pos]=data;
Rx_wifi_complete = 1;
Rx_wifi_Pos = 0;
break;
default:
Rx_wifi_buffer[Rx_wifi_Pos++] = data;
break;
}
}
void Tx_wifi_data(uint8_t *buf, uint8_t Len)
{
SCUART_Write(SC1, buf, Len);
}
void SC1_IRQHandler(void) // wifi
{
uint8_t data;
data = SCUART_READ(SC1);
Rx_wifi_Check(data);
Rx_wifi_TimeOut = 5;
return;
}
void Rx_wifi_Parsing(void)
{
;
}
void tx_wifi_data(void)
{
Tx_wifi_buffer[0] = 0x11;
Tx_wifi_buffer[1] = 0x02;
Tx_wifi_buffer[2] = 0x0B;
Tx_wifi_buffer[3] = 0x07;
Tx_wifi_buffer[4] = 0xDB;
Tx_wifi_data(Tx_wifi_buffer, 5);
}
@@ -0,0 +1,128 @@
void Display_update(void);
void Display_process(void);
void Initial_Signal();
void Disp_Segdata(uint8_t Sel, uint8_t digit4,uint8_t digit3, uint8_t digit2, uint8_t digit1);
void Led_OnOff(uint8_t kind, uint8_t onoff);
void delay_ms(uint32_t ms);
void delay_us(uint32_t us);
void PowerDownFunction(void);
void GPIO_Init(void);
void PWM_Init(void);
void Timer0_Init(void);
void Timer1_Init(void);
void Timer2_Init(void);
void SYS_Init(void);
void UART0_Init(void);
void UART1_Init(void);
void SC0_Init();
void SC1_Init();
void ADC_Init(void);
void Processor_Init(void);
void Error_process(void);
void Test_exit_process(void);
void Test_vsp_into_process(void);
void Touch_process(void);
void power_off_process(void);
void power_on_process(void);
void power_on_process_by_roomcon(void); //iot
void power_off_process_by_roomcon(void);
void IR_Remocon_process(void);
extern uint8_t touch_i2c_read(uint8_t index, uint8_t *value);
extern uint8_t touch_i2c_write(uint8_t index, uint8_t d);
extern void touch_i2c_init();
extern void Melody_process(void);
void Air_Quality_process(void);
void com_rs485_process(void);
void Tx_Main_process(void);
void Rx_rs485_Check(uint8_t data);
void Rx_Main_Parsing(void);
void Rx_Sensor_Parsing(void);
void Rx_wifi_Check(uint8_t data);
void Rx_wifi_Parsing(void);
uint8_t CheckSum_Creator(uint8_t *buf, uint8_t len);
#define TX_EVENT 0x10
#define MELODY_OFF 0
#define MELODY_POWER_ON 1
#define MELODY_POWER_OFF 2
#define MELODY_TOUCH 3
#define MELODY_NG 4
#define MODE_OFF 0
#define MODE_VENT 1
#define MODE_AUTO 2
#define MODE_AIR_CLEAN 3
#define MODE_BYPASS 4
#define ERROR_SA 0x0040
#define ERROR_EA 0x0080
#define ERROR_FILTER_CLEAN 0x0001 // FILTER & SOJA
#define ERROR_FILTER_CHANGE 0x0002
#define ERROR_SOJA_CHANGE 0x0004
#define ERROR_IN_COM 0x0010
#define ERROR_OUT_COM 0x0020
#define ERROR_TEMP 0x0800
#define ERROR_HUMI 0x1000
#define ERROR_TVOC 0x2000
#define ERROR_DUST 0x4000
#define ERROR_CO2 0x8000
#define EVENT_POWER 0x01
#define EVENT_MODE 0x02
#define EVENT_WIND 0x04
#define EVENT_TIME 0x08
#define TX_DATA_MODE_NORMAL 0x00
#define TX_DATA_MODE_REQUEST1 0x01
#define TX_DATA_MODE_REQUEST2 0x02
#define TX_DATA_MODE_REQUEST3 0x03
#define TX_DATA_MODE_SETTING 0x10
#define ROOMCON_VERSION 0x01
#define CO2_VERSION 0x01
#define EEP_ADDR_START 0x01
#define EEP_ADDR_MODBUS_ID 0x05
// S1000
#define WIND_CMH_0 0
#define WIND_CMH_1 400
#define WIND_CMH_2 750
#define WIND_CMH_3 1000
#define ROOMCON_FW_VERSION 22
extern uint8_t Main_BxD_FW_Version[3];
extern uint8_t Sensor_BxD_Version;
@@ -0,0 +1,55 @@
void Display_update(void);
void Display_process(void);
void Initial_Signal();
void Disp_Segdata(uint8_t Sel, uint8_t digit4,uint8_t digit3, uint8_t digit2, uint8_t digit1);
void Led_OnOff(uint8_t kind, uint8_t onoff);
void delay_ms(uint32_t ms);
void delay_us(uint32_t us);
void PowerDownFunction(void);
void GPIO_Init(void);
void PWM_Init(void);
void Timer0_Init(void);
void Timer1_Init(void);
void Timer2_Init(void);
void SYS_Init(void);
void UART0_Init(void);
void UART1_Init(void);
void SC0_Init();
void SC1_Init();
void ADC_Init(void);
void Processor_Init(void);
void Error_process(void);
#define ST_LED PA11
#define IN485_DIR PB6
#define FND_POWER PA1
#define FND_VERSION 1
extern uint16_t SEN66_pm10p0;
extern uint16_t SEN66_pm4p0;
extern uint16_t SEN66_pm2p5;
extern uint16_t SEN66_pm1p0;
extern uint16_t SEN66_humidity_value;
extern uint16_t SEN66_temperature_value;
extern uint16_t SEN66_VOC_value;
extern uint16_t SEN66_NOx_value;
extern uint16_t SEN66_CO2_value;
extern volatile uint8_t Run_Timer;
extern volatile uint16_t mSec_Timer;
extern volatile uint16_t Blink_Timer;
extern volatile uint8_t Rx_FND_TimeOut;
extern volatile uint16_t FastBlink_Timer;
@@ -0,0 +1,749 @@
#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 "EEPROM_Emulate.h"
#include "My_define.h"
extern uint8_t Melody_Mode;
extern volatile uint8_t Power_On;
extern volatile uint8_t Tx_Run_Mode;
extern volatile uint8_t Tx_Fan_Speed;
extern volatile uint8_t Tx_Reservation_Hour;
extern uint16_t Main_Err_Code;
extern uint8_t Vsp_Mode;
void delay_us(uint32_t us)
{
CLK_SysTickDelay(us);
}
void delay_ms(uint32_t ms)
{
while(ms--)
{
delay_us(1000);
}
}
void UART0_Init()//co2
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init UART */
/*---------------------------------------------------------------------------------------------------------*/
SYS_ResetModule(UART0_RST);
UART_Open(UART0, 115200);
UART_EnableInt(UART0, UART_IER_RDA_IE_Msk);
NVIC_EnableIRQ(UART0_IRQn);
}
void UART1_Init()
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init UART */
/*---------------------------------------------------------------------------------------------------------*/
SYS_ResetModule(UART1_RST);
UART_Open(UART1, 115200);
UART_EnableInt(UART1, UART_IER_RDA_IE_Msk);
NVIC_EnableIRQ(UART1_IRQn);
}
void SC0_Init() // to main
{
SCUART_Open(SC0, 1200);
// Enable smartcard receive interrupt
SCUART_ENABLE_INT(SC0, SC_IER_RDA_IE_Msk);
NVIC_EnableIRQ(SC0_IRQn);
}
void SC1_Init() // to dust
{
SCUART_Open(SC1, 9600);
// Enable smartcard receive interrupt
SCUART_ENABLE_INT(SC1, SC_IER_RDA_IE_Msk);
NVIC_EnableIRQ(SC1_IRQn);
}
void PowerDownFunction(void)
{
;
}
#define IR_EVENT_POWER 0x01
#define IR_EVENT_MODE 0x02
#define IR_EVENT_WIND_UP 0x04
#define IR_EVENT_WIND_DN 0x05
#define IR_EVENT_TIME_1 0x06
#define IR_EVENT_TIME_2 0x07
#define IR_EVENT_TIME_3 0x08
#define IR_EVENT_FILTER_RESET 0x09
#define IR_START 13500
#define IR_HIGH 2260
#define IR_LOW 1180
#define IR_STOP 600
#define IR_REPEAT 11200
uint16_t long_timer1 = 0;
uint16_t remocon_buff[4];
uint8_t remocon_pos = 0;
uint8_t remocon_bit_count = 0;
uint8_t IR_Event_Code = 0;
volatile uint8_t IR_Event_Flag = 0;
void IR_Receive(void)
{
uint16_t tmp = 0;
long_timer1 = TIMER2->DR/12;
TIMER2->CTL |= TIMER_CTL_SW_RST_Msk;
TIMER_Start(TIMER2);
if((long_timer1 > IR_START-300)&&(long_timer1 < IR_START+300))
{
remocon_buff[0] = 0;
remocon_buff[1] = 0;
remocon_bit_count = 0;
remocon_pos = 0;
}
else if((long_timer1 > IR_REPEAT-300)&&(long_timer1 < IR_REPEAT+300))
{
remocon_buff[0] = 0;
remocon_buff[1] = 0;
remocon_bit_count = 0;
remocon_pos = 0;
}
else if((long_timer1 > IR_HIGH-200)&&(long_timer1 < IR_HIGH+200))
{
remocon_buff[remocon_pos] |= 0x8000;
if(remocon_bit_count++ >= 15){remocon_bit_count = 0;remocon_pos=1;}
else {remocon_buff[remocon_pos] >>= 1;}
}
else if((long_timer1 > IR_LOW-200)&&(long_timer1 < IR_LOW+200))
{
remocon_buff[remocon_pos] &= ~0x8000;
if(remocon_bit_count++ >= 15){remocon_bit_count = 0;remocon_pos=1;}
else {remocon_buff[remocon_pos] >>= 1;}
}
if((remocon_pos == 1)&&(remocon_bit_count == 15))
{
if(remocon_buff[0] == 0xA55A)
{
tmp = remocon_buff[1];
/* switch(tmp)
{
case 0x6E11: // Power
IR_Event_Code = IR_EVENT_POWER;
break;
case 0x6D12: // mode
IR_Event_Code = IR_EVENT_MODE;
break;
case 0x6C13: // up
IR_Event_Code = IR_EVENT_WIND_UP;
break;
case 0x6817: // dn
IR_Event_Code = IR_EVENT_WIND_DN;
break;
case 0x6718: // 1hour
IR_Event_Code = IR_EVENT_TIME_1 ;
break;
case 0x6619: // 2hour
IR_Event_Code = IR_EVENT_TIME_2 ;
break;
case 0x215E: // 3hour
IR_Event_Code = IR_EVENT_TIME_3 ;
break;
case 0x354A: // filter reset
IR_Event_Code = IR_EVENT_FILTER_RESET;
break;
default:
IR_Event_Code = 0;
break;
}
if(IR_Event_Code)
{
IR_Event_Flag = 1;
}
*/
}
remocon_buff[0] = 0;
remocon_buff[1] = 0;
remocon_bit_count = 0;
remocon_pos = 0;
}
}
volatile uint8_t Touch_Event = 0;
void GPABC_IRQHandler(void)
{
uint32_t reg;
if(GPIO_GET_INT_FLAG(PB, BIT12))
{
GPIO_CLR_INT_FLAG(PB, BIT12);
CLK->WK_INTSTS = 1; /* clear interrupt status */
if(PB12 == 0)Touch_Event = 1;
else Touch_Event = 2;
}
else if(GPIO_GET_INT_FLAG(PB, BIT14))
{
GPIO_CLR_INT_FLAG(PB, BIT14);
CLK->WK_INTSTS = 1; /* clear interrupt status */
IR_Receive();
}
else
{
reg = PA->ISRC; PA->ISRC = reg;
reg = PB->ISRC; PB->ISRC = reg;
reg = PC->ISRC; PC->ISRC = reg;
}
}
volatile uint8_t Run_Timer = 0;
volatile uint16_t mSec_Timer = 0;
volatile uint16_t Touch_Event_Timer = 0;
volatile uint16_t Blink_Timer = 0;
volatile uint8_t Rx_rs485_TimeOut = 0;
volatile uint8_t Rx_modbus_TimeOut = 0;
volatile uint8_t Rx_wifi_TimeOut = 0;
volatile uint16_t FastBlink_Timer = 0;
void TMR0_IRQHandler(void)
{
Touch_Event_Timer++;
if(Run_Timer)Run_Timer--;
if(mSec_Timer)mSec_Timer--;
if(Blink_Timer)Blink_Timer--;
if(FastBlink_Timer)FastBlink_Timer--;
if(Rx_rs485_TimeOut)Rx_rs485_TimeOut--;
if(Rx_modbus_TimeOut)Rx_modbus_TimeOut--;
if(Rx_wifi_TimeOut)Rx_wifi_TimeOut--;
// clear timer interrupt flag
TIMER_ClearIntFlag(TIMER0);
}
// TIMER_ClearWakeupFlag(TIMER0);
void Timer0_Init(void)
{
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000); // 1ms -> HZ
// Enable timer interrupt
TIMER_EnableInt(TIMER0);
NVIC_EnableIRQ(TMR0_IRQn);
// Start Timer 0
TIMER_Start(TIMER0);
}
void TMR1_IRQHandler(void)
{
Melody_process();
// clear timer interrupt flag
TIMER_ClearIntFlag(TIMER1);
}
void Timer1_Init(void)
{
TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, 100); // 10ms -> HZ
// Enable timer interrupt
TIMER_EnableInt(TIMER1);
NVIC_EnableIRQ(TMR1_IRQn);
// Start Timer 0
TIMER_Start(TIMER1);
}
void Timer2_Init(void) ///////////////////////////////////////////////////////////////////
{
TIMER_Open(TIMER2, TIMER_PERIODIC_MODE, 1); // 1000ms -> HZ
// Enable timer interrupt
TIMER_EnableInt(TIMER2);
// NVIC_EnableIRQ(TMR2_IRQn);
// Start Timer 0
TIMER_Start(TIMER2);
}/////////////////////////////////////////////////////////////////////////////////////
void PWM_Init(void)
{
// PWM0 frequency is 300Hz, duty 50%
// PWM_ConfigOutputChannel(PWM0, 3, 960, 50); // LCD Backlight
PWM_ConfigOutputChannel(PWM1, 0, 100, 0); // buzzer
// Enable output of all PWM channels
// PWM_EnableOutput(PWM0, 1<<3); // ch3
PWM_EnableOutput(PWM1, 0x01);
// Start
// PWM_Start(PWM0, 1<<3); // pwm0_ch3
PWM_Start(PWM1, 0x01);
}
volatile uint32_t ADC3_Value = 0;;
void ADC_IRQHandler(void)
{
uint32_t u32Flag;
// Get ADC conversion finish interrupt flag
u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);
if(u32Flag & ADC_ADF_INT)
{
ADC3_Value = ADC_GET_CONVERSION_DATA(ADC, 3);
}
ADC_CLR_INT_FLAG(ADC, u32Flag);
}
void ADC_Init(void)
{
// Enable channel 1
ADC_Open(ADC, ADC_INPUT_MODE_SINGLE_END, ADC_OPERATION_MODE_SINGLE, ADC_CH_1_MASK);
// Set reference voltage to AVDD
ADC_SET_REF_VOLTAGE(ADC, ADC_REFSEL_POWER);
// Power on ADC
ADC_POWER_ON(ADC);
// Enable ADC ADC_IF interrupt
ADC_EnableInt(ADC, ADC_ADF_INT);
NVIC_EnableIRQ(ADC_IRQn);
ADC_START_CONV(ADC);
}
void GPIO_Init(void)
{
GPIO_SetMode(PA, BIT2|BIT3|BIT4, GPIO_PMD_OUTPUT); // A_2002
PA2 = 0;
PA3 = 0;
PA4 = 0;
GPIO_SetMode(PA, BIT13|BIT14|BIT15, GPIO_PMD_OUTPUT); // B_2002
PA13 = 0;
PA14 = 0;
PA15 = 0;
GPIO_SetMode(PC, BIT9|BIT10|BIT11, GPIO_PMD_OUTPUT); // C_2002
PC9 = 0;
PC10 = 0;
PC11 = 0;
GPIO_SetMode(PD, BIT7|BIT14|BIT15, GPIO_PMD_OUTPUT); // D_2002
PD7 = 0;
PD14 = 0;
PD15 = 0;
GPIO_SetMode(PB, BIT6, GPIO_PMD_OUTPUT); // 485 DIR
PB6 = 0;
GPIO_SetMode(PA, BIT10, GPIO_PMD_OPEN_DRAIN); // touch
GPIO_SetMode(PA, BIT11, GPIO_PMD_OPEN_DRAIN);
GPIO_SetMode(PB, BIT12, GPIO_PMD_INPUT); // touch int
GPIO_ENABLE_PULL_UP(PB, BIT12);
GPIO_EnableInt(PB, 12, GPIO_INT_BOTH_EDGE);
GPIO_SetMode(PB, BIT14, GPIO_PMD_INPUT); // ir int
GPIO_ENABLE_PULL_UP(PB, BIT14);
GPIO_EnableInt(PB, 14, GPIO_INT_FALLING);
NVIC_EnableIRQ(GPABC_IRQn);
/* Enable interrupt de-bounce function and select de-bounce sampling cycle time */
GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_HCLK, GPIO_DBCLKSEL_1);
GPIO_ENABLE_DEBOUNCE(PB, BIT12|BIT14);
}
void SYS_Init(void)
{
/* Unlock protected registers */
SYS_UnlockReg();
/* Enable clock source */
CLK_EnableXtalRC(CLK_PWRCTL_LIRC_EN_Msk|CLK_PWRCTL_HIRC_EN_Msk);
/* Waiting for clock source ready */
CLK_WaitClockReady(CLK_CLKSTATUS_LIRC_STB_Msk|CLK_CLKSTATUS_HIRC_STB_Msk);
/* If the defines do not exist in your project, please refer to the related clk.h in the Header folder appended to the tool package. */
/* Set HCLK clock */
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_HCLK_CLK_DIVIDER(1));
/* Enable IP clock */
CLK_EnableModuleClock(GPIO_MODULE);
CLK_EnableModuleClock(WDT_MODULE);
// CLK_EnableModuleClock(I2C0_MODULE);
// CLK_EnableModuleClock(I2C1_MODULE);
// CLK_EnableModuleClock(PWM0_CH23_MODULE);
CLK_EnableModuleClock(PWM1_CH01_MODULE);
CLK_EnableModuleClock(ISP_MODULE);
CLK_EnableModuleClock(SC0_MODULE);
// CLK_EnableModuleClock(SC1_MODULE);
CLK_EnableModuleClock(SRAM_MODULE);
CLK_EnableModuleClock(TICK_MODULE);
CLK_EnableModuleClock(TMR0_MODULE);
CLK_EnableModuleClock(TMR1_MODULE);
CLK_EnableModuleClock(TMR2_MODULE);
// CLK_EnableModuleClock(UART0_MODULE);
CLK_EnableModuleClock(UART1_MODULE);
CLK_EnableModuleClock(WDT_MODULE);
/* Set IP clock */
// CLK_SetModuleClock(PWM0_CH23_MODULE, CLK_CLKSEL1_PWM0_CH23_S_HIRC, MODULE_NoMsk);
CLK_SetModuleClock(PWM1_CH01_MODULE, CLK_CLKSEL2_PWM1_CH01_S_HIRC, MODULE_NoMsk);
CLK_SetModuleClock(SC0_MODULE, CLK_CLKSEL2_SC_S_HIRC, CLK_SC0_CLK_DIVIDER(6));
// CLK_SetModuleClock(SC1_MODULE, CLK_CLKSEL2_SC_S_HIRC, CLK_SC1_CLK_DIVIDER(1));
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HIRC, MODULE_NoMsk);
CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1_S_HIRC, MODULE_NoMsk);
CLK_SetModuleClock(TMR2_MODULE, CLK_CLKSEL2_TMR2_S_HIRC, MODULE_NoMsk);
// CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_UART_CLK_DIVIDER(1));
CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_UART_CLK_DIVIDER(1));
CLK_SetModuleClock(WDT_MODULE, 0, 0);
/* Update System Core Clock */
/* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
SystemCoreClockUpdate();
//If the defines do not exist in your project, please refer to the corresponding sys.h in the Header folder appended to the tool package.
SYS->PA_H_MFP = SYS_PA_H_MFP_PA9_MFP_SC0_DAT | SYS_PA_H_MFP_PA8_MFP_SC0_CLK;
SYS->PB_H_MFP = SYS_PB_H_MFP_PB11_MFP_PWM1_CH0;
SYS->PB_L_MFP = SYS_PB_L_MFP_PB5_MFP_UART1_TX | SYS_PB_L_MFP_PB4_MFP_UART1_RX ;
SYS->PC_H_MFP = 0x00000000;
SYS->PC_L_MFP = 0x00000000;
SYS->PD_H_MFP = 0x00000000;
SYS->PD_L_MFP = 0x00000000;
SYS->PE_L_MFP = 0x00000000;
SYS->PF_L_MFP = SYS_PF_L_MFP_PF1_MFP_ICE_CLK | SYS_PF_L_MFP_PF0_MFP_ICE_DAT;
/* Lock protected registers */
SYS_LockReg();
return;
}
extern uint8_t Main_Modbus_ID;
void Processor_Init(void)
{
// 0 1 2 3 4 5 6 7 8 9 , ' ' , E , A
uint8_t eep_check[20];
uint8_t i;
Power_On = 0;
Tx_Run_Mode = 0;
Tx_Fan_Speed = 0;
Tx_Reservation_Hour = 0;
Led_OnOff(100,1);//all on
Disp_Segdata(0, 8, 8, 8, 8);
Disp_Segdata(1, 8, 8, 8, 8);
Disp_Segdata(2, 8, 8, 8, 8);
for(i=0; i<10; i++)Display_process();
touch_i2c_init() ;
Melody_Mode = MELODY_TOUCH;
delay_ms(2000);
Led_OnOff(100, 0); // all off
Disp_Segdata(0, 14, 14, 5, 2); // s2
Disp_Segdata(1, 1, 0, 0, 0); // 1000
Disp_Segdata(2, 16, 13, ROOMCON_VERSION>>4, ROOMCON_VERSION&0x0F); // R-01
for(i=0; i<10; i++)Display_process();
delay_ms(2000);
power_off_process();
////////////////////////////////////////////////////////////
for(i=0; i<10; i++)
{
Read_Data(i, &eep_check[i]);
}
if((eep_check[EEP_ADDR_START] == 0x55)&&(eep_check[EEP_ADDR_START+1] == 0xAA))
{
// Main_Modbus_ID = eep_check[EEP_ADDR_MODBUS_ID];
}
else
{
Main_Modbus_ID = 1;
Write_Data(EEP_ADDR_START, 0x55);
Write_Data(EEP_ADDR_START+1, 0xAA);
// Write_Data(EEP_ADDR_MODBUS_ID, Main_Modbus_ID);
}
}
extern uint16_t Pm_1_0_value, Pm_2_5_value, Pm_10_value;
extern uint16_t CO2_Value;
uint8_t CO2_quality = 0;
uint8_t PM2_5_quality = 0;
uint8_t PM10_quality = 0;
uint8_t temp_fan_speed = 0;
uint8_t temp_pm_quality = 0;
#define CO2_HISTERISE 0
#define DUST_HISTERISE 0
void Air_Quality_process(void)
{
if(Power_On == 1)
{
if(CO2_Value <= 500-CO2_HISTERISE) CO2_quality = 0;
else if((CO2_Value > 500+CO2_HISTERISE)&&(CO2_Value <= 1000-CO2_HISTERISE)) CO2_quality = 0x01;
else if((CO2_Value > 1000+CO2_HISTERISE)&&(CO2_Value <= 1500-CO2_HISTERISE)) CO2_quality = 0x02;
else if(CO2_Value > 1500+CO2_HISTERISE)CO2_quality = 0x04;
//2020.5.26 PM2.5 기준변경
if(Pm_2_5_value <= 15-DUST_HISTERISE) PM2_5_quality = 0;
else if((Pm_2_5_value > 15+DUST_HISTERISE)&&(Pm_2_5_value <= 35-DUST_HISTERISE)) PM2_5_quality = 0x01;
else if((Pm_2_5_value > 35+DUST_HISTERISE)&&(Pm_2_5_value <= 75-DUST_HISTERISE)) PM2_5_quality = 0x02;
else if(Pm_2_5_value > 75+DUST_HISTERISE)PM2_5_quality = 0x04;
if(Pm_10_value <= 30-DUST_HISTERISE) PM10_quality = 0;
else if((Pm_10_value > 30+DUST_HISTERISE)&&(Pm_10_value <= 80-DUST_HISTERISE)) PM10_quality = 0x01;
else if((Pm_10_value > 80+DUST_HISTERISE)&&(Pm_10_value <= 150-DUST_HISTERISE)) PM10_quality = 0x02;
else if(Pm_10_value > 150+DUST_HISTERISE)PM10_quality = 0x04;
temp_pm_quality = PM2_5_quality | PM10_quality;
if(Tx_Run_Mode == MODE_AUTO)
{
if(CO2_quality == 0)
{
if(temp_pm_quality < 1)temp_fan_speed = 0;
else if(temp_pm_quality < 2)temp_fan_speed = 2;
else if(temp_pm_quality < 4)temp_fan_speed = 3;
else temp_fan_speed = 4;
}
else
{
if(CO2_quality == 0x01)
{
if(temp_pm_quality < 2)temp_fan_speed = 2;
else if(temp_pm_quality < 4)temp_fan_speed = 3;
else temp_fan_speed = 4;
}
else if(CO2_quality == 0x02)
{
if(temp_pm_quality < 4)temp_fan_speed = 3;
else temp_fan_speed = 4;
}
else if(CO2_quality == 0x04)
{
temp_fan_speed = 4;
}
}
Tx_Fan_Speed = temp_fan_speed;
}
}
}
extern uint8_t Blinking_Count, Blink_Toggle;
extern volatile uint8_t Filter_Reset_Flag;
extern volatile uint8_t Tx_Mode_Event , Tx_Fan_Event , Tx_Reserve_Event ;
volatile uint16_t Fan_Setting_Timer = 0;
void IR_Remocon_process(void)
{
switch(IR_Event_Code)
{
case IR_EVENT_POWER:
if(Power_On == 0)power_on_process();
else power_off_process();
break;
case IR_EVENT_WIND_UP:
if(Power_On == 1)
{
if((Tx_Run_Mode == MODE_AUTO)||(Tx_Run_Mode == MODE_BYPASS))
{
Melody_Mode = MELODY_NG;
}
else
{
if(Tx_Fan_Speed<5)Tx_Fan_Speed++;
Tx_Fan_Event = TX_EVENT;
Melody_Mode = MELODY_TOUCH;
}
}
break;
case IR_EVENT_WIND_DN:
if(Power_On == 1)
{
if((Tx_Run_Mode == MODE_AUTO)||(Tx_Run_Mode == MODE_BYPASS))
{
Melody_Mode = MELODY_NG;
}
else
{
if(Tx_Fan_Speed > 1)Tx_Fan_Speed--;
Tx_Fan_Event = TX_EVENT;
Melody_Mode = MELODY_TOUCH;
}
}
break;
case IR_EVENT_TIME_1:
if(Power_On == 1)
{
if(Tx_Reservation_Hour == 1)Tx_Reservation_Hour = 0;
else Tx_Reservation_Hour = 1;
if(Blinking_Count == 0)
{
Blink_Timer = 0;
Blink_Toggle = 0;
}
Blinking_Count = 3;
Melody_Mode = MELODY_TOUCH;
Tx_Reserve_Event = TX_EVENT;
}
break;
case IR_EVENT_TIME_2:
if(Power_On == 1)
{
if(Tx_Reservation_Hour == 4)Tx_Reservation_Hour = 0;
else Tx_Reservation_Hour = 4;
if(Blinking_Count == 0)
{
Blink_Timer = 0;
Blink_Toggle = 0;
}
Blinking_Count = 3;
Melody_Mode = MELODY_TOUCH;
Tx_Reserve_Event = TX_EVENT;
}
break;
case IR_EVENT_TIME_3:
if(Power_On == 1)
{
if(Tx_Reservation_Hour == 8)Tx_Reservation_Hour = 0;
else Tx_Reservation_Hour = 8;
if(Blinking_Count == 0)
{
Blink_Timer = 0;
Blink_Toggle = 0;
}
Blinking_Count = 3;
Melody_Mode = MELODY_TOUCH;
Tx_Reserve_Event = TX_EVENT;
}
break;
case IR_EVENT_MODE:
if(Power_On == 1)
{
if(Tx_Run_Mode == MODE_VENT)Tx_Run_Mode = MODE_AUTO;
else if(Tx_Run_Mode == MODE_AUTO)Tx_Run_Mode = MODE_VENT;
Tx_Reservation_Hour = 0;
Tx_Fan_Speed = 3;
Tx_Mode_Event = TX_EVENT;
Tx_Fan_Event = TX_EVENT;
Tx_Reserve_Event = TX_EVENT;
Melody_Mode = MELODY_TOUCH;
}
break;
case IR_EVENT_FILTER_RESET:
Filter_Reset_Flag = 1;
Melody_Mode = MELODY_TOUCH;
break;
default:
break;
}
if(IR_Event_Code)IR_Event_Code = 0;
}
@@ -0,0 +1,154 @@
/**************************************************************************//**
* @file main.c
* @version V1.00
* $Revision: 4 $
* $Date: 14/09/11 5:23p $
* @brief Show how to pixel on and off on LCD panel.
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#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 "EEPROM_Emulate.h"
#include "My_define.h"
#define __wdt_setting() SYS_UnlockReg(); WDT_Open(WDT_TIMEOUT_2POW14, 0, TRUE, FALSE); SYS_LockReg();
#define __wdt_reset() SYS_UnlockReg(); WDT_RESET_COUNTER(); SYS_LockReg();
extern volatile uint8_t Run_Timer;
extern volatile uint16_t mSec_Timer;
extern volatile uint16_t Blink_Timer;
extern volatile uint8_t Tx_Reservation_Hour, Rx_Reservation_Hour;
extern volatile uint8_t Reservation_Min;
extern volatile uint8_t Rx_Main_complete;
extern volatile uint8_t Tx_Data_Mode;
extern volatile uint8_t Tx_Main_Event_Flag;
extern uint16_t Main_Err_Code;
uint8_t Sec_Timer = 0;
uint8_t Blink_Toggle = 0;
uint8_t Blinking_Count = 0;
uint8_t In_Com_Error_Count = 0;
uint8_t Out_Com_Error_Count = 0;
uint8_t Sensor_Error_Count = 0;
extern volatile uint8_t IR_Event_Flag;
extern volatile uint8_t Rx_wifi_complete;
extern volatile uint16_t FastBlink_Timer;
uint8_t FastBlink_Toggle;
uint32_t Reset_src_value = 0;
void main(void)
{
__disable_interrupt();
SYS_Init();
SYS_EnableBOD(SYS_BODCTL_BOD25_RST_EN_Msk, SYS_BODCTL_BOD25_EN_Msk);
// ADC_Init();
GPIO_Init();
PWM_Init();
Timer0_Init();
Timer1_Init();
Timer2_Init();
// UART0_Init(); //
UART1_Init(); // to rs485 - internal
SC0_Init(); // to external
//SC1_Init(); // to wifi
Init_EEPROM(eep_data_size, eep_page_amount);
Search_Valid_Page();
__enable_interrupt();
Reset_src_value = SYS_GetResetSrc();
if((Reset_src_value & 0x00000037) != 0x00000004) // WDT reset
{
Processor_Init();
}
SYS_ClearResetSrc(Reset_src_value);
__wdt_setting();
Tx_Data_Mode = TX_DATA_MODE_REQUEST1;
while(1)
{
Touch_process();
com_rs485_process();
if(IR_Event_Flag == 1)
{
IR_Event_Flag = 0;
IR_Remocon_process();
}
if(Run_Timer == 0)
{
Run_Timer = 25;
Display_update();
Display_process();
}
if(mSec_Timer == 0)
{
mSec_Timer = 999;
if(In_Com_Error_Count++ >= 10){In_Com_Error_Count = 10;Main_Err_Code |= ERROR_IN_COM;}
if(Sensor_Error_Count++ >= 10){Sensor_Error_Count = 10;Main_Err_Code |= ERROR_CO2|ERROR_DUST;}
Air_Quality_process();
}
if(FastBlink_Timer == 0)
{
FastBlink_Timer = 249;
FastBlink_Toggle ^= 1;
}
if(Blink_Timer == 0)
{
Blink_Timer = 499;
if(Blink_Toggle == 0)
{
Blink_Toggle = 1;
}
else
{
Blink_Toggle = 0;
if(Blinking_Count)
{
Blinking_Count--;
}
}
__wdt_reset();
}
}
}
@@ -0,0 +1,986 @@
#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 "EEPROM_Emulate.h"
#include "My_define.h"
void Initial_Signal();
void Disp_Segdata(uint8_t Sel, uint8_t digit4, uint8_t digit3, uint8_t digit2, uint8_t digit1);
void Led_OnOff(uint8_t kind, uint8_t onoff);
uint8_t Font_Data[18]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67,\
0x80, 0x58, 0x79, 0x40, 0x00, 0x50, 0x77, 0x5E };
// . , c , E , - , ' ' , r , A , d
uint8_t seg_data[4][14];
#define A_DATA PA4
#define A_CLK PA3
#define A_STB PA2
#define B_DATA PA13
#define B_CLK PA14
#define B_STB PA15
#define C_DATA PC9
#define C_CLK PC10
#define C_STB PC11
#define D_DATA PD15
#define D_CLK PD14
#define D_STB PD7
void Initial_Signal()
{
uint8_t i;
A_CLK = 1;B_CLK = 1;C_CLK = 1;D_CLK = 1;
A_STB = 1;B_STB = 1;C_STB = 1;D_STB = 1;
for(i=0; i<8; i++) //command 1 (#0000_0001B) -> 5grid 8seg
{
A_STB = 0;B_STB = 0;C_STB = 0;D_STB = 0;
A_CLK = 0;B_CLK = 0;C_CLK = 0;D_CLK = 0;
if(i==0)
{
A_DATA = 1;B_DATA = 1;C_DATA = 1;D_DATA = 1;
}
else
{
A_DATA = 0;B_DATA = 0;C_DATA = 0;D_DATA = 0;
}
A_CLK = 1;B_CLK = 1;C_CLK = 1;D_CLK = 1;
}
A_STB = 1;B_STB = 1;C_STB = 1;D_STB = 1;
for(i=0; i<8; i++) //command 2 (#0100_0000B)
{
A_STB = 0;B_STB = 0;C_STB = 0;D_STB = 0;
A_CLK = 0;B_CLK = 0;C_CLK = 0;D_CLK = 0;
if(i==6)
{
A_DATA = 1;B_DATA = 1;C_DATA = 1;D_DATA = 1;
}
else
{
A_DATA = 0;B_DATA = 0;C_DATA = 0;D_DATA = 0;
}
A_CLK = 1;B_CLK = 1;C_CLK = 1;D_CLK = 1;
}
A_STB = 1;B_STB = 1;C_STB = 1;D_STB = 1;
for(i=0; i<8; i++) //command 3 (#1100_0000B)
{
A_STB = 0;B_STB = 0;C_STB = 0;D_STB = 0;
A_CLK = 0;B_CLK = 0;C_CLK = 0;D_CLK = 0;
if(i==6 || i==7)
{
A_DATA = 1;B_DATA = 1;C_DATA = 1;D_DATA = 1;
}
else
{
A_DATA = 0;B_DATA = 0;C_DATA = 0;D_DATA = 0;
}
A_CLK = 1;B_CLK = 1;C_CLK = 1;D_CLK = 1;
}
// A_STB = 1;B_STB = 1;C_STB = 1;D_STB = 1;
for(i=0; i<112; i++) //data
{
A_STB = 0;B_STB = 0;C_STB = 0;D_STB = 0;
A_CLK = 0;B_CLK = 0;C_CLK = 0;D_CLK = 0;
A_DATA = 0;B_DATA = 0;C_DATA = 0;D_DATA = 0;
A_CLK = 1;B_CLK = 1;C_CLK = 1;D_CLK = 1;
}
A_STB = 1;B_STB = 1;C_STB = 1;D_STB = 1;
for(i=0; i<8; i++) //command 4 (#1000_0100B)
{
A_STB = 0;B_STB = 0;C_STB = 0;D_STB = 0;
A_CLK = 0;B_CLK = 0;C_CLK = 0;D_CLK = 0;
if(i==3 || i==7)
{
A_DATA = 1;B_DATA = 1;C_DATA = 1;D_DATA = 1;
}
else
{
A_DATA = 0;B_DATA = 0;C_DATA = 0;D_DATA = 0;
}
A_CLK = 1;B_CLK = 1;C_CLK = 1;D_CLK = 1;
}
A_STB = 1;B_STB = 1;C_STB = 1;D_STB = 1;
}
uint16_t one_sec = 0;
extern uint8_t Tmperature_Error;
void Disp_Segdata(uint8_t Sel, uint8_t digit4, uint8_t digit3, uint8_t digit2, uint8_t digit1)
{
seg_data[Sel][0] = Font_Data[digit4];
seg_data[Sel][1] = Font_Data[digit4]>>3;
seg_data[Sel][2] = Font_Data[digit3];
seg_data[Sel][3] = Font_Data[digit3]>>3;
seg_data[Sel][4] = Font_Data[digit2];
seg_data[Sel][5] = Font_Data[digit2]>>3;
seg_data[Sel][6] = Font_Data[digit1];
seg_data[Sel][7] = Font_Data[digit1]>>3;
}
enum{
K_VENT,
K_AUTO,
K_AIR,
K_WIND1,
K_WIND2,
K_WIND3,
K_WIND4,
K_WIND5,
K_PM25_1,
K_PM25_2,
K_PM25_4,
K_PM25_3,
K_PM10_1,
K_PM10_2,
K_PM10_4,
K_PM10_3,
K_TIME_1,
K_TIME_4,
K_TIME_8,
K_LOCK,
K_JUMKEOM,
K_FILTER_CLEAN,
K_FILTER_CHANGE,
K_EXTRA1,
K_CO2_1,
K_CO2_2,
K_CO2_4,
K_CO2_3,
K_SOJA_CLEAN,
K_SOJA_CHANGE,
K_IOT,
K_EXTRA2,
};
void Led_OnOff(uint8_t kind, uint8_t onoff)
{
if(onoff == 1)
{
if(kind < 6)
{
seg_data[3][0] |= 0x01<<kind;
}
else if(kind < 8)
{
seg_data[3][1] |= 0x01<<(kind-3);
}
else if(kind < 14)
{
seg_data[3][2] |= 0x01<<(kind-8);
}
else if(kind < 16)
{
seg_data[3][3] |=0x01<<(kind-8-3);
}
else if(kind < 22)
{
seg_data[3][4] |= 0x01<<(kind-16);
}
else if(kind < 24)
{
seg_data[3][5] |=0x01<<(kind-16-3);
}
else if(kind < 30)
{
seg_data[3][6] |= 0x01<<(kind-24);
}
else if(kind < 32)
{
seg_data[3][7] |=0x01<<(kind-24-3);
}
else // all on
{
seg_data[3][0] = 0xFF;
seg_data[3][1] = 0xFF;
seg_data[3][2] = 0xFF;
seg_data[3][3] = 0xFF;
seg_data[3][4] = 0xFF;
seg_data[3][5] = 0xFF;
seg_data[3][6] = 0xFF;
seg_data[3][7] = 0xFF;
}
}
else
{
if(kind < 6)
{
seg_data[3][0] &= ~(0x01<<kind);
}
else if(kind < 8)
{
seg_data[3][1] &= ~(0x01<<(kind-3));
}
else if(kind < 14)
{
seg_data[3][2] &= ~(0x01<<(kind-8));
}
else if(kind < 16)
{
seg_data[3][3] &= ~(0x01<<(kind-8-3));
}
else if(kind < 22)
{
seg_data[3][4] &= ~(0x01<<kind-16);
}
else if(kind < 24)
{
seg_data[3][5] &= ~(0x01<<(kind-16-3));
}
else if(kind < 30)
{
seg_data[3][6] &= ~(0x01<<kind-24);
}
else if(kind < 32)
{
seg_data[3][7] &= ~(0x01<<(kind-24-3));
}
else // all off
{
seg_data[3][0] = 0;
seg_data[3][1] = 0;
seg_data[3][2] = 0;
seg_data[3][3] = 0;
seg_data[3][4] = 0;
seg_data[3][5] = 0;
seg_data[3][6] = 0;
seg_data[3][7] = 0;
} }
}
void Make_A(void)
{
uint8_t i,j;
uint8_t Mask;
A_STB = 1;
A_CLK = 1;
for(i=0; i<8; i++) //command 1 (#0000_0011B)
{
A_STB = 0;
A_CLK = 0;
if( i==0) //5grid, 8segment
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
A_STB = 1;
for(i=0; i<8; i++) //command 2 (#0100_0000B)
{
A_STB = 0;
A_CLK = 0;
if(i==6) //command2:01
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
A_STB = 1;
for(i=0; i<8; i++) //command 3 (#1100_0000B)
{
A_STB = 0;
A_CLK = 0;
if(i==6 || i==7)
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
for(i=0; i<14; i++)
{
Mask = 0x01;
for(j=0; j<8; j++)
{
A_STB = 0;
A_CLK = 0;
if(seg_data[0][i] & Mask)A_DATA = 1;
else A_DATA = 0;
A_CLK = 1;
Mask <<= 1;
}
}
A_STB = 1;
for(i=0; i<8; i++) //command 4 (#1000_0100B)
{
A_STB = 0;
A_CLK = 0;
if(i==0 ||i==1 ||i==2 ||i==3 || i==7) //pulse width=14/16
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
A_STB = 1;
}
void Make_B(void)
{
uint8_t i,j;
uint8_t Mask;
B_STB = 1;
B_CLK = 1;
for(i=0; i<8; i++) //command 1 (#0000_0011B)
{
B_STB = 0;
B_CLK = 0;
if( i==0) //5grid, 8segment
B_DATA = 1;
else
B_DATA = 0;
B_CLK = 1;
}
B_STB = 1;
for(i=0; i<8; i++) //command 2 (#0100_0000B)
{
B_STB = 0;
B_CLK = 0;
if(i==6) //command2:01
B_DATA = 1;
else
B_DATA = 0;
B_CLK = 1;
}
B_STB = 1;
for(i=0; i<8; i++) //command 3 (#1100_0000B)
{
B_STB = 0;
B_CLK = 0;
if(i==6 || i==7)
B_DATA = 1;
else
B_DATA = 0;
B_CLK = 1;
}
for(i=0; i<14; i++)
{
Mask = 0x01;
for(j=0; j<8; j++)
{
B_STB = 0;
B_CLK = 0;
if(seg_data[1][i] & Mask)B_DATA = 1;
else B_DATA = 0;
B_CLK = 1;
Mask <<= 1;
}
}
B_STB = 1;
for(i=0; i<8; i++) //command 4 (#1000_0100B)
{
B_STB = 0;
B_CLK = 0;
if(i==0 ||i==1 ||i==2 ||i==3 || i==7) //pulse width=14/16
B_DATA = 1;
else
B_DATA = 0;
B_CLK = 1;
}
B_STB = 1;
}
void Make_C(void)
{
uint8_t i,j;
uint8_t Mask;
C_STB = 1;
C_CLK = 1;
for(i=0; i<8; i++) //command 1 (#0000_0011B)
{
C_STB = 0;
C_CLK = 0;
if( i==0) //5grid, 8segment
C_DATA = 1;
else
C_DATA = 0;
C_CLK = 1;
}
C_STB = 1;
for(i=0; i<8; i++) //command 2 (#0100_0000B)
{
C_STB = 0;
C_CLK = 0;
if(i==6) //command2:01
C_DATA = 1;
else
C_DATA = 0;
C_CLK = 1;
}
C_STB = 1;
for(i=0; i<8; i++) //command 3 (#1100_0000B)
{
C_STB = 0;
C_CLK = 0;
if(i==6 || i==7)
C_DATA = 1;
else
C_DATA = 0;
C_CLK = 1;
}
for(i=0; i<14; i++)
{
Mask = 0x01;
for(j=0; j<8; j++)
{
C_STB = 0;
C_CLK = 0;
if(seg_data[2][i] & Mask)C_DATA = 1;
else C_DATA = 0;
C_CLK = 1;
Mask <<= 1;
}
}
C_STB = 1;
for(i=0; i<8; i++) //command 4 (#1000_0100B)
{
C_STB = 0;
C_CLK = 0;
if(i==0 ||i==1 ||i==2 ||i==3 || i==7) //pulse width=14/16
C_DATA = 1;
else
C_DATA = 0;
C_CLK = 1;
}
C_STB = 1;
}
void Make_D(void)
{
uint8_t i,j;
uint8_t Mask;
D_STB = 1;
D_CLK = 1;
for(i=0; i<8; i++) //command 1 (#0000_0011B)
{
D_STB = 0;
D_CLK = 0;
if( i==0) //5grid, 8segment
D_DATA = 1;
else
D_DATA = 0;
D_CLK = 1;
}
D_STB = 1;
for(i=0; i<8; i++) //command 2 (#0100_0000B)
{
D_STB = 0;
D_CLK = 0;
if(i==6) //command2:01
D_DATA = 1;
else
D_DATA = 0;
D_CLK = 1;
}
D_STB = 1;
for(i=0; i<8; i++) //command 3 (#1100_0000B)
{
D_STB = 0;
D_CLK = 0;
if(i==6 || i==7)
D_DATA = 1;
else
D_DATA = 0;
D_CLK = 1;
}
for(i=0; i<14; i++)
{
Mask = 0x01;
for(j=0; j<8; j++)
{
D_STB = 0;
D_CLK = 0;
if(seg_data[3][i] & Mask)D_DATA = 1;
else D_DATA = 0;
D_CLK = 1;
Mask <<= 1;
}
}
D_STB = 1;
for(i=0; i<8; i++) //command 4 (#1000_0100B)
{
D_STB = 0;
D_CLK = 0;
if(i==0 ||i==1 ||i==2 ||i==3 || i==7) //pulse width=14/16
D_DATA = 1;
else
D_DATA = 0;
D_CLK = 1;
}
D_STB = 1;
}
extern volatile uint8_t Power_On;
extern volatile uint8_t Tx_Run_Mode;
extern volatile uint8_t Tx_Fan_Speed;
extern volatile uint8_t Tx_Reservation_Hour;
extern uint16_t Pm_1_0_value, Pm_2_5_value, Pm_10_value;
extern uint16_t CO2_Value;
extern uint8_t CO2_quality;
extern uint8_t PM2_5_quality;
extern uint8_t PM10_quality;
extern uint8_t Kids_Lock;
extern uint16_t Main_Err_Code;
extern uint8_t Vsp_Mode;
extern uint8_t Test_Mode_Step;
extern uint8_t Test_Mode_Sa_Ea_Sel;
extern uint8_t Main_Modbus_ID;
extern uint8_t Ventilation_SA[5];
extern uint8_t Ventilation_EA[5];
extern uint8_t AirClean_SA[5];
extern uint8_t AirClean_EA[5];
extern uint8_t Bypass_SA[5];
extern uint8_t Bypass_EA[5];
extern uint16_t SA_rpm, EA_rpm;
extern uint8_t Wifi_Status;
extern uint8_t Blink_Toggle, FastBlink_Toggle;
void Display_update(void)
{
uint8_t Num_1000, Num_100, Num_10, Num_1;
uint8_t Tmp_Speed = 0;
uint16_t Err;
if(Vsp_Mode == TX_DATA_MODE_SETTING)
{
Led_OnOff(100, 0); // all off
Disp_Segdata(2, 14, 14, 14, 14); // ALL OFF
if((Test_Mode_Step >= 1)&&(Test_Mode_Step <= 5)) // vent
{
Led_OnOff(K_VENT, 1);
Tmp_Speed = Test_Mode_Step-1;
if(Test_Mode_Sa_Ea_Sel == 0)
{
Disp_Segdata(0, 14, 5, 16, 14); // " SA "
Num_10 = Ventilation_SA[Tmp_Speed]%100/10;
Num_1 = Ventilation_SA[Tmp_Speed]%10;
Disp_Segdata(1, 14, 14, Num_10, Num_1);
Num_1000 = (uint8_t)(SA_rpm%10000/1000);
Num_100 = (uint8_t)(SA_rpm%1000/100);
Num_10 = (uint8_t)(SA_rpm%100/10);
Num_1 = (uint8_t)(SA_rpm%10);
Disp_Segdata(2, Num_1000, Num_100, Num_10, Num_1);
}
else
{
Disp_Segdata(0, 14, 12, 16, 14); // " EA "
Num_10 = Ventilation_EA[Tmp_Speed]%100/10;
Num_1 = Ventilation_EA[Tmp_Speed]%10;
Disp_Segdata(1, 14, 14, Num_10, Num_1);
Num_1000 = (uint8_t)(EA_rpm%10000/1000);
Num_100 = (uint8_t)(EA_rpm%1000/100);
Num_10 = (uint8_t)(EA_rpm%100/10);
Num_1 = (uint8_t)(EA_rpm%10);
Disp_Segdata(2, Num_1000, Num_100, Num_10, Num_1);
}
}
else if((Test_Mode_Step >= 6)&&(Test_Mode_Step <= 10)) // air
{
Led_OnOff(K_AIR, 1);
Tmp_Speed = Test_Mode_Step-6;
if(Test_Mode_Sa_Ea_Sel == 0)
{
Disp_Segdata(0, 14, 5, 16, 14); // " SA "
Num_10 = AirClean_SA[Tmp_Speed]%100/10;
Num_1 = AirClean_SA[Tmp_Speed]%10;
Disp_Segdata(1, 14, 14, Num_10, Num_1);
Num_1000 = (uint8_t)(SA_rpm%10000/1000);
Num_100 = (uint8_t)(SA_rpm%1000/100);
Num_10 = (uint8_t)(SA_rpm%100/10);
Num_1 = (uint8_t)(SA_rpm%10);
Disp_Segdata(2, Num_1000, Num_100, Num_10, Num_1);
}
else
{
Disp_Segdata(0, 14, 12, 16, 14); // " EA "
Num_10 = AirClean_EA[Tmp_Speed]%100/10;
Num_1 = AirClean_EA[Tmp_Speed]%10;
Disp_Segdata(1, 14, 14, Num_10, Num_1);
Num_1000 = (uint8_t)(EA_rpm%10000/1000);
Num_100 = (uint8_t)(EA_rpm%1000/100);
Num_10 = (uint8_t)(EA_rpm%100/10);
Num_1 = (uint8_t)(EA_rpm%10);
Disp_Segdata(2, Num_1000, Num_100, Num_10, Num_1);
}
}
switch(Test_Mode_Step)
{
case 1:
case 6:
case 11:
Led_OnOff(K_WIND1, 1);
break;
case 2:
case 7:
case 12:
Led_OnOff(K_WIND2, 1);
break;
case 3:
case 8:
case 13:
Led_OnOff(K_WIND3, 1);
break;
case 4:
case 9:
case 14:
Led_OnOff(K_WIND4, 1);
break;
case 5:
case 10:
case 15:
Led_OnOff(K_WIND5, 1);
break;
case 16:
Disp_Segdata(0, 14, 1, 17, 14); // " Id "
Num_10 = Main_Modbus_ID%100/10;
Num_1 = Main_Modbus_ID%10;
Disp_Segdata(1, 14, 14, Num_10, Num_1);
break;
case 0x11:
if(Main_BxD_FW_Version[1] == 'J')Num_1000 = 18; //J
else if(Main_BxD_FW_Version[1] == 'I')Num_1000 = 1; //I
else Num_1000 = 13; //-
Num_10 = Main_BxD_FW_Version[2]/10;
Num_1 = Main_BxD_FW_Version[2]%10;
Disp_Segdata(0, Num_1000, 13, Num_10, Num_1); // " J- " 메인 버전
Num_10 = ROOMCON_FW_VERSION/10;
Num_1 = ROOMCON_FW_VERSION%10;
Disp_Segdata(1, 1, 13, Num_10, Num_1); // " I- " 룸콘 버전
Num_10 = Sensor_BxD_Version/10;
Num_1 = Sensor_BxD_Version%10;
Disp_Segdata(2, 5, 13, Num_10, Num_1); // " S- " 센서보드 버전
break;
default:
break;
}
return;
}
////////////////////////////////////////////////////////////////
Led_OnOff(100, 0); // all off
if(Wifi_Status == 1) // connect
{
Led_OnOff(K_IOT, 1);
}
else if(Wifi_Status == 2) // wait slow
{
Led_OnOff(K_IOT, Blink_Toggle);
}
else if(Wifi_Status == 3) // fast
{
Led_OnOff(K_IOT, FastBlink_Toggle);
}
else // dis connect
{
Led_OnOff(K_IOT, 0);
}
Err = Main_Err_Code&(ERROR_FILTER_CLEAN|ERROR_FILTER_CHANGE|ERROR_SOJA_CHANGE|ERROR_SA|ERROR_EA|ERROR_TEMP|ERROR_CO2|ERROR_DUST|ERROR_IN_COM);
if(Err)Led_OnOff(K_JUMKEOM, 1);
////////////////////////////////////////////////////////////////
if(Power_On == 0)
{
Disp_Segdata(0, 14, 14, 14, 14); // ALL OFF
Disp_Segdata(1, 14, 14, 14, 14); // ALL OFF
Disp_Segdata(2, 14, 14, 14, 14); // ALL OFF
if(Main_Err_Code)Led_OnOff(K_JUMKEOM, 1);
if(Main_Err_Code&ERROR_FILTER_CLEAN)
{
Led_OnOff(K_FILTER_CLEAN, 1);
Led_OnOff(K_SOJA_CLEAN, 1);
}
else if(Main_Err_Code&ERROR_FILTER_CHANGE)
{
Led_OnOff(K_FILTER_CHANGE, 1);
}
else if(Main_Err_Code&ERROR_SOJA_CHANGE)
{
Led_OnOff(K_SOJA_CHANGE, 1);
}
else if(Main_Err_Code&ERROR_SA)
{
Disp_Segdata(1, 12, 13, 0, 9); // E-09
}
else if(Main_Err_Code&ERROR_EA)
{
Disp_Segdata(1, 12, 13, 1, 0); // E-10
}
else if(Main_Err_Code&ERROR_TEMP)
{
Disp_Segdata(1, 12, 13, 0, 2); // E-02
}
else if(Main_Err_Code&ERROR_HUMI)
{
;
}
else if(Main_Err_Code&ERROR_TVOC)
{
;
}
else if(Main_Err_Code&ERROR_CO2)
{
Disp_Segdata(1, 12, 13, 0, 6); // E-06
}
else if(Main_Err_Code&ERROR_DUST)
{
Disp_Segdata(1, 12, 13, 1, 8); // E-08
}
else if(Main_Err_Code&ERROR_IN_COM)
{
Disp_Segdata(1, 12, 13, 0, 7); // E-07
}
return;
}
Num_1000= Num_100= Num_10= Num_1= 14; // blank
if(CO2_Value>=1000)Num_1000 = CO2_Value%10000/1000;
if(CO2_Value>=100)Num_100 = CO2_Value%1000/100;
if(CO2_Value>=10)Num_10 = CO2_Value%100/10;
Num_1 = CO2_Value%10;
Disp_Segdata(2, Num_1000, Num_100, Num_10, Num_1);
Num_1000= Num_100= Num_10= Num_1= 14; // blank
if(Pm_10_value>=1000)Num_1000 = Pm_10_value%10000/1000;
if(Pm_10_value>=100)Num_100 = Pm_10_value%1000/100;
if(Pm_10_value>=10)Num_10 = Pm_10_value%100/10;
Num_1 = Pm_10_value%10;
Disp_Segdata(1, Num_1000, Num_100, Num_10, Num_1);
Num_1000= Num_100= Num_10= Num_1= 14; // blank
if(Pm_2_5_value>=1000)Num_1000 = Pm_2_5_value%10000/1000;
if(Pm_2_5_value>=100)Num_100 = Pm_2_5_value%1000/100;
if(Pm_2_5_value>=10)Num_10 = Pm_2_5_value%100/10;
Num_1 = Pm_2_5_value%10;
Disp_Segdata(0, Num_1000, Num_100, Num_10, Num_1);
switch(CO2_quality)
{
case 0x00: Led_OnOff(K_CO2_1, 1);break;
case 0x01: Led_OnOff(K_CO2_2, 1);break;
case 0x02: Led_OnOff(K_CO2_3, 1);break;
case 0x04:
default:
Led_OnOff(K_CO2_3, 1);
Led_OnOff(K_CO2_4, 1);
break;
}
switch(PM2_5_quality)
{
case 0x00: Led_OnOff(K_PM25_1, 1);break;
case 0x01: Led_OnOff(K_PM25_2, 1); break;
case 0x02: Led_OnOff(K_PM25_3, 1); break;
case 0x04:
default:
Led_OnOff(K_PM25_3, 1);
Led_OnOff(K_PM25_4, 1);
break;
}
switch(PM10_quality)
{
case 0:
Led_OnOff(K_PM10_1, 1);
break;
case 0x01:
Led_OnOff(K_PM10_2, 1);
break;
case 0x02:
Led_OnOff(K_PM10_3, 1);
break;
case 0x04:
default:
Led_OnOff(K_PM10_3, 1);
Led_OnOff(K_PM10_4, 1);
break;
}
switch(Tx_Run_Mode)
{
case MODE_VENT: Led_OnOff(K_VENT, 1); break;
case MODE_AUTO: Led_OnOff(K_AUTO, 1);break;
case MODE_AIR_CLEAN: Led_OnOff(K_AIR, 1); break;
default: break;
}
switch(Tx_Fan_Speed)
{
case 1: Led_OnOff(K_WIND1, 1);break;
case 2: Led_OnOff(K_WIND2, 1);break;
case 3: Led_OnOff(K_WIND3, 1);break;
case 4: Led_OnOff(K_WIND4, 1);break;
case 5: Led_OnOff(K_WIND5, 1);break;
default: break;
}
switch(Tx_Reservation_Hour)
{
case 1:
case 2:
case 3:
Led_OnOff(K_TIME_1, 1);
break;
case 4:
case 5:
case 6:
case 7:
Led_OnOff(K_TIME_4, 1);
break;
case 8:
Led_OnOff(K_TIME_8, 1);
break;
default:
break;
}
Led_OnOff(K_LOCK, Kids_Lock);
}
uint8_t Sel_Pos = 0;
void Display_process(void)
{
switch(Sel_Pos)
{
case 0:
Make_A();
Sel_Pos++;
break;
case 1:
Make_B();
Sel_Pos++;
break;
case 2:
Make_C();
Sel_Pos++;
break;
case 3:
default:
Make_D();
Sel_Pos = 0;
break;
}
}

Some files were not shown because too many files have changed in this diff Show More