155 lines
4.8 KiB
Plaintext
155 lines
4.8 KiB
Plaintext
#include "global.th"
|
||
#include "sensors.th"
|
||
#include "braker.th"
|
||
#include "relay.th"
|
||
|
||
extern Configuration config;
|
||
|
||
string ports = "";
|
||
|
||
BrakerProcess brakers[BRAKER_COUNT];
|
||
|
||
void braker_add_port(char port){
|
||
if (instr(1,ports,port,1)==0){
|
||
ports+=(string)chr(port);
|
||
}
|
||
}
|
||
bool isBrakerPort(int port){
|
||
char p = (char)port;
|
||
// d(instr(1,ports,chr(p),1));
|
||
return (instr(1,ports,chr(p),1)>0);
|
||
}
|
||
|
||
void brakers_init(){
|
||
ports = "";
|
||
config.STORE_BRAKER = false;
|
||
for (int num = 0;num <BRAKER_COUNT; num++){
|
||
brakers[num].config = &config.BRAKERS[num];
|
||
if (config.BRAKERS[num].Enable){
|
||
config.STORE_BRAKER = true;
|
||
#if PLATFORM_ID != SIMULATOR
|
||
if (config.BRAKERS[num].SensPort>0){
|
||
braker_add_port(config.BRAKERS[num].SensPort);
|
||
io.num = INPIN[config.BRAKERS[num].SensPort-1];
|
||
io.enabled=false;
|
||
}
|
||
if (config.BRAKERS[num].DropPort >0){
|
||
braker_add_port(config.BRAKERS[num].DropPort);
|
||
io.num = INPIN[config.BRAKERS[num].DropPort-1];
|
||
io.enabled=false;
|
||
}
|
||
io.num = OUTPIN[config.BRAKERS[num].Relay-1];
|
||
io.enabled=true;
|
||
#endif
|
||
}
|
||
}
|
||
}
|
||
|
||
void braker_init(unsigned char number, unsigned char sensor, unsigned char drop, unsigned char relay, unsigned long timeout)
|
||
{
|
||
if (number >3){
|
||
d("ERROR: Big braker number - set "+str(number)+" but max "+ str(BRAKER_COUNT));
|
||
}
|
||
unsigned char num = number -1;
|
||
config.BRAKERS[num].Enable = true;
|
||
config.BRAKERS[num].SensPort = sensor;
|
||
config.BRAKERS[num].DropPort = drop;
|
||
config.BRAKERS[num].Relay = relay;
|
||
config.BRAKERS[num].Timeout = timeout;
|
||
config.BRAKERS[num].Mode = sensor == 0 ? 1 : 0;
|
||
brakers[num].config = &config.BRAKERS[num];
|
||
brakers[num].State = false;
|
||
brakers[num].OnTime = 0;
|
||
brakers[num].Fifo="";
|
||
if (config.BRAKERS[num].Enable){
|
||
config.STORE_BRAKER = true;
|
||
#if PLATFORM_ID != SIMULATOR
|
||
if (config.BRAKERS[num].SensPort >0){
|
||
braker_add_port(config.BRAKERS[num].SensPort);
|
||
io.num = INPIN[config.BRAKERS[num].SensPort-1];
|
||
io.enabled=false;
|
||
}
|
||
if (config.BRAKERS[num].DropPort >0){
|
||
braker_add_port(config.BRAKERS[num].DropPort);
|
||
io.num = INPIN[config.BRAKERS[num].DropPort-1];
|
||
io.enabled=false;
|
||
}
|
||
io.num = OUTPIN[config.BRAKERS[num].Relay-1];
|
||
io.enabled=true;
|
||
#endif
|
||
}
|
||
}
|
||
|
||
|
||
/// **
|
||
/// Обработка команды для бракиратора - G1 или B1. Где G|B статус сигнала (Good|Bad), а цифра - номер бракиратора
|
||
/// **
|
||
void braker_set(string cmd){
|
||
if (len(cmd)!=2)
|
||
d("Неверный формат команды = '"+cmd+"'");
|
||
string type = left(cmd,1);
|
||
unsigned char num = val(right(cmd,1));
|
||
if (brakers[num-1].config->Mode == 0){
|
||
brakers[num-1].Fifo += type;
|
||
d("Бракиратор #"+str(num)+" сигнал ["+type+"]");
|
||
}
|
||
else{
|
||
if (type == "G"){
|
||
braker_change_state(num-1,true);
|
||
d("Бракиратор #"+str(num)+" включен по сигналу сервера");
|
||
}else{
|
||
d("Бракиратор #"+str(num)+" получил сигнал 'B'. Игнорируем.");
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
void braker_proc(unsigned char number)
|
||
{
|
||
unsigned char num = number-1;
|
||
bool en = brakers[num].config->Enable;
|
||
if (brakers[num].config->Enable==true){
|
||
unsigned long timeout = brakers[num].config->Timeout;
|
||
if (brakers[num].State){ // проверка на выключение
|
||
if (brakers[num].OnTime + timeout < sys.timercountms){ // Обработка таймаута
|
||
braker_change_state(num,false);
|
||
d("Бракиратор #"+str(number)+" выключен по таймауту ["+str(sys.timercountms - brakers[num].OnTime)+"/"+str(timeout)+"]ms");
|
||
}else{ // проверка статуса порта
|
||
if (brakers[num].config->DropPort>0 && getPinState(brakers[num].config->DropPort)){
|
||
braker_change_state(num,false);
|
||
d("Бракиратор #"+str(number)+" выключен по сигналу сброса через "+str(sys.timercountms - brakers[num].OnTime)+"ms");
|
||
}
|
||
}
|
||
}else{ // проверка на сработку
|
||
if (brakers[num].config->Mode==0 && pinChange(brakers[num].config->SensPort) && getPinStateS(brakers[num].config->SensPort,true)){
|
||
if (braker_get_current(num) == "B"){
|
||
braker_change_state(num,true);
|
||
d("Бракиратор #"+str(number)+" включен по сигналу сенсора");
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
void braker_change_state(unsigned char num, bool state){
|
||
relay_set(brakers[num].config->Relay,state);
|
||
brakers[num].State = state;
|
||
if (state){
|
||
//d("set timer for "+str(num));
|
||
brakers[num].OnTime = sys.timercountms;
|
||
}else{
|
||
//d("reset timer for "+str(num));
|
||
brakers[num].OnTime = 0;
|
||
}
|
||
}
|
||
|
||
string braker_get_current(unsigned char num){
|
||
string c = left(brakers[num].Fifo,1);
|
||
int l = len(brakers[num].Fifo);
|
||
brakers[num].Fifo = right(brakers[num].Fifo,l-1);
|
||
d("Бракиратор #"+str(num+1)+": Получено текущее значение = ["+c+"]");
|
||
return c;
|
||
}
|