243 lines
5.8 KiB
C
Raw Permalink Blame History

#include <includes.h>
#include "control.h"
#include "data.h"
#include "datadesc.h"
#include <stdlib.h>
#include <string.h>
#if defined(BOARD_SOLARIUM_VLAD)
CPU_INT08U control_initialized = 0;
CPU_INT08U control_state[CHANNELS_NUM];
CPU_INT16U control_counters[CHANNELS_NUM];
CPU_INT08U control_channels[CHANNELS_NUM] = {0, 1, 2};
#define CTRL_GPIO_OFF 0
#define CTRL_GPIO_ON 1
///
inline void set_gpio(CPU_INT08U ch, CPU_INT08U lamp, CPU_INT08U vent)
{
if (ch == CHANNEL_1)
{
if (lamp) FIO3SET_bit.P3_25 = 1;
else FIO3CLR_bit.P3_25 = 1;
if (vent) FIO1SET_bit.P1_19 = 1;
else FIO1CLR_bit.P1_19 = 1;
}
else if (ch == CHANNEL_2)
{
if (lamp) FIO2SET_bit.P2_2 = 1;
else FIO2CLR_bit.P2_2 = 1;
if (vent) FIO0SET_bit.P0_4 = 1;
else FIO0CLR_bit.P0_4 = 1;
}
else if (ch == CHANNEL_3)
{
if (lamp) FIO1SET_bit.P1_27 = 1;
else FIO1CLR_bit.P1_27 = 1;
if (vent) FIO0SET_bit.P0_0 = 1;
else FIO0CLR_bit.P0_0 = 1;
}
}
void SetControl(CPU_INT08U ch, CPU_INT08U state)
{
CPU_INT08U tmp = control_channels[ch];
if (tmp < CHANNELS_NUM)
{
ch = tmp;
}
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
if (state == CONTROL_STATE_OFF)
{
control_state[ch] = CONTROL_STATE_OFF;
control_counters[ch] = 0;
}
else if (state == CONTROL_STATE_VENT)
{
if (control_state[ch] == CONTROL_STATE_OFF)
{
control_state[ch] = state;
}
}
else if (state == CONTROL_STATE_PAUSED)
{
if (control_state != CONTROL_STATE_OFF)
{
if (control_counters[ch] >= 2000) control_state[ch] = state;
}
}
else
{
if (control_state[ch] == CONTROL_STATE_OFF)
{
control_state[ch] = state;
control_counters[ch] = 0;
}
else if (control_state[ch] == CONTROL_STATE_PAUSED)
{
control_state[ch] = state;
}
}
OS_EXIT_CRITICAL();
}
///
CPU_INT08U GetControlState(CPU_INT08U ch)
{
CPU_INT08U tmp = control_channels[ch];
if (tmp < CHANNELS_NUM)
{
ch = tmp;
}
CPU_INT08U state;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
state = control_state[ch];
OS_EXIT_CRITICAL();
return state;
}
///
void control_1ms_callback(void)
{
if (!control_initialized) return;
for (CPU_INT08U i = 0; i < CHANNELS_NUM; i++)
{
if (control_state[i] != CONTROL_STATE_OFF)
{
if (control_counters[i] < 2000) control_counters[i]++;
}
if (control_state[i] == CONTROL_STATE_OFF)
{
set_gpio(i, CTRL_GPIO_OFF, CTRL_GPIO_OFF);
}
else if ((control_state[i] == CONTROL_STATE_PAUSED) || (control_state[i] == CONTROL_STATE_VENT))
{
set_gpio(i, CTRL_GPIO_OFF, CTRL_GPIO_ON);
}
else
{
if (control_counters[i] < 500)
{
set_gpio(i, CTRL_GPIO_ON, CTRL_GPIO_ON);
}
else if (control_counters[i] < 1000)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
set_gpio(i, CTRL_GPIO_ON, CTRL_GPIO_ON);
}
else if (control_counters[i] < 1500)
{
// <20><><EFBFBD>./<2F><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (control_state[i] != CONTROL_STATE_UF)
{
set_gpio(i, CTRL_GPIO_ON, CTRL_GPIO_ON);
}
else
{
set_gpio(i, CTRL_GPIO_OFF, CTRL_GPIO_ON);
}
}
else if (control_counters[i] < 2000)
{
// <20><><EFBFBD>./<2F><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (control_state[i] != CONTROL_STATE_COLLATEN)
{
set_gpio(i, CTRL_GPIO_ON, CTRL_GPIO_ON);
}
else
{
set_gpio(i, CTRL_GPIO_OFF, CTRL_GPIO_ON);
}
}
else
{
set_gpio(i, CTRL_GPIO_ON, CTRL_GPIO_ON);
}
}
}
}
///
void LoadControlChannels(void)
{
for (CPU_INT08U i = 0; i < CHANNELS_NUM; i++)
{
CPU_INT32U index;
GetData(&SolarControlChannelDesc, &index, i, DATA_FLAG_DIRECT_INDEX);
if (index > CHANNELS_NUM - 1)
{
control_channels[i] = i;
}
else
{
control_channels[i] = (CPU_INT08U)index;
}
}
}
///
void InitControls(void)
{
memset(control_counters, 0, sizeof(control_counters));
PINSEL7_bit.P3_25 = 0x0;
PINMODE7_bit.P3_25 = 0;
FIO3DIR_bit.P3_25 = 1;
FIO3MASK_bit.P3_25 = 0;
PINSEL3_bit.P1_19 = 0x0;
PINMODE3_bit.P1_19 = 0;
FIO1DIR_bit.P1_19 = 1;
FIO1MASK_bit.P1_19 = 0;
set_gpio(CHANNEL_1, CTRL_GPIO_OFF, CTRL_GPIO_OFF);
control_state[CHANNEL_1] = CONTROL_STATE_OFF;
control_counters[CHANNEL_1] = 0;
PINSEL4_bit.P2_2 = 0x0;
PINMODE4_bit.P2_2 = 0;
FIO2DIR_bit.P2_2 = 1;
FIO2MASK_bit.P2_2 = 0;
PINSEL0_bit.P0_4 = 0x0;
PINMODE0_bit.P0_4 = 0;
FIO0DIR_bit.P0_4 = 1;
FIO0MASK_bit.P0_4 = 0;
set_gpio(CHANNEL_2, CTRL_GPIO_OFF, CTRL_GPIO_OFF);
control_state[CHANNEL_2] = CONTROL_STATE_OFF;
control_counters[CHANNEL_2] = 0;
PINSEL3_bit.P1_27 = 0x0;
PINMODE3_bit.P1_27 = 0;
FIO1DIR_bit.P1_27 = 1;
FIO1MASK_bit.P1_27 = 0;
PINSEL0_bit.P0_0 = 0x0;
PINMODE0_bit.P0_0 = 0;
FIO0DIR_bit.P0_0 = 1;
FIO0MASK_bit.P0_0 = 0;
set_gpio(CHANNEL_3, CTRL_GPIO_OFF, CTRL_GPIO_OFF);
control_state[CHANNEL_3] = CONTROL_STATE_OFF;
control_counters[CHANNEL_3] = 0;
control_initialized = 1;
}
#endif