ПО является неотъемлемой частью увлажнителя RHF-3310S, отдельно потребителю не поставляется и эксплуатируется только в составе устройства.
////////////////////////////////////////////////////////////////
//RHF-3310S
//v2.14
//application.c
////////////////////////////////////////////////////////////////
/*==============================================================
include
==============================================================*/
#include "common.h"
#include "application.h"
#include "api.h"
#include "clk.h"
#include "buz.h"
#include "keyb.h"
#include "display.h"
#include "nrf_soc.h"
#include "adv_data_config.h"
#include "adv_data.h"
////////////////////////////////////////////////////////////////
u8 atomVar, atomPeriod, atomCnt;
u8 uartNoRxCnt;
u8 uartRxBuf[8], uartRxIndex;
static B8 bConnection;
bool bSendNotification = false;//флаг необходимости отправки нотификации
void simple_uart_config(uint8_t rts_pin_number, uint8_t txd_pin_number, uint8_t cts_pin_number, uint8_t rxd_pin_number, bool hwfc)
{
/** @snippet [Configure UART RX and TX pin] */
nrf_gpio_cfg_output(txd_pin_number);
nrf_gpio_cfg_input(rxd_pin_number, NRF_GPIO_PIN_NOPULL);
NRF_UART0->PSELTXD = txd_pin_number;
NRF_UART0->PSELRXD = rxd_pin_number;
/** @snippet [Configure UART RX and TX pin] */
NRF_UART0->CONFIG = 2;
if (hwfc)
{
nrf_gpio_cfg_output(rts_pin_number);
nrf_gpio_cfg_input(cts_pin_number, NRF_GPIO_PIN_NOPULL);
NRF_UART0->PSELCTS = cts_pin_number;
NRF_UART0->PSELRTS = rts_pin_number;
NRF_UART0->CONFIG = (UART_CONFIG_HWFC_Enabled << UART_CONFIG_HWFC_Pos);
}
NRF_UART0->BAUDRATE = (UART_BAUDRATE_BAUDRATE_Baud19200<< UART_BAUDRATE_BAUDRATE_Pos);
NRF_UART0->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos);
NRF_UART0->TASKS_STARTTX = 0;
NRF_UART0->TASKS_STARTRX = 1;
NRF_UART0->EVENTS_RXDRDY = 0;
NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Set<<UART_INTENSET_RXDRDY_Pos;
NVIC_ClearPendingIRQ(UART0_IRQn);
NVIC_SetPriority(UART0_IRQn, APP_IRQ_PRIORITY_LOW);
NVIC_EnableIRQ(UART0_IRQn);
}
void ApplyIO_Init()
{
nrf_gpio_cfg_output(PIN_HEAT);
nrf_gpio_cfg_output(PIN_FAN);
nrf_gpio_cfg_output(PIN_ATOM);
nrf_gpio_cfg_input(PIN_WATER, NRF_GPIO_PIN_NOPULL);
nrf_gpio_cfg_input(PIN_HUM_IN, NRF_GPIO_PIN_NOPULL);
//=============================================================
// PIN_HUM_IN defined as UART's RX
simple_uart_config(0, PIN_NOT_USED, 0, PIN_HUM_IN, FALSE);
}
void UART0_IRQHandler(void)
{
// Handle reception
if (NRF_UART0->EVENTS_RXDRDY != 0){
// Clear UART RX event flag
NRF_UART0->EVENTS_RXDRDY = 0;
uartNoRxCnt = 0;
// Write received byte to FIFO
if(uartRxIndex <4) {
uartRxBuf[uartRxIndex++] = (u8)NRF_UART0->RXD;
if(uartRxIndex ==4) {
//---------------------------------------
if( ((u8)(uartRxBuf[0]+uartRxBuf[2]) == 0) &&
((u8)(uartRxBuf[1]+uartRxBuf[3]) == 0) ) {
curTemperature = uartRxBuf[0];
curHumidity = uartRxBuf[1];
if(curTemperature <10) curTemperature = 0;
else curTemperature -= 10;
}
uartRxIndex= 0;
}
}
}
// Handle transmission.
if (NRF_UART0->EVENTS_TXDRDY != 0)
{
// Clear UART TX event flag.
NRF_UART0->EVENTS_TXDRDY = 0;
}
}
//-------------------------------------------------------
// called every 10ms
void UartClk(void)
{
if(uartNoRxCnt < 250) uartNoRxCnt++;
if(uartNoRxCnt > 20) {
uartRxIndex = 0;
}
if(uartNoRxCnt > 230) { //接收超时
curHumidity = 0;
curTemperature = 0;
}
}
// disabled
void TIMER1_IRQHandler(void)
{
if(NRF_TIMER1->EVENTS_COMPARE[0]) {
NRF_TIMER1->EVENTS_COMPARE[0] = 0;
//----------------------------------------------------
}
}
void AtomOutClk()
{
if(++atomCnt > atomVar) NRF_GPIO->OUTCLR = (1UL << PIN_ATOM);
else NRF_GPIO->OUTSET = (1UL << PIN_ATOM);
if(atomCnt >= atomPeriod) atomCnt = 0;
}
////////////////////////////////////////////////////////////////
void Application_Init(void)
{
volatile u32 tmp32; //(jhb)
//(jhb) Clk_Init();
//(jhb) Buz_Init();
//(jhb) Keyb_Init();
//(jhb) DisplayPinInit();
//(jhb) ApplyIO_Init();
atomCnt = 0;
atomVar = 0;
atomPeriod = 10;
//(JHB) sysState = SYS_OFF;
//(JHB) atomPower = ATOM_POWER_LOW;
//(JHB) setHumidity = 70;
//(JHB) warmEnable = TRUE;
//(JHB) progMode = MODE_NORMAL;
timerOff = timerOffSleep = 0;
setTime = setTimeSleep = 0;
powerOnTime_sec = 1;
//-----------------------------------------------------------------------------------
//(ash) totalWorkTimeIn5Minute -> workTime_seconds
workTime_seconds = *((u32 *)(FLASH_ADDR_totalTime));
if(workTime_seconds == 0xffffffff) { // not initialed
workTime_seconds = 0;
{
u32 result;
do result = sd_flash_page_erase(FLASH_ADDR_totalTime/FLASH_PAGE_SIZE); while(result != NRF_SUCCESS);
do result = sd_flash_write((u32*)FLASH_ADDR_totalTime, &workTime_seconds, 1); while(result != NRF_SUCCESS);
}
}
// if(totalWorkTimeIn5Minute > (100*60/5) ){
#ifdef DEBUG
//очистка через 5 минут
if(workTime_seconds > 300){
#else
if(workTime_seconds > (100*3600) ){ //(ash)
#endif
cleanNeeded = TRUE;
}else {
cleanNeeded = FALSE;
}
// #ifdef DEBUG
// cleanNeeded = TRUE;
// #endif
//-----------------------------------------------------------------------------------
//(jhb) add
/*
tmp32 = *((u32 *)(FLASH_ADDR_sysState)); sysState = tmp32;
tmp32 = *((u32 *)(FLASH_ADDR_atomPower)); atomPower = tmp32;
tmp32 = *((u32 *)(FLASH_ADDR_setHumidity)); setHumidity = tmp32;
tmp32 = *((u32 *)(FLASH_ADDR_warmEnable)); warmEnable = tmp32;
tmp32 = *((u32 *)(FLASH_ADDR_progMode)); progMode = tmp32;
tmp32 = 0;
if(sysState > SYS_ON) tmp32++;
if(atomPower> ATOM_POWER_TURBO) tmp32++;
if((setHumidity >75) || (setHumidity <30) || ((setHumidity%5)!=0)) tmp32++;
if(progMode > MODE_AUTO) tmp32++;
*/
// if(tmp32) {
sysState = SYS_OFF;
atomPower = ATOM_POWER_LOW;
setHumidity = 70;
warmEnable = TRUE;
progMode = MODE_NORMAL;
//-------------------------------------
// }
//-----------------------------------------------------------------------
Clk_Init();
Buz_Init();
Keyb_Init();
DisplayPinInit();
ApplyIO_Init();
}
void WaterDetect(void)
{
static u8 waterDetCnt = 0;
u8 pinDet;
nrf_gpio_cfg_input(PIN_WATER, NRF_GPIO_PIN_NOPULL);
NOP2();
pinDet = (u8)nrf_gpio_pin_read(PIN_WATER);
//---------------------------------------------------------
if(pinDet) {// water enough
if(waterDetCnt< 200)waterDetCnt++;
else {
if(noWater) {
beepTimes = 0;
Buz_Off();
}
noWater = FALSE;
}
}else {
if(waterDetCnt)waterDetCnt--;
else {
noWater = TRUE;
}
}
}
u16 miDivCnt;
void TimeEvent(void)
{
// static u16 miDivCnt = 0; //(ash) u8 -> u16
if(flag_100ms) {
flag_100ms = FALSE;
//--------------------------------------
if(haltTime) haltTime--;
if(cleanedDly)cleanedDly--;
{//нотификации
static uint8_t lastApiState = API_ERROR_STATE, newApiState;
newApiState = API_GetState();
if(newApiState != lastApiState)
{
lastApiState = newApiState;
bSendNotification = true;
}
}
}
//===========================================
if(flag_500ms) {
flag_500ms = FALSE;
//-----------------------------------
//------------------------------------------------------
//(jhb) add 4 test
if(testValidTime < 200) testValidTime++;
if(testNoOperateTime < 200) testNoOperateTime++;
if(testNoOperateTime > 120 && testMode) {
testMode = FALSE;
}
if(testMode) {
if(testStep <15) testStep++;
}
//------------------------------------------------------
}
//===========================================
if(flag_1s) {
{
static uint8_t prevState = API_START_STATE;
uint8_t adv_app_state;
uint16_t adv_app_state_param = ADV_STAND_BY_PRM_NO;
//конвертер - настраивается в каждом старом проекте индивидуально
uint8_t state = API_GetState();
adv_app_state = state;
if(prevState != state)
{
if(adv_app_state == API_FW_UPDATE_STATE)
{
adv_app_state = ADV_ST_STAND_BY;
adv_app_state_param = ADV_STAND_BY_PRM_FW_UPDATE;
}
if(adv_app_state == API_PAIRING_STATE)
{
adv_app_state = ADV_ST_STAND_BY;
adv_app_state_param = ADV_STAND_BY_PRM_PAIRING;
}
app_advertising_set_app_state(adv_app_state, adv_app_state_param);
prevState = state;
}
}
flag_1s = FALSE;
if(fanEn) miDivCnt++; //(ash 22.06.2015) if(fanEn)
//---------------------------------------------
if(pairing) {
if(++pairStateCnt > 10) {
pairStateCnt = 0;
pairing = FALSE;
app_advertising_unset_paring_flag();
}
}
if( API_GetState() == API_FW_UPDATE_STATE)
{
if(!bConnection || ++fwUpdatingStateCnt > 30)
{
API_Off();
bFWupdatingError = TRUE;
Beep(2, 30);
}
}
//------------------------------------
if(noUserActiveCnt < 120) noUserActiveCnt++;
if(powerOnTime_sec != 0 ){ //(jhb) add
if(++powerOnTime_sec > 12) powerOnTime_sec=0; //(jhb) add
} //(jhb) add
//------------------------------------
if(noWater) {
if(noWaterEnsureCnt < 100){
noWaterEnsureCnt++;
if(noWaterEnsureCnt >= (6 + powerOnTime_sec/2)){ //(jhb) add
noWaterEnsureCnt=100;
if(sysState == SYS_ON) Beep(10, 50); //(ash) if(sysState == SYS_ON)
}
}
}else {
noWaterEnsureCnt = 0;
}
//------------------------------------
if(waitTime) {
waitTime--;
if(waitTime ==0) {
if(setIndex != SET_NULL) {
setIndex = SET_NULL;
showAlternCnt = 0;
}
}
}
//-----------------------------------
if(++showAlternCnt >= 20)showAlternCnt = 0;
//-----------------------------------
if(progMode == MODE_SLEEP)
{
if(timerOffSleep) {
if(++secondSleep >= 60) {
secondSleep = 0;
//--------------
if(++minuteSleep >= 60) {
minuteSleep = 0;
if(--timerOffSleep ==0) {
sysState = SYS_OFF;
}
}
}
}
}
if(timerOff) {
if(++second >= 60) {
second = 0;
//--------------
if(++minute >= 60) {
minute = 0;
if(--timerOff ==0 && progMode != MODE_SLEEP) {
sysState = SYS_OFF;
}
}
}
}
//----------------------------------------------------
//(jhb) add
if(needSaveDelay_sec) {
needSaveDelay_sec--;
if(needSaveDelay_sec ==0) {
u32 result;
static u32 tbuf[5]; //(ash) static or global!!!
tbuf[0] = sysState;
tbuf[1] = atomPower;
tbuf[2] = setHumidity;
tbuf[3] = warmEnable;
tbuf[4] = progMode;
do result = sd_flash_page_erase(FLASH_ADDR_sysState/FLASH_PAGE_SIZE); while(result != NRF_SUCCESS);
do result = sd_flash_write((u32*)FLASH_ADDR_sysState, tbuf, 5); while(result != NRF_SUCCESS);
}
}
}
//------------------------------------------------------------------------------------------
#ifdef DEBUG
if(miDivCnt >= 300) {// 5 minute
#else
if(miDivCnt >= (3600)) {// 1 hour (ash)
#endif
miDivCnt = 0;
//-------------------------------
//(ash 22.06.2015 if(sysState == SYS_ON) { // only in working
if(cleanNeeded == FALSE && (autoStop==FALSE)) {//(JHB) add: &&(autoStop==FALSE)
// totalWorkTimeIn5Minute++;
#ifdef DEBUG
workTime_seconds += 300;
#else
workTime_seconds += 3600; //(ash)
#endif
{
u32 result;
do result = sd_flash_page_erase(FLASH_ADDR_totalTime/FLASH_PAGE_SIZE); while(result != NRF_SUCCESS);
do result = sd_flash_write((u32*)FLASH_ADDR_totalTime, &workTime_seconds, 1); while(result != NRF_SUCCESS);
}
}
//------------------------------------------
// if(totalWorkTimeIn5Minute > (100*60/5)){
#ifdef DEBUG
//очистка через 5 минут
if(workTime_seconds > 300){
#else
if(workTime_seconds > (100*3600) ){//(ash)
#endif
if(cleanNeeded == FALSE) {
Beep(3, 30);
}
cleanNeeded = TRUE;
}else {
cleanNeeded = FALSE;
}
//(ash 22.06.2015) }
}
}
//----------------------------------------------------------
//(jhb) add 4 test
void OutPut4Test()
{
nrf_gpio_cfg_output(PIN_HEAT);
nrf_gpio_cfg_output(PIN_FAN);
nrf_gpio_cfg_output(PIN_ATOM);
if(heatEn) nrf_gpio_pin_set(PIN_HEAT);
else nrf_gpio_pin_clear(PIN_HEAT);
if(fanEn) {
nrf_gpio_pin_set(PIN_FAN);
}else {
nrf_gpio_pin_clear(PIN_FAN);
}
if(noWater) atomVar = 0;
else{
switch(atomPower) {
case ATOM_POWER_OFF: atomVar = 0; break;
case ATOM_POWER_LOW: atomVar = 2; break;
case ATOM_POWER_MID: atomVar = 3; break;
case ATOM_POWER_HIGH: atomVar = 4; break;
case ATOM_POWER_TURBO: atomVar = 5; break;
default : break;
}
}
}
void OutPutCtrl(void)
{
static u16 fanOutDly = 0;
u8 power;
if(testMode) {
OutPut4Test();
return;
}
nrf_gpio_cfg_output(PIN_HEAT);
nrf_gpio_cfg_output(PIN_FAN);
nrf_gpio_cfg_output(PIN_ATOM);
if(powerOnTime_sec ==1)return; //(jhb)
//--------------------------------------------------------------------------
if(fanEn) {
nrf_gpio_pin_set(PIN_FAN);
fanOutDly = 700;
}else {
if(fanOutDly) fanOutDly--;
else nrf_gpio_pin_clear(PIN_FAN);
}
if(heatEn) nrf_gpio_pin_set(PIN_HEAT);
else nrf_gpio_pin_clear(PIN_HEAT);
atomPeriod = 5;
if(sysState == SYS_OFF || noWater /*|| cleanNeeded*/) {
atomVar = 0;
}else {
power = atomPower;
if(fanEn == FALSE) power = ATOM_POWER_OFF;
if(autoStop ){ //(jhb) add
atomVar = 0; //(jhb) add
return; //(jhb) add
} //(jhb) add
switch(power) {
case ATOM_POWER_OFF: atomVar = 0; break;
case ATOM_POWER_LOW: atomVar = 2; break;
case ATOM_POWER_MID: atomVar = 3; break;
case ATOM_POWER_HIGH: atomVar = 4; break;
case ATOM_POWER_TURBO: atomVar = 5; break;
default : break;
}
}
}
////////////////////////////////////////////////////////////////
void Application(void)
{
u8 humi = setHumidity;
if(humi >70) humi = 70;
if(testMode) return; //(test)
if(sysState == SYS_OFF /*|| cleanNeeded*/) {
fanEn = FALSE;
heatEn = FALSE;
return;
}
//=====================================
switch(progMode){
case MODE_SLEEP: // 固定暖雾,中档雾化量,定时8小时, 不允许其他操作
atomPower = ATOM_POWER_MID; // 300 ml/h
warmEnable = TRUE; //(jhb) 规格书要求睡眠模式统一切换成暖雾模式
heatEn = TRUE;
fanEn = TRUE;
autoStop = FALSE; //(jhb)add
break;
//-----------------------------------------
case MODE_NORMAL:// 暖雾可调、定时可调、湿度可调、雾化量可调
if(atomPower > ATOM_POWER_HIGH) atomPower = ATOM_POWER_HIGH; //(ash)
if(setHumidity == 75){
heatEn = warmEnable;
fanEn = TRUE;
autoStop = FALSE; //(jhb)add
break;
}
if(curHumidity > humi ) {
heatEn = FALSE;
fanEn = FALSE;
autoStop = TRUE; //(jhb)add
}else if((curHumidity+5) <= humi){//2015-12-2 restart threshold value -> 5
heatEn = warmEnable;
fanEn = TRUE;
autoStop = FALSE; //(jhb)add
}else { //(jhb)2015-12-28
if(autoStop) heatEn = FALSE;
else heatEn = warmEnable;
}
break;
//-----------------------------------------
case MODE_TURBO: // 暖雾可调、定时可调、湿度可调、雾化量不可调
atomPower = ATOM_POWER_TURBO; //(ash)
if(setHumidity == 75){
heatEn = warmEnable;
fanEn = TRUE;
//(ash) atomPower = ATOM_POWER_TURBO;
autoStop = FALSE; //(jhb)add
break;
}
if(curHumidity > humi ) {
heatEn = FALSE;
fanEn = FALSE;
autoStop = TRUE; //(jhb)add
}else if((curHumidity+5) <= humi){ //2015-12-2 restart threshold value -> 5
//(ash) atomPower = ATOM_POWER_TURBO; // 400 ml/h
heatEn = warmEnable;
fanEn = TRUE;
autoStop = FALSE; //(jhb)add
}else { //(jhb)2015-12-28
if(autoStop) heatEn = FALSE;
else heatEn = warmEnable;
}
break;
//-----------------------------------------
case MODE_AUTO: // 暖雾可调、定时可调、湿度不可调,固定70%、雾化量不可调
//(jhb) if(setHumidity == 75){
//(jhb) heatEn = warmEnable;
//(jhb) fanEn = TRUE;
//(jhb) atomPower = ATOM_POWER_HIGH;
//(jhb) break;
//(jhb) }
atomPower = ATOM_POWER_HIGH; //(ash)
if(curHumidity > 70 ) {//(jhb) humi->70
heatEn = FALSE;
fanEn = FALSE;
autoStop = TRUE; //(jhb)add
}else if((curHumidity) <= 65){ //(jhb) 70->65
//(ash) atomPower = ATOM_POWER_HIGH; // 400 ml/h
heatEn = warmEnable;
fanEn = TRUE;
autoStop = FALSE; //(jhb)add
}else { //(jhb)2015-12-28
if(autoStop) heatEn = FALSE;
else heatEn = warmEnable;
}
break;
//-----------------------------------------
default : break;
}
//==========================================
if(noWater) {
fanEn = FALSE;
heatEn = FALSE;
}
}
////////////////////////////////////////////////////////////////
//API for R4S
//The all Set...() functions return a true/false (Success/Fail) value
////////////////////////////////////////////////////////////////
//Get firmvare version
uint16_t API_GetVersion(void)
{
return FIRMWARE_VER;
}
////////////////////////////////////////////////////////////////
//On device
bool API_On(void)
{
if(sysState != SYS_OFF) return TRUE; //(ash 12.01.2016)
noUserActiveCnt = 0;
sysState = SYS_ON;
if(progMode > MODE_AUTO)progMode = MODE_NORMAL;
if(atomPower == ATOM_POWER_OFF || atomPower > ATOM_POWER_TURBO) atomPower = ATOM_POWER_LOW;
return TRUE;
}
//Off device
bool API_Off(void)
{
//(ash 12.01.2016) if(sysState == SYS_OFF && !pairing) return FALSE;
bFWupdating = FALSE;
fwUpdatingStateCnt = 0;
fwUpdateDispCnt = 0;
pairing = FALSE;
app_advertising_unset_paring_flag();
sysState = SYS_OFF;
setIndex = SET_NULL;
timerOff = timerOffSleep = 0;
setTimeSleep = setTime = timerOff; //(ash)
return TRUE;
}
////////////////////////////////////////////////////////////////
//Get device state
uint8_t API_GetState(void)
{
u8 res;
if(sysState == SYS_OFF) res = API_OFF_STATE;
else {
if(noWater) res = API_NO_WATER_STATE;
else res = API_ON_STATE;
}
if(pairing) res = API_PAIRING_STATE;
if(bFWupdating) res = API_FW_UPDATE_STATE;
if(testMode) res = API_TEST_STATE;
return res;
}
void API_ENTER_FW_UPDATE(void)
{
bFWupdating = TRUE;
}
////////////////////////////////////////////////////////////////
void API_FW_UPDATE_PROC(void)
{
fwUpdatingStateCnt = 0;
}
////////////////////////////////////////////////////////////////
//Get program
uint8_t API_GetProgram(void)
{
return progMode;
}
//Set program
bool API_SetProgram(uint8_t prog)
{
if(prog > MODE_AUTO) return FALSE;
progMode = prog;
if(progMode == MODE_SLEEP) {
secondSleep = 0;
minuteSleep = 0;
timerOffSleep = 8;
setTimeSleep = timerOffSleep;
// warmEnable ^= TRUE; //(ash)
warmEnable = TRUE;
}
noUserActiveCnt = 0;
bSendNotification = true;
return TRUE;
}
////////////////////////////////////////////////////////////////
//Get mode
uint8_t API_GetMode(void)
{
return atomPower;
}
//Set mode
bool API_SetMode(uint8_t var)
{
if(progMode != MODE_NORMAL) return FALSE;
if(var == 0) return FALSE;
if(var >= ATOM_POWER_TURBO) return FALSE;
//(ash) if(autoStop) return FALSE; //(jhb)
atomPower = var;
bSendNotification = true;
return TRUE;
}
////////////////////////////////////////////////////////////////
//Humidity value is from 30 to 75
//Get set humidity
uint8_t API_GetHumidity(void)
{
if(progMode == MODE_AUTO) return 70;
return setHumidity;
}
//Set humidity
bool API_SetHumidity(uint8_t hum)
{
if(hum)
if(progMode == MODE_SLEEP) return FALSE;
if(progMode == MODE_AUTO && hum != 70) return FALSE;
if(hum <30 || hum > 75) return FALSE;
if((hum%5) != 0) return FALSE;
noUserActiveCnt = 0;
setHumidity = hum;
setIndex = SET_HUMIDITY;
waitTime = WAIT_TIME_SECONDS;
haltTime = HALT_TIME_100MS;
bSendNotification = true;
return TRUE;
}
////////////////////////////////////////////////////////////////
//Get work time in hours
uint8_t API_GetTime(void)
{
if(progMode == MODE_SLEEP)
{
return setTimeSleep;
}
else
{
return setTime;
}
}
//Set work time in hours
bool API_SetTime(uint8_t time)
{
if(time > 8) return FALSE;
if(progMode == MODE_SLEEP) return FALSE;
noUserActiveCnt = 0;
setTime = time;
timerOff = time;
minute = 0;
second = 0;
setIndex = SET_TIMER;
waitTime = WAIT_TIME_SECONDS;
haltTime = HALT_TIME_100MS;
bSendNotification = true;
return TRUE;
}
////////////////////////////////////////////////////////////////
//Get warm mist state (ON/OFF)
uint8_t API_GetHeating(void)
{
return heatEn;
}
//Set warm mist state (ON/OFF)
bool API_SetHeating(uint8_t warm)
{
if(progMode == MODE_SLEEP) return FALSE;
if(warm != API_ON && warm != API_OFF) return FALSE;
//(ash) if(autoStop) return FALSE; //(jhb)
noUserActiveCnt = 0;
warmEnable = warm;
setIndex = SET_NULL;
bSendNotification = true;
return TRUE;
}
////////////////////////////////////////////////////////////////
//Get time to end of work in minutes
uint16_t API_GetEndTime(void)
{
if(progMode == MODE_SLEEP)
{
if(timerOffSleep) return timerOffSleep * 60 - minuteSleep;
}
else
{
if(timerOff) return timerOff * 60 - minute; //(ash) if(timerOff)
}
return 0; //(ash)
}
////////////////////////////////////////////////////////////////
//Get current humidity
uint8_t API_GetCurrentHumidity(void)
{
return curHumidity;
}
////////////////////////////////////////////////////////////////
//Return a state of the unpairing flag
bool API_IsUnpairing(void)
{
return unpairingFlag;
}
//Clear unpairing flag
void API_ClrUnpairing(void)
{
unpairingFlag = FALSE;
}
////////////////////////////////////////////////////////////////
void API_SetConnection(void)
{
bConnection = true;
}
void API_ClrConnection(void)
{
bConnection = false;
}
////////////////////////////////////////////////////////////////
//Buz control
void API_Beep(u8 n, u8 len)
{
Beep(n, len);
}
////////////////////////////////////////////////////////////////
//this function is not used from now (07.2017)
uint8_t API_ResetFilterClean (uint8_t clean)
{
if (clean > 0) return 0;
else
{
#ifdef DEBUG
cleanNeeded ^= 1;
#else
cleanNeeded = clean;
#endif
}
return 1;
}
uint8_t api_get_error(void)
{
uint8_t err = 0;
uint8_t app_state = API_GetState();
switch(app_state)
{
case API_NO_WATER_STATE:
case API_ERROR_STATE:
err = APP_API_WATER_ERROR;
break;
default:
err = APP_API_NO_ERROR;
break;
}
if(cleanNeeded) err |= APP_API_FILTER_NEED_CLEAN_ERROR;
return err;
}