1
Dependencies: mbed
Diff: main_filtration.cpp
- Revision:
- 0:2a01c5a56ed1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main_filtration.cpp Mon Jul 09 09:12:38 2018 +0000 @@ -0,0 +1,1008 @@ +/* + **************************************************************************** + **************************************************************************** + ** DEVINT BİLİŞİM YAZILIM DONANIM TİC. LTD. ŞTİ. TARAFINDAN GELİŞTİRİLMİŞTİR + ** İzmir / TÜRKİYE + ** + ** Copyright (C) 2015 + **************************************************************************** + **************************************************************************** +*/ + +#include "mbed.h" +#include "define.h" +#include "i2c.h" +#include "function.h" +#include "alerts.h" + +int main () +{ +// RF Modül açık + rfPower = 1; + wait_ms(50); + +// RF UART: 38400 Kbit, 8 Data Bits, No Parity, 1 Stop Bit + rf.baud(BAUD_SERIAL_RF); + rf.format(8, SerialBase::None, 1); + +// MASTER UART: 115200 Kbit, 8 Data Bits, No Parity, 1 Stop Bit + master.baud(BAUD_MASTER); + master.format(8, SerialBase::None, 1); + +// UART Rx ISR + rf.attach(&rf_rx_isr, Serial::RxIrq); + +// MASTER Rx ISR + master.attach(&master_rx_isr, Serial::RxIrq); + +// EEPROM frekansı 100 KHz + i2c.frequency(EEPROM_FREQUENCY); + wait_ms(1500); + +// EEPROM'a ilk çalışma için varsayılan konfigürasyonları yaz + configure_eeprom_default_values(); + +// EEPROM'dan konfigürasyonu oku + init_node(); + +// PCF pinleri LOW + io_send(fnode.filterByte_1, fnode.filterByte_2); + wait_ms(1500); + + check_and_close_valves(); + + while(1) { + + + if (fnode.flush_isr == true) { + + fnode.flush_isr = false; + + if (fnode.globalFlushPhase != fnode.lastFlushPhase) { + + fnode.globalFlushPhase ++; + fnode.currentFlushPhase ++; + + if (fnode.currentFlushPhase > 4) { + + fnode.globalFlushingFilter ++; + fnode.currentFlushingFilter ++; + + fnode.currentFlushPhase = 1; + } + + if (fnode.currentFlushingFilter > 4) { + + fnode.currentWorkingSlave ++; + fnode.currentFlushingFilter = 1; + + } + } + + fnode.flushStarted = true; + } + + // 30 sn aralıkla 10 kez veri gönderim koşulu oluşmuşsa + if (fnode.transmit_rtData == true) { + + if (fnode.irrigation == true) { + + fnode.rWIC = 0; + fnode.rWI = (fnode.rtPulseFirst - fnode.pulse) * fnode.watermeterCoefficient; + fnode.rQI = (float)fnode.rWI / (float)RT_DATA_TRANSMIT_INTERVAL; + fnode.rtPulseFirst = fnode.pulse; + + } else { + + fnode.rWDC = 0; + fnode.rWD = (fnode.rtPulseFirst - fnode.pulse) * fnode.watermeterCoefficient; + fnode.rQD = (float)fnode.rWD / (float)RT_DATA_TRANSMIT_INTERVAL; + fnode.rtPulseFirst = fnode.pulse; + + } + + fnode.transmit_rtData = false; + + prepare_data_fread(); + + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + if (fnode.rtCounter >= 10) { + rtDataTransmitTicker.detach(); + fnode.rtCounter = 0; + fnode.rtActive = false; + fnode.rtPulseFirst = 0; + + send_to_coordinator("{CMD:\"FRTOFFOK\"}"); + memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + wait_ms(50); + } + } + + // Otomatik veri aktarım koşulu oluşmuşsa + if (fnode.transmitData == true) { + + fnode.transmitData = false; + + if (fnode.irrigation == true) { + + fnode.WIC = fnode.pulse * fnode.watermeterCoefficient; + fnode.WI = fnode.pulseTransmit * fnode.watermeterCoefficient; + fnode.QI = (float)fnode.WI / timer.read(); + + } else { + + fnode.WDC = fnode.pulse * fnode.watermeterCoefficient; + fnode.WD = fnode.pulseTransmit * fnode.watermeterCoefficient; + fnode.QD = (float)fnode.WD / timer.read(); + + } + + fnode.pulseTransmit = 0; + + timer.reset(); + + prepare_data(); + + // Otomatik veri aktarımı açıksa veriyi gönder + if (fnode.autosend == true) { + send_to_coordinator(fnode.dataBuffer); + } + + memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + } + + // İki DP yıkaması arasında min bekleme süresinin hesaplanması + if (fnode.minFlushEnabled == true && (fnode.minFlushCounter >= fnode.minFlushInterval * 60)) { + + minFlushTicker.detach(); + fnode.isMinTimePassed = true; + fnode.minFlushCounter = 0; + } + + // PERIYODIK YIKAMA + // Filtrasyon nodunda ters yıkamalara izin verilmişse && şu an ters yıkama yoksa (manual ya da DP ile aktiflenmiş) && sulama varsa && önceden hata oluşmamışsa && periyodik yıkamanın kullanımı aktif edilmişse + //if (fnode.flushEnabled == 1 && fnode.flushing == false && fnode.irrigation == true && fnode.errorOccured == false && fnode.periodicFlushEnabled == true) { + if (fnode.flushEnabled == 1 && fnode.flushing == false && fnode.errorOccured == false && fnode.periodicFlushEnabled == true) { + + // Periyodik sayaç periyot değerine ulaşmışsa yıkamayı başlat + if (fnode.periodicFlushCounter >= fnode.periodicFlushInterval * 60 * 60) { + + // Periyot zamanlayıcısını iptal et ve periyot sayaç değerini sıfırla + periodicFlushTicker.detach(); + fnode.periodicFlushCounter = 0; + + // Yıkama zamanlayıcısını iptal et ve minimum zaman sayacını sıfırla + minFlushTicker.detach(); + //fnode.isMinTimePassed = true; + fnode.minFlushCounter = 0; + + // Şu an periyodik yıkama yapılıyor koşuluna geç + fnode.flushing = true; + + fnode.checkDp = false; + fnode.flushStarted = true; + + // Yıkama fazı 1 + fnode.globalFlushPhase = 1; + fnode.currentFlushPhase = 1; + fnode.globalFlushingFilter = 1; + fnode.currentFlushingFilter = 1; + fnode.currentWorkingSlave = 0; + + send_alarm(BACKFLUSH_PERIODIC_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + } + } + + if (fnode.checkPressure == true) { + + fnode.checkPressure = false; + + fnode.pressure = read_pressure(); + fnode.dpPressure = read_pressure_dp(); + + // Eğer basınç sensörü filtre girişinde ise basınç ve DP değerine göre giriş ve çıkış basıncını hesapla + // Giriş basıncı = Okunan basınç + // Çıkış basıncı = Okunan basınç - Fark basınç + if (fnode.pressureSensorPosition == 0) { + + fnode.inletPressure = fnode.pressure; + fnode.outletPressure = fnode.pressure - fnode.dpPressure; + + if (fnode.outletPressure < 0) { + + fnode.outletPressure = 0; + + } + + // Eğer basınç sensörü filtre çıkışında ise basınç ve DP değerine göre giriş ve çıkış basıncını hesapla + // Giriş basıncı = Okunan basınç + Fark basınç + // Çıkış basıncı = Okunan basınç + } else { + + fnode.inletPressure = fnode.pressure + fnode.dpPressure; + fnode.outletPressure = fnode.pressure; + + } + + // Eğer alarmlar aktifse ve giriş basıncı set edilen alt alarm eşik değerinin altında ise ve alarm daha önce gönderilmemişse alarm gönder + // Alarm gönderme işlemi alarm bölgesi değiştiğinde tekrar devreye girer + if (fnode.alarmsEnabled == 1) { + + if (fnode.inletPressure < (float)fnode.pressureLowThreshold / 10.0f && fnode.pressureLowError == false) { + + fnode.pressureLowError = true; + fnode.pressureNormalError = false; + fnode.pressureHighError = false; + + // Düşük + send_alarm(INLET_LOW_PRESSURE, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + // Eğer giriş basıncı set edilen güvenli bölge içinde ise alarm gönder + } else if (fnode.inletPressure >= (float)fnode.pressureLowThreshold / 10.0f && fnode.inletPressure <= (float)fnode.pressureHighThreshold / 10.0f && fnode.pressureNormalError == false) { + + fnode.pressureLowError = false; + fnode.pressureNormalError = true; + fnode.pressureHighError = false; + + // Normal + send_alarm(INLET_NORMAL_PRESSURE, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + // Eğer giriş basıncı set edilen üst alarm eşik değerinin üstünde ise alarm gönder + } else if (fnode.inletPressure > (float)fnode.pressureHighThreshold / 10.0f && fnode.pressureHighError == false) { + + fnode.pressureLowError = false; + fnode.pressureNormalError = false; + fnode.pressureHighError = true; + + // Yüksek + send_alarm(INLET_HIGH_PRESSURE, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + } + + // Giriş basıncı set edilen değerin altında ise sulamanın bittiği kabul edilir + // SULAMA DIŞI + if (fnode.inletPressure < (float)fnode.inletPressureSet / 10.0f) { + + // Giriş basıncı set edilen değerden düşükse önce son kez data gönderilir, sonrasında sulama bitti (filtrasyondan su geçişi durdu) alarmı gönderilir + if (fnode.irrigation == true) { + + fnode.irrigation = false; + + dataTransmitTicker.detach(); + + // Sulama bitince periyodik sayıcıyı durdur ancak counterı sıfırlama (Pause) + // Sulama başlayınca saymaya devam edecek + periodicFlushTicker.detach(); + + // Min yıkama aralığını durdur + minFlushTicker.detach(); + fnode.minFlushCounter = 0; + + // Sulama bitince sulama sırasında geçen su miktarlarını ve debiyi hesapla + fnode.WI = fnode.pulseTransmit * fnode.watermeterCoefficient; + fnode.WIC = fnode.pulse * fnode.watermeterCoefficient; + fnode.QI = (float)fnode.WI / timer.read(); + + // Sulama dışı değişkenleri sıfırla + fnode.WD = 0; + fnode.WDC = 0; + fnode.QD = 0; + + // Basınç alarmlarını sıfırla + fnode.pressureLowError = false; + fnode.pressureNormalError = false; + fnode.pressureHighError = false; + + // Timerı resetle + timer.reset(); + + // Pals sayaç ISR değişkenlerini sıfırla + fnode.pulse = 0; + fnode.pulseTransmit = 0; + fnode.pulsePressureCheck = 0; + + // SULAMA BİTTİĞİNDE SON KEZ DATA GÖNDER !!! + prepare_data(); + if (fnode.autosend == true) { + send_to_coordinator(fnode.dataBuffer); + } + memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + // SULAMANIN BİTTİĞİNİ BELİRTEN ALARMI GÖNDER !!! + send_alarm(IRRIGATION_ENDED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + // Sulama sırasında geçen su miktarını sıfırla + fnode.WIC = 0; + fnode.WI = 0; + fnode.QI = 0; + + // Veri aktarım aralığını sulama dışı sıklığa ayarla + dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60); + + // Sulamanın bittiğini EEPROM'a yaz + eeprom_write(EEPROM_TYPE, IRRI_STATUS_ADDR, 0); + + } + + // Giriş basıncı set değerinin üzerine çıktığında filtrasyon aktive olur. (Kendi başına çalışma koşulu) + // Bu durumda çıkış basıncının set edilen değere ulaşıp ulaşmadığına bakılır + //(SULAMA) + } else if (fnode.inletPressure >= (float)fnode.inletPressureSet / 10.0f) { + + // Giriş basıncı set edilen değerden yüksekse sulama başladı (filtrasyondan su geçişi var) alarmı gönderilir + if (fnode.irrigation == false) { + + fnode.irrigation = true; + + dataTransmitTicker.detach(); + + fnode.WDC = fnode.pulse * fnode.watermeterCoefficient; + fnode.WD = fnode.pulseTransmit * fnode.watermeterCoefficient; + fnode.QD = (float)fnode.WD / timer.read(); + + timer.reset(); + + fnode.pulse = 0; + fnode.pulseTransmit = 0; + fnode.pulsePressureCheck = 0; + + fnode.WI = 0; + fnode.WIC = 0; + fnode.QI = 0; + + // Basınç alarmlarını sıfırla + fnode.pressureLowError = false; + fnode.pressureNormalError = false; + fnode.pressureHighError = false; + + // Veri aktarım aralığını sulama sıklığına ayarla + dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60); + + //Sulama başlayınca ilk sulama verisini gönder + prepare_data(); + if (fnode.autosend == true) { + send_to_coordinator(fnode.dataBuffer); + } + memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + // Sulama başlayınca sulama başladı alarmını gönder + send_alarm(IRRIGATION_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + fnode.WD = 0; + fnode.WDC = 0; + fnode.QD = 0; + + // Periyodik yıkama süresini yeniden başlat + fnode.periodicFirstStartCounter ++; + + if (fnode.periodicFirstStartCounter == 1) { + + periodicFlushTicker.attach(&periodic_flush_isr, 1); + fnode.periodicFlushCounter = 0; + + } else if (fnode.periodicFirstStartCounter > 1) { + + fnode.periodicFirstStartCounter = 2; + + if (fnode.periodicFlushCounter >= fnode.periodicFlushInterval * 60 * 60) { + + fnode.periodicFlushCounter = 0; + periodicFlushTicker.attach(&periodic_flush_isr, 1); + + } else { + + periodicFlushTicker.attach(&periodic_flush_isr, 1); + + } + } + + // Min yıkama aralığını yeniden başlat + fnode.minFlushCounter = 0; + + // Sulamanın başladığını EEPROM'a yaz + eeprom_write(EEPROM_TYPE, IRRI_STATUS_ADDR, 1); + + } + + // Sulama yapılıyorsa ve sayaç mevcutsa geçen su miktarlarını sulama süresince her basınç kontrolü yapıldığında hesapla + if ((fnode.systemSetup >> 3) & 1) { + + fnode.WIC = fnode.pulse * fnode.watermeterCoefficient; + fnode.WI = fnode.pulsePressureCheck * fnode.watermeterCoefficient; + fnode.QI = (float)fnode.WI / (float)fnode.pressureControlFrequency; + + fnode.pulsePressureCheck = 0; + + } + + // Eğer çıkış basıncı set edilen değere ulaşmışsa DP de kontrol edilir (Çıkış basıncı stabil durumda, DP kontrolü başlayacak). Ancak o an periyodik yıkama veya elle yıkama olmamaması ve ters yıkamanın kapatılmamaış olması ve iki yıkama arasındaki min sürenin geçmiş olması gerekir. + if ((fnode.outletPressure >= (float)fnode.outletPressureSet / 10.0f) && fnode.flushing == false && fnode.flushEnabled == 1 && fnode.isMinTimePassed == true) { + + if (fnode.dpControlStarted == false) { + + fnode.dpControlStarted = true; + + fnode.globalFlushPhase = 1; + fnode.currentFlushPhase = 1; + fnode.globalFlushingFilter = 1; + fnode.currentFlushingFilter = 1; + fnode.currentWorkingSlave = 0; + + send_alarm(DP_CONTROL_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + + // DP set edilen değerden yüksekse ve hata durumu yoksa ve ters yıkama aktiflenmişse ve o an yıkama yapılmıyorsa ve min bekleme zamanı geçmişse ters yıkamayı başlat + if (fnode.dpPressure >= (float)(fnode.dpSet / 10.0f) && fnode.checkDp == true && fnode.errorOccured == false && fnode.flushEnabled == 1 && fnode.flushing == false && fnode.isMinTimePassed == true) { + + // Periyodik yıkama ISR'sini durdur ve sayacı sıfırla + periodicFlushTicker.detach(); + fnode.periodicFlushCounter = 0; + + fnode.isMinTimePassed = false; + fnode.minFlushCounter = 0; + + fnode.checkDp = false; + + fnode.flushing = true; + fnode.flushStarted = true; + + // Yıkama fazı 1 + fnode.globalFlushPhase = 1; + fnode.currentFlushPhase = 1; + fnode.globalFlushingFilter = 1; + fnode.currentFlushingFilter = 1; + fnode.currentWorkingSlave = 0; + + send_alarm(BACKFLUSH_DP_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + } + } + } + +// YIKAMA FAZLARI + if (fnode.currentFlushPhase == 1 && fnode.flushStarted == true) { + + // Ters yıkama bitirme fazı + if (fnode.globalFlushPhase == fnode.lastFlushPhase) { + + fnode.flushStarted = false; + + send_alarm(BAKCFLUSH_ENDED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + // DP kontrolünü yeniden başlat + fnode.checkDp = true; + fnode.flushing = false; + fnode.dpControlStarted = false; + + // Yıkama bitti + // Sulama varsa periyodik sayaç resetlenir ve devam eder + // Sulama yoksa periyodik sayaç pause moduna alınır + + if (fnode.irrigation == true) { + + fnode.periodicFlushCounter = 0; + periodicFlushTicker.attach(&periodic_flush_isr, 1); + + } else { + + periodicFlushTicker.detach(); + + } + + // Yıkama bittiği için min yıkama süresi sayacını etkinleştir + fnode.minFlushCounter = 0; + fnode.isMinTimePassed = false; + + if (fnode.irrigation == true) { + + minFlushTicker.attach(&min_flush_interval_isr, 1); + + } else { + + minFlushTicker.detach(); + + } + + } else { + + fnode.flushStarted = false; + fnode.flowControl = false; + + // SOLENOIDLER ACIK + if (open_solenoid(FILTER_MAIN_SOLENOID) == false) { + + // ALARM + } + + if (send_command(fnode.currentWorkingSlave, OPEN_SOLENOID, fnode.currentFlushingFilter) == false) { + + // SEND ERROR ALARM + + } else { + + send_alarm(FILTER_FLUSH_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + + // Faz 2'yi zamanla + flushTimer.attach(&flush_phase_isr, (float)fnode.flowControlLatency); + } + + + } else if (fnode.currentFlushPhase == 2 && fnode.flushStarted == true) { + + fnode.flushStarted = false; + fnode.flowControl = true; + + // Faz 3'ü zamanla + flushTimer.attach(&flush_phase_isr, (float)(fnode.flushDuration - fnode.flowControlLatency)); + + } else if (fnode.currentFlushPhase == 3 && fnode.flushStarted == true) { + + fnode.flushStarted = false; + fnode.flowControl = false; + + // SOLENOIDLER KAPALI + if (close_solenoid(FILTER_MAIN_SOLENOID) == false) { + + // ALARM + } + + if (send_command(fnode.currentWorkingSlave, CLOSE_SOLENOID, fnode.currentFlushingFilter) == false) { + + // SEND ERROR ALARM + + } else { + + send_alarm(FILTER_FLUSH_ENDED, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + + // Faz 4'ü zamanla + flushTimer.attach(&flush_phase_isr, (float)fnode.flowControlLatency); + + } else if (fnode.currentFlushPhase == 4 && fnode.flushStarted == true) { + + fnode.flushStarted = false; + fnode.flowControl = true; + + // Sonraki ya da son fazı zamanla + flushTimer.attach(&flush_phase_isr, (float)(fnode.flushInterval - fnode.flowControlLatency)); + } + + + +// AKIŞ SENSÖRÜ KONTROLÜ +// YIKAMA SIRASINDA +// Filtre yıkanırken AKIŞ YOK hatası: + if (fnode.currentFlushPhase == 2 && flowSensor.read() == 0 && fnode.flowControl == true) { + + // Eğer hata olduğunda ters yıkama duracaksa + if (fnode.onErrorStop == 1) { + + fnode.flowControl = false; + + // Faz zamanlayıcısını kapat + flushTimer.detach(); + + fnode.errorOccured = true; + fnode.flushing = false; + + // SOLENOIDLER KAPALI + if (close_solenoid(FILTER_MAIN_SOLENOID) == false) { + + // ALARM + } + + + if (send_command(fnode.currentWorkingSlave, CLOSE_SOLENOID, fnode.currentFlushingFilter) == false) { + + + } else { + + send_alarm(NO_FLOW_DURING_FLUSH, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + + fnode.globalFlushPhase = 0; + fnode.currentFlushPhase = 0; + fnode.globalFlushingFilter = 0; + fnode.currentFlushingFilter = 0; + fnode.currentWorkingSlave = 0; + + // Yıkama bittiği için periyodik yıkama sayacını aktifleştir. + fnode.periodicFlushCounter = 0; + periodicFlushTicker.attach(&periodic_flush_isr, 1); + + } else { + + fnode.flowControl = false; + + // Filtre yıkaması sırasında akış yok hatası + send_alarm(NO_FLOW_DURING_FLUSH, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + + +//----------------------------------------------------------------------------// + // YIKAMA SONRASINDA + // Filtre yıkaması arasında AKIŞ VAR hatası: + } else if (fnode.currentFlushPhase == 4 && flowSensor.read() == 1 && fnode.flowControl == true) { + + // Eğer hata olduğunda ters yıkama duracaksa + if (fnode.onErrorStop == 1) { + + fnode.flowControl = false; + + // Faz zamanlayıcısını kapat + flushTimer.detach(); + + fnode.errorOccured = true; + fnode.flushing = false; + + // 1. ve ana solenoid Faz 4'de kapatıldığı için kapatmaya gerek yok. + + send_alarm(FLOW_DURING_FLUSH, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + fnode.globalFlushPhase = 0; + fnode.currentFlushPhase = 0; + fnode.globalFlushingFilter = 0; + fnode.currentFlushingFilter = 0; + fnode.currentWorkingSlave = 0; + + // Yıkama bittiği için periyodik yıkama sayacını aktifleştir. + fnode.periodicFlushCounter = 0; + periodicFlushTicker.attach(&periodic_flush_isr, 1); + + } else { + + fnode.flowControl = false; + + // Filtre yıkaması arasında akış var hatası + send_alarm(FLOW_DURING_FLUSH, fnode.globalFlushingFilter, fnode.currentWorkingSlave); + + } + } + + + // WSN Komutlarının İşlenmesi + if (fnode.rfInterruptComplete == true) { + + // FENABLE + if (strncmp (fnode.rfBuffer, fenable_command, 7) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FENABLE); + + // FDISABLE + } else if (strncmp (fnode.rfBuffer, fdisable_command, 8) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FDISABLE); + + // FSETSYS + } else if (strncmp (fnode.rfBuffer, fsetsys_command, 7) == 0) { + + sscanf (fnode.rfBuffer,"%s%hhd%hhd%hhd%hhd%hd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hhd%hd%hhd", fnode.str, &fnode.systemSetup, &fnode.autosendStatus, &fnode.irriTransmitInterval, &fnode.dryTransmitInterval, &fnode.watermeterCoefficient, &fnode.pMax, &fnode.pressureSensorType, &fnode.dpSet, &fnode.pressureControlFrequency, &fnode.flushDuration, &fnode.flushInterval, &fnode.flowControlLatency, &fnode.flushEnabled, &fnode.pressureSensorPosition, &fnode.onErrorStop, &fnode.pressureLowThreshold, &fnode.pressureHighThreshold, &fnode.alarmsEnabled, &fnode.dpThreshold, &fnode.inletPressureSet, &fnode.outletPressureSet, &fnode.periodicFlushInterval, &fnode.minFlushInterval, &fnode.filterNumber); + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + memset (fnode.str, 0, sizeof(fnode.str)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FSETSYS); + + // FGETCFG + } else if (strncmp(fnode.rfBuffer, fgetcfg_command, 7) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FGETCFG); + + // FREAD + } else if (strncmp(fnode.rfBuffer, fread_command, 5) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FREAD); + + // FFIX + } else if (strncmp(fnode.rfBuffer, ffix_command, 4) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FFIX); + + // FTEST + } else if (strncmp(fnode.rfBuffer, ftest_command, 5) == 0) { + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FTESTOK\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + // FRESET komutu + } else if (strncmp(fnode.rfBuffer, freset_command, 6) == 0) { + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + if (fnode.irrigation == true) { + + eeprom_write(EEPROM_TYPE, IRRI_STATUS_ADDR, 1); + + } else { + + eeprom_write(EEPROM_TYPE, IRRI_STATUS_ADDR, 0); + + } + + if (fnode.autosend == true) { + + eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 1); + + } else { + + eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 0); + + } + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FRESETOK\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + wait(1); + NVIC_SystemReset(); + + // FCLEAR + } else if (strncmp(fnode.rfBuffer, fclear_command, 6) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + bool eepromOk = true; + + for (uint16_t i = 0; i < 60; i++) { + + eeprom_write(EEPROM_TYPE, i, 0xFF); + + } + + for (uint16_t i = 0; i < 60; i++) { + + if (eeprom_read(EEPROM_TYPE, i) != 0xFF) { + + eepromOk = false; + + } + } + + if (eepromOk == true) { + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FCLEAROK\"}"); + + } else { + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FCLEARERR\"}"); + + } + + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + // FGETSTATUS + } else if (strncmp(fnode.rfBuffer, fgetstatus_command, 10) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FGETSTATUS); + + // FFGETSTAT + } else if (strncmp(fnode.rfBuffer, ffgetstat_command, 9) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FFGETSTAT); + + // FGETFSTATUS + } else if (strncmp(fnode.rfBuffer, fgetfstatus_command, 11) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FGETFSTATUS); + + // FLUSHNOW + } else if (strncmp(fnode.rfBuffer, fflushnow_command, 9) == 0) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + process_command(FLUSHNOW); + + // FRTON + } else if (strncmp(fnode.rfBuffer, frton_command, 5) == 0) { + + if(fnode.rtActive == false) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FRTONOK\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + fnode.rtCounter = 0; + fnode.rtActive = true; + + fnode.rtPulseFirst = fnode.pulse; + + rtDataTransmitTicker.attach(&rt_data_transmit_isr, RT_DATA_TRANSMIT_INTERVAL); + + } else { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FRTONERROR\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + } + + // FRTOFF + } else if (strncmp(fnode.rfBuffer, frtoff_command, 6) == 0) { + + if (fnode.rtActive == true) { + + rtDataTransmitTicker.detach(); + + fnode.rtCounter = 0; + fnode.rtActive = false; + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FRTOFFOK\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + } else { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + sprintf(fnode.dataBuffer, "%s", "{CMD:\"FRTOFFERROR\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + } + + // GETFRTSTATUS + } else if (strncmp(fnode.rfBuffer, getfrtstatus_command, 12) == 0) { + + if (fnode.rtActive == true) { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + sprintf(fnode.dataBuffer, "%s", "{CMD:\"GETFRTSTATUS\",STAT:\"ACTIVE\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + } else { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + sprintf(fnode.dataBuffer, "%s", "{CMD:\"GETFRTSTATUS\",STAT:\"PASSIVE\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + } + + // SELTESTON + } else if (strncmp(fnode.rfBuffer, selteston_command, 9) == 0) { + + sscanf (fnode.rfBuffer,"%s%hhd%hhd", fnode.str, &fnode.testid, &fnode.testFilterNo); + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + memset (fnode.str, 0, sizeof(fnode.str)); + + if (send_command(fnode.testid, TEST_OPEN_SOLENOID, fnode.testFilterNo) == true) { + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"SELTESTONOK\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + } else { + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"SELTESTONERROR\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + } + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + // SELTESTOFF + } else if (strncmp(fnode.rfBuffer, seltestoff_command, 10) == 0) { + + sscanf (fnode.rfBuffer,"%s%hhd%hhd", fnode.str, &fnode.testid, &fnode.testFilterNo); + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + memset (fnode.str, 0, sizeof(fnode.str)); + + if (send_command(fnode.testid, TEST_CLOSE_SOLENOID, fnode.testFilterNo) == true) { + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"SELTESTOFFOK\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + } else { + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"SELTESTOFFERROR\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + } + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + + // TANIMSIZ KOMUT + } else { + + memset (fnode.rfBuffer, 0, sizeof(fnode.rfBuffer)); + + sprintf(fnode.dataBuffer, "%s", "{CMD:\"UNKNOWN COMMAND\"}"); + send_to_coordinator(fnode.dataBuffer); + memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer)); + + fnode.rfInterruptComplete = false; + rf.attach(&rf_rx_isr, Serial::RxIrq); + } + } + } +} \ No newline at end of file