1

Dependencies:   mbed

function.h

Committer:
meric
Date:
2018-07-09
Revision:
0:2a01c5a56ed1

File content as of revision 0:2a01c5a56ed1:

#ifndef FUNCTION_H
#define FUNCTION_H

/*
    ****************************************************************************
    ****************************************************************************
    ** DEVINT BİLİŞİM YAZILIM DONANIM TİC. LTD. ŞTİ. TARAFINDAN GELİŞTİRİLMİŞTİR
    ** İzmir / TÜRKİYE
    **
    ** Copyright (C) 2015
    ****************************************************************************
    ****************************************************************************
    *************************************************************** K A M B O **
*/

// FONKSIYON PROTOTİPLERİ
void configure_eeprom_default_values(void);
//******************************************************************************

void init_node(void);
//******************************************************************************

float read_pressure_dp(void);
//******************************************************************************

float read_pressure(void);
//******************************************************************************

void prepare_data(void);
//******************************************************************************

void prepare_data_fread(void);
//******************************************************************************

void send_to_coordinator(char* char_array);
//******************************************************************************

void process_command(uint8_t cmmnd);
//******************************************************************************

void data_transmit_isr(void);
//******************************************************************************

void rf_rx_isr(void);
//******************************************************************************

void master_rx_isr(void);
//******************************************************************************

bool open_solenoid(uint8_t filter_no);
//******************************************************************************

bool close_solenoid(uint8_t filter_no);
//******************************************************************************

float map(float x, float in_min, float in_max, float out_min, float out_max);
//******************************************************************************

void watermeter_isr(void);
//******************************************************************************

void flowrate_isr(void);
//******************************************************************************

void flush_phase_isr(void);
//******************************************************************************

void pressure_check_isr(void);
//******************************************************************************

bool check_and_close_valves(void);
//******************************************************************************

void periodic_flush_isr(void);
//******************************************************************************

void min_flush_interval_isr(void);
//******************************************************************************

void rt_data_transmit_isr(void);
//******************************************************************************

void send_alarm(uint8_t _alarmID, uint16_t _filterID, uint8_t _slaveID);
//******************************************************************************

bool send_command(uint8_t _slaveid, uint8_t _command, uint8_t _filterid);
//******************************************************************************

// FONKSIYONLAR
float map(float x, float in_min, float in_max, float out_min, float out_max)
{
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

//
bool check_and_close_valves()
{
    bool check = false;

    for (uint8_t _slaveID = 0; _slaveID <= fnode.totalSlaveNumber - 1; _slaveID++) {

        for (uint8_t _filterNo = 0; _filterNo < 5; _filterNo ++) {

            if (send_command(_slaveID, CLOSE_SOLENOID, _filterNo)) {

                check = true;
                wait_ms(500);

            } else {

                check = false;

            }

            if (check == false) {
                break;
            }
        }

        if (check == false) {
            break;
        }
    }

    return check;
}

bool open_solenoid(uint8_t _filter_no)
{
    bool _success = false;

    switch (_filter_no) {

        case FILTER_1_SOLENOID: {                                            // OUT1

            // İleri
            fnode.filterByte_2 &= ~(1 << 6);                       // Bit 6 = 0
            fnode.filterByte_1 = fnode.filterByte_1;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_2 &= ~(1 << 5);                       // Bit 5 = 0
                fnode.filterByte_2 &= ~(1 << 4);                       // Bit 4 = 0
                fnode.filterByte_1 = fnode.filterByte_1;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_2 |= 1 << 4;                          // Bit 4 = 1
                    fnode.filterByte_2 |= 1 << 5;                          // Bit 5 = 1
                    fnode.filterByte_1 = fnode.filterByte_1;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;

        case FILTER_2_SOLENOID: {                                            // OUT2

            // İleri
            fnode.filterByte_2 &= ~(1 << 3);                       // Bit 3 = 0
            fnode.filterByte_1 = fnode.filterByte_1;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_2 &= ~(1 << 2);                       // Bit 2 = 0
                fnode.filterByte_2 &= ~(1 << 1);                       // Bit 1 = 0
                fnode.filterByte_1 = fnode.filterByte_1;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_2 |= 1 << 1;                          // Bit 1 is 1
                    fnode.filterByte_2 |= 1 << 2;                          // Bit 2 is 1
                    fnode.filterByte_1 = fnode.filterByte_1;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }


                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;

        case FILTER_3_SOLENOID: {                                            // OUT3

            // İleri
            fnode.filterByte_2 &= ~(1 << 0);                       // Bit 0 = 0
            fnode.filterByte_1 = fnode.filterByte_1;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_1 &= ~(1 << 7);                       // Bit 7 = 0
                fnode.filterByte_1 &= ~(1 << 6);                       // Bit 6 = 0
                fnode.filterByte_2 = fnode.filterByte_2;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_1 |= 1 << 6;                          // Bit 6 = 1
                    fnode.filterByte_1 |= 1 << 7;                          // Bit 7 = 1
                    fnode.filterByte_2 = fnode.filterByte_2;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;

        case FILTER_4_SOLENOID: {                                            // OUT4

            // İleri
            fnode.filterByte_1 &= ~(1 << 5);                       // Bit 5 = 0
            fnode.filterByte_2 = fnode.filterByte_2;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_1 &= ~(1 << 4);                       // Bit 4 = 0
                fnode.filterByte_1 &= ~(1 << 3);                       // Bit 3 = 0
                fnode.filterByte_2 = fnode.filterByte_2;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_1 |= 1 << 3;                          // Bit 3 = 1
                    fnode.filterByte_1 |= 1 << 4;                          // Bit 4 = 0
                    fnode.filterByte_2 = fnode.filterByte_2;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;

        case FILTER_MAIN_SOLENOID: {                                         // OUT5

            // İleri
            fnode.filterByte_1 &= ~(1 << 2);                       // Bit 2 = 0
            fnode.filterByte_2 = fnode.filterByte_2;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_1 &= ~(1 << 1);                       // Bit 1 = 0
                fnode.filterByte_1 &= ~(1 << 0);                       // Bit 0 = 0
                fnode.filterByte_2 = fnode.filterByte_2;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_1 |= 1 << 0;                          // Bit 0 = 1
                    fnode.filterByte_1 |= 1 << 1;                          // Bit 1 = 0
                    fnode.filterByte_2 = fnode.filterByte_2;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;
    }

    return _success;
}

//
bool close_solenoid(uint8_t _filter_no)
{
    bool _success = false;

    switch (_filter_no) {

        case FILTER_1_SOLENOID: {                                            // OUT1

            // Geri
            fnode.filterByte_2 |= 1 << 6;                          // Bit 6 = 1
            fnode.filterByte_1 = fnode.filterByte_1;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_2 &= ~(1 << 5);                       // Bit 5 = 0
                fnode.filterByte_2 &= ~(1 << 4);                       // Bit 4 = 0
                fnode.filterByte_1 = fnode.filterByte_1;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_2 |= 1 << 4;                          // Bit 4 = 1
                    fnode.filterByte_2 |= 1 << 5;                          // Bit 5 = 1
                    fnode.filterByte_1 = fnode.filterByte_1;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }


            } else {

                _success = false;

            }
        }
        break;

        case FILTER_2_SOLENOID: {                                            // OUT2

            // Geri
            fnode.filterByte_2 |= 1 << 3;                          // Bit 3 = 1
            fnode.filterByte_1 = fnode.filterByte_1;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_2 &= ~(1 << 2);                       // Bit 2 = 0
                fnode.filterByte_2 &= ~(1 << 1);                       // Bit 1 = 0
                fnode.filterByte_1 = fnode.filterByte_1;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_2 |= 1 << 1;                          // Bit 1 = 1
                    fnode.filterByte_2 |= 1 << 2;                          // Bit 2 = 1
                    fnode.filterByte_1 = fnode.filterByte_1;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;

        case FILTER_3_SOLENOID: {                                            // OUT3

            // Geri
            fnode.filterByte_2 |= 1 << 0;                          // Bit 0 = 1
            fnode.filterByte_1 = fnode.filterByte_1;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_1 &= ~(1 << 7);                       // Bit 7 = 0
                fnode.filterByte_1 &= ~(1 << 6);                       // Bit 6 = 0
                fnode.filterByte_2 = fnode.filterByte_2;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_1 |= 1 << 6;                          // Bit 6 = 1
                    fnode.filterByte_1 |= 1 << 7;                          // Bit 7 = 1
                    fnode.filterByte_2 = fnode.filterByte_2;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;

        case FILTER_4_SOLENOID: {                                            // OUT4

            // Geri
            fnode.filterByte_1 |= 1 << 5;                          // Bit 5 = 1
            fnode.filterByte_2 = fnode.filterByte_2;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_1 &= ~(1 << 4);                       // Bit 4 = 0
                fnode.filterByte_1 &= ~(1 << 3);                       // Bit 3 = 0
                fnode.filterByte_2 = fnode.filterByte_2;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_1 |= 1 << 3;                          // Bit 3 = 1
                    fnode.filterByte_1 |= 1 << 4;                          // Bit 4 = 0
                    fnode.filterByte_2 = fnode.filterByte_2;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;

        case FILTER_MAIN_SOLENOID: {                                         // OUT5

            // Geri
            fnode.filterByte_1 |= 1 << 2;                          // Bit 2 = 1
            fnode.filterByte_2 = fnode.filterByte_2;

            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                _success = true;

                // H-köprüsünü aç ve uyandır
                fnode.filterByte_1 &= ~(1 << 1);                       // Bit 1 = 0
                fnode.filterByte_1 &= ~(1 << 0);                       // Bit 0 = 0
                fnode.filterByte_2 = fnode.filterByte_2;

                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                    wait_ms(250);

                    _success = true;

                    // Uyut ve H-köprüsünü kapat
                    fnode.filterByte_1 |= 1 << 0;                          // Bit 0 = 1
                    fnode.filterByte_1 |= 1 << 1;                          // Bit 1 = 0
                    fnode.filterByte_2 = fnode.filterByte_2;

                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {

                        _success = true;

                    } else {

                        _success = false;

                    }

                } else {

                    _success = false;

                }

            } else {

                _success = false;

            }
        }
        break;
    }

    return _success;
}

//
void configure_eeprom_default_values()
{
    if (eeprom_read(EEPROM_TYPE, DEFAULT_CONFIG_ADDR) != 35) {

        for (uint8_t i = 0; i < 99; i++) {

            eeprom_write(EEPROM_TYPE, i, 0xFF);

        }

        eeprom_write(EEPROM_TYPE, DEFAULT_CONFIG_ADDR, 35);

        eeprom_write(EEPROM_TYPE, SYSTEM_SETUP_ADDR, SYSTEM_SETUP_DEFAULT);
        eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, AUTOSEND_STATUS_DEFAULT);
        eeprom_write(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR, IRRI_TRANSMIT_INTERVAL_DEFAULT);
        eeprom_write(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR, DRY_TRANSMIT_INTERVAL_DEFAULT);
        eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1, WATERMETER_COEFF_DEFAULT >> 8);
        eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2, WATERMETER_COEFF_DEFAULT & 0xFF);
        eeprom_write(EEPROM_TYPE, PMAX_ADDR, PMAX_DEFAULT);
        eeprom_write(EEPROM_TYPE, PRESSURE_SENSOR_ADDR, PRESSURE_SENSOR_DEFAULT);
        eeprom_write(EEPROM_TYPE, DP_ADDR, DP_DEFAULT);
        eeprom_write(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR, PRESSURE_CONTROL_FREQUENCY_DEFAULT);
        eeprom_write(EEPROM_TYPE, FLUSH_DURATION_ADDR, FLUSH_DURATION_DEFAULT);
        eeprom_write(EEPROM_TYPE, FLUSH_INTERVAL_ADDR, FLUSH_INTERVAL_DEFAULT);
        eeprom_write(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR, FLOW_CONTROL_LATENCY_DEFAULT);
        eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, FLUSH_ENABLE_DEFAULT);
        eeprom_write(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR, PR_SENSOR_POSITION_DEFAULT);
        eeprom_write(EEPROM_TYPE, BACKFLUSH_STOP_ADDR, BACKFLUSH_STOP_DEFAULT);
        eeprom_write(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR, INLET_PRS_LOW_TRS_DEFAULT);
        eeprom_write(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR, INLET_PRS_HIGH_TRS_DEFAULT);
        eeprom_write(EEPROM_TYPE, ALARMS_ENABLE_ADDR, ALARMS_ENABLE_DEFAULT);
        eeprom_write(EEPROM_TYPE, DP_HIGH_TRS_ADDR, DP_HIGH_TRS_DEFAULT);
        eeprom_write(EEPROM_TYPE, INLET_PRS_SET_ADDR, INLET_PRS_SET_DEFAULT);
        eeprom_write(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR, OUTLET_PRS_SET_FOR_DP_DEFAULT);
        eeprom_write(EEPROM_TYPE, PERIODIC_FLUSH_ADDR, PERIODIC_FLUSH_DEFAULT);
        eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1, MIN_FLUSH_INTERVAL_DEFAULT >> 8);
        eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2, MIN_FLUSH_INTERVAL_DEFAULT & 0xFF);
        eeprom_write(EEPROM_TYPE, FILTER_NUMBER_ADDR, FILTER_NUMBER_DEFAULT);
    }
}

//
void init_node()
{
    // EEPROM'dan sistem ayarlarını oku
    fnode.systemSetup = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);

    // Filtre sayısını hesapla
    fnode.filterNumber = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);
    fnode.lastFlushPhase = ((uint16_t)fnode.filterNumber * 4) + 1;

    // Sayaç mevcuts ISR'yi aktifle
    if ((fnode.systemSetup >> 3) & 1 == 1) {

        watermeterInterrupt.rise(&watermeter_isr);

    }

    // EEPROM'dan sulama sırasında veri gönderim sıklığını oku
    fnode.irriTransmitInterval = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);

    // EEPROM'dan sulama dışında veri gönderim sıklığını oku
    fnode.dryTransmitInterval = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);

    // EEPROM'dan otomatik veri gönderimini oku
    if (eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR) == 1) {

        fnode.autosend = true;

    } else {

        fnode.autosend = false;

    }

    if (eeprom_read(EEPROM_TYPE, IRRI_STATUS_ADDR) == 1) {

        fnode.irrigation = true;

        dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);

        timer.reset();
        timer.start();

    } else {

        fnode.irrigation = false;

        dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);

        timer.reset();
        timer.start();

    }

    // EEPROM'dan sayaç katsayısını oku
    fnode.watermeterCoefficient = (eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1) << 8) + eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);

    // EEPROM'dan basınç sensörünün okuyabileceği maksimum basıncı oku
    fnode.pMax = eeprom_read(EEPROM_TYPE, PMAX_ADDR);

    // EEPROM'dan basınç sensörü tipini oku (4-20 mA veya 0-3.3v)
    fnode.pressureSensorType = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);

    // EEPROM'dan DP set değerini oku
    fnode.dpSet = eeprom_read(EEPROM_TYPE, DP_ADDR);

    // EEPROM'dan basınç kontrol sıklığını oku
    fnode.pressureControlFrequency = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);

    // EEPROM'dan 1 filtre yıkama süresini oku
    fnode.flushDuration = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);

    // EEPROM'dan 2 filtre yıkaması arasındaki bekleme süresini oku
    fnode.flushInterval = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);

    // EEPROM'dan akış kontrolü gecikme süresini oku (Akış kontrolü filtre yıkaması başladıktan ya da bittikten kaç saniye sonra yapılacak?)
    fnode.flowControlLatency = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);

    // EEPROM'dan ters yıkama kontrolü aktif ya da pasif durumunu oku
    if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 1) {

        fnode.flushEnabled = 1;

    } else {

        fnode.flushEnabled = 0;

    }

    // EEPROM'dan basınç sensörünün yerleştirme noktasını oku (Filtre öncesi ya da sonrası)
    fnode.pressureSensorPosition = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);

    // EEPROM'dan hata durumunda ters yıkamanın durdurulup durdurulmayacağını oku
    if (eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR) == 0) {

        fnode.onErrorStop = 0;

    } else {

        fnode.onErrorStop = 1;

    }

    fnode.pressureLowThreshold = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
    fnode.pressureHighThreshold = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);

    // Timer ve tickerları başlat
    // Basınç sürekli kontrol edilecek
    pressureCheckTicker.attach(&pressure_check_isr, fnode.pressureControlFrequency);

    // EEPROM'dan alarmların açık/kapalı durumunu oku
    if (eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR) == 0) {

        fnode.alarmsEnabled = 0;

    } else {

        fnode.alarmsEnabled = 1;

    }

    // EEPROM'dan DP alarmı eşik değerini oku
    // Yıkama sırasında DP bu değerin üstüne çıkarsa alarm gönderilir
    // Bazı durumlarda DP düşmeyebilir !!!
    fnode.dpThreshold = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);

    // EEPROM'dan sulamanın başladığının anlaşılacağı giriş basıncı set değerini oku
    fnode.inletPressureSet = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);

    // EEPROM'dan DP kontrolünün başlayacağı filtrasyon çıkış basıncı set değerini oku
    fnode.outletPressureSet = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);

    // periodicFlushInterval değeri 0 ise periyodik yıkama yapılmaz
    fnode.periodicFlushInterval = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);

    if (fnode.periodicFlushInterval == 0) {

        fnode.periodicFlushEnabled = false;
        periodicFlushTicker.detach();
        fnode.periodicFlushCounter = 0;

    } else {

        fnode.periodicFlushEnabled = true;
        fnode.periodicFlushCounter = 0;

        // Periodic flush isr works every 1 second to increase periodicCounter by 1
        // If periodicCounter value >= peridicFlushInterval * 3600
        // Example:
        // Periodic flush interval is 6 hours
        // Periodic counter counts every 1 seconds by ISR
        // In 1 hour there is 3600 seconds..... In 6 hours 6 * 3600 = 21600 seconds

        if (fnode.irrigation == true) {

            periodicFlushTicker.attach(&periodic_flush_isr, 1);                               // ISR set every 1 second

        } else {

            periodicFlushTicker.detach();

        }
    }

    // minFlushInterval değeri 0'dan farklı ise DP yıkamaları min süre beklenerek yapılır
    c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
    c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
    fnode.minFlushInterval = (c23_a << 8) + c23_b;

    if (fnode.minFlushInterval == 0) {

        fnode.minFlushEnabled = false;

    } else {

        fnode.minFlushEnabled = true;
    }

    if (fnode.filterNumber % 4 == 0) {

        fnode.totalSlaveNumber = fnode.filterNumber / 4;

    } else {

        fnode.totalSlaveNumber = (fnode.filterNumber / 4) + 1;
    }
}

//
float read_pressure_dp()
{
    // Analog kanal okumasının RMS (Root Mean Square) hesaplaması
    memset(rmsStore, 0, sizeof(rmsStore));
    totalSampling = 0.0;
    tempValue = 0.0;
    tdp = 0.0;

    for (uint8_t b = 0; b < RMS_SAMPLING_NUMBER; b++) {

        tempValue = dpSensor.read();
        rmsStore[b] = tempValue * tempValue;
        totalSampling = totalSampling + rmsStore[b];

    }

    tdp = (sqrt ((float)((totalSampling / RMS_SAMPLING_NUMBER)))) * 4096.0f;
    //

    // Fark basınç hesaplaması, BAR, -4 ile +4 bar arası
    // DP + 4 = ((Sensor okuması - 409.6) / 409.6) ==> Honeywell sensor katalog sadeleştirilmiş denklem
    tdpResult = ((tdp-409.6f)/409.6f) - 4.0f;

    if (tdpResult < 0) {

        tdpResult = 0;

    }

    tdpResult = floor(tdpResult * 10) / 10;

    return tdpResult;
}

//
float read_pressure()
{
    // Analog kanal okumasının RMS (Root Mean Square) hesaplaması
    memset(rmsStore, 0, sizeof(rmsStore));
    totalSampling = 0;
    tempValue = 0;
    tp = 0;

    for (uint8_t b = 0; b < RMS_SAMPLING_NUMBER; b++) {

        tempValue = pressureSensor.read();
        rmsStore[b] = tempValue * tempValue;
        totalSampling = totalSampling + rmsStore[b];

    }

    tp = (sqrt ((float)((totalSampling / RMS_SAMPLING_NUMBER)))) * 4096.0f;
    //

    if (fnode.pressureSensorType == 0) {

        // Ham analog verisinden basınç hesaplaması, BAR
        // Honeywell Truw Stability sensörlerine özel, PSI, 3.3v, map'lenmemiş
        tp = ((tp - 409.6f) / (3276.8f / (float)fnode.pMax)) * 0.0689476f; // 0.0689 is for psi to bar conversion;

    } else {

        // Ham analog verisinden basınç hesaplaması, BAR
        // 4-20 mA sensöre özel, BAR
        // 4 mA = 480 mV = 595.8 RAW
        // 20 mA = 2400 mV = 2978.9 RAW
        tp = map (tp, 595.8f, 2978.9f, 0.0f, (float)fnode.pMax);

    }

    if (tp < 0) {

        tp = 0;

    }

    tp = floor(tp * 10) / 10;

    return tp;
}

void prepare_data_fread()
{
    memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    // Filtrasyon JSON headırını yaz
    sprintf(fnode.temporaryBuffer, "%s", json[0]);
    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    // Eğer basınç sensörü varsa
    if (fnode.systemSetup & (1 << 1)) {

        // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
        if (fnode.systemSetup & (1 << 1)) {

            sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            // Basınç sensörü varken DP sensörü yoksa basınç sensörünün pozisyonuna göre giriş veya çıkış basıncını yaz
        } else {

            // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
            if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {

                sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

                // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
            } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {

                sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            }
        }

        // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
    } else {

        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
    }

    // Eğer DP sensörü varsa DP verisini ekle
    if (fnode.systemSetup & (1 << 1)) {

        sprintf(fnode.temporaryBuffer, "%s%.1f%c", jsonHeader[2], fnode.dpPressure, ',');
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

        // DP sensörü yoksa DP verisi NULL olsun
    } else {

        sprintf(fnode.temporaryBuffer, "%s%s%c", jsonHeader[2], "null", ',');
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    // Eğer sayaç mevcutsa su hacmi ve debi verilerini ekle
    // İki veri gönderimi arasındaki su hacmi ve debi verisini burada hesapla
    if (fnode.systemSetup & (1 << 3)) {

        sprintf(fnode.temporaryBuffer, "%s%llu%c%s%llu%c%s%.1f%c%s%llu%c%s%llu%c%s%.1f", jsonHeader[3], fnode.rWI, ',', jsonHeader[4], fnode.rWIC, ',', jsonHeader[5], fnode.rQI, ',', jsonHeader[6], fnode.rWD, ',', jsonHeader[7], fnode.rWDC, ',', jsonHeader[8], fnode.rQD);
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));


    } else {

        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c%s%s%c%s%s%c%s%s%c%s%s", jsonHeader[3], "null", ',', jsonHeader[4], "null", ',', jsonHeader[5], "null", ',', jsonHeader[6], "null", ',', jsonHeader[7], "null", ',', jsonHeader[8], "null");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    // Sulama durumu
    if (fnode.irrigation == true) {

        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    } else {

        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    // Yıkama durumu
    if (fnode.flushing == true) {

        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    } else {

        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    sprintf(fnode.temporaryBuffer, "%s", "},RT:1}");

    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
}


//
void prepare_data()
{
    memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    // Filtrasyon JSON headırını yaz
    sprintf(fnode.temporaryBuffer, "%s", json[0]);
    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    // Eğer basınç sensörü varsa
    if (fnode.systemSetup & (1 << 1)) {

        // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
        if (fnode.systemSetup & (1 << 0)) {

            sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            // Basınç sensörü varken DP sensörü yoksa basınç sensörünün pozisyonuna göre giriş veya çıkış basıncını yaz
        } else {

            // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
            if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {

                sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

                // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
            } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {

                sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            }
        }

        // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
    } else {

        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
    }

    // Eğer DP sensörü varsa DP verisini ekle
    if (fnode.systemSetup & (1 << 0)) {

        sprintf(fnode.temporaryBuffer, "%s%.1f%c", jsonHeader[2], fnode.dpPressure, ',');
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

        // DP sensörü yoksa DP verisi NULL olsun
    } else {

        sprintf(fnode.temporaryBuffer, "%s%s%c", jsonHeader[2], "null", ',');
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    // Eğer sayaç mevcutsa su hacmi ve debi verilerini ekle
    // İki veri gönderimi arasındaki su hacmi ve debi verisini burada hesapla
    if (fnode.systemSetup & (1 << 3)) {

        sprintf(fnode.temporaryBuffer, "%s%llu%c%s%llu%c%s%.1f%c%s%llu%c%s%llu%c%s%.1f", jsonHeader[3], fnode.WI, ',', jsonHeader[4], fnode.WIC, ',', jsonHeader[5], fnode.QI, ',', jsonHeader[6], fnode.WD, ',', jsonHeader[7], fnode.WDC, ',', jsonHeader[8], fnode.QD);
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));


    } else {

        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c%s%s%c%s%s%c%s%s%c%s%s", jsonHeader[3], "null", ',', jsonHeader[4], "null", ',', jsonHeader[5], "null", ',', jsonHeader[6], "null", ',', jsonHeader[7], "null", ',', jsonHeader[8], "null");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    // Sulama durumu
    if (fnode.irrigation == true) {

        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    } else {

        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    // Yıkama durumu
    if (fnode.flushing == true) {

        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    } else {

        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

    }

    sprintf(fnode.temporaryBuffer, "%s", "}}");

    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
}

//
void send_to_coordinator(char* char_array)
{
    rf.putc(COORD_ADDR_1);
    rf.putc(COORD_ADDR_2);
    rf.putc(EQUAL);
    rf.puts(char_array);
    rf.putc(CR);
    wait_ms(50);
}

//
void process_command(uint8_t cmnd)
{
    switch(cmnd) {

        case FENABLE: {

            // Eğer ters yıkama zaten akitflenmişse hata mesajı gönder
            if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 1) {

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FENABLEERR\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

                // Ters yıkamayı devre dışı bırak
            } else {

                // Yıkamanın devreye alındığını EEPROM'a yaz
                eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, 1);

                fnode.flushEnabled = 1;

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FENABLEOK\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }
        }
        break;

        case FDISABLE: {

            // Eğer ters yıkama zaten akitflenmişse hata mesajı gönder
            if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 0) {

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FDISABLEERR\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

                // Ters yıkamayı devre dışı bırak
            } else {

                // Yıkamanın devre dışı kaldığını EEPROM'a yaz
                eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, 0);

                fnode.flushEnabled = 0;

                /*
                // Yıkama zamanlayıcısını kapat
                flushTimer.detach();

                // Yıkama fazını sıfırla
                fnode.flushPhase = 0;

                // Solenoid vanaları kontrol et ve kapat
                check_and_close_valves();
                */

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FDISABLEOK\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }
        }
        break;

        case FSETSYS: {

            // Sistem ayarları
            eeprom_write(EEPROM_TYPE, SYSTEM_SETUP_ADDR, fnode.systemSetup);

            // Otomatik veri aktarımı
            eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, fnode.autosendStatus);

            // Yeni set edilecek veri aktarım aralıkları eskisinden farklıysa zamanlayıcıları yeni ayarla başlat
            // Eski ile yeni aktarım aralıkları aynı ise değişiklik yapma (Alt satırlarda)
            irriTrsIntOld = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
            eeprom_write(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR, fnode.irriTransmitInterval);

            dryTrsIntOld = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
            eeprom_write(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR, fnode.dryTransmitInterval);

            // Sayaç katsayısı
            eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1, fnode.watermeterCoefficient >> 8);
            eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2, fnode.watermeterCoefficient & 0xFF);

            // Basınç sensörü maksimum basıncı
            eeprom_write(EEPROM_TYPE, PMAX_ADDR, fnode.pMax);

            // Basınç sensörü tipi
            eeprom_write(EEPROM_TYPE, PRESSURE_SENSOR_ADDR, fnode.pressureSensorType);

            // DP set
            eeprom_write(EEPROM_TYPE, DP_ADDR, fnode.dpSet);

            // Basınç kontrol sıklığı
            eeprom_write(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR, fnode.pressureControlFrequency);

            // 1 filtre yıkama süresi
            eeprom_write(EEPROM_TYPE, FLUSH_DURATION_ADDR, fnode.flushDuration);

            // Yıkama aralığı
            eeprom_write(EEPROM_TYPE, FLUSH_INTERVAL_ADDR, fnode.flushInterval);

            // Akış kontrol gecikmesi
            eeprom_write(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR, fnode.flowControlLatency);

            // Ters yıkama devrede/devrede değil
            eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, fnode.flushEnabled);

            // Basınç sensörü pozisyonu
            eeprom_write(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR, fnode.pressureSensorPosition);

            // Hata durumunda ters yıkamayı durdur/durdurma
            eeprom_write(EEPROM_TYPE, BACKFLUSH_STOP_ADDR, fnode.onErrorStop);

            // Giriş basıncı alarm alt sınır eşik
            eeprom_write(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR, fnode.pressureLowThreshold);

            // Giriş basıncı alarm üst sınır eşik
            eeprom_write(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR, fnode.pressureHighThreshold);

            // Alarmlar devrede
            eeprom_write(EEPROM_TYPE, ALARMS_ENABLE_ADDR, fnode.alarmsEnabled);

            // DP alarm eşik değeri
            eeprom_write(EEPROM_TYPE, DP_HIGH_TRS_ADDR, fnode.dpThreshold);

            eeprom_write(EEPROM_TYPE, INLET_PRS_SET_ADDR, fnode.inletPressureSet);

            eeprom_write(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR, fnode.outletPressureSet);

            eeprom_write(EEPROM_TYPE, PERIODIC_FLUSH_ADDR, fnode.periodicFlushInterval);

            eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1, fnode.minFlushInterval >> 8);
            eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2, fnode.minFlushInterval & 0xFF);

            eeprom_write(EEPROM_TYPE, FILTER_NUMBER_ADDR, fnode.filterNumber);


            // Check written SSETSYS values on EEPROM
            c1 = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
            c2 = eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR);
            c3 = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
            c4 = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
            c5_a = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1);
            c5_b = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
            c5 = (c5_a << 8) + c5_b;
            c6 = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
            c7 = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
            c8 = eeprom_read(EEPROM_TYPE, DP_ADDR);
            c9 = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
            c10 = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
            c11 = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
            c12 = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
            c13 = eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR);
            c14 = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
            c15 = eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR);
            c16 = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
            c17 = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
            c18 = eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR);
            c19 = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
            c20 = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
            c21 = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
            c22 = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
            c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
            c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
            c23 = (c23_a << 8) + c23_b;
            c24 = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);

            // Kaydedilen değerler ile gönderilen değerleri karşılaştır
            // Aynı ise sunucuya mesaj gönder
            if (c1 == fnode.systemSetup && c2 == fnode.autosendStatus && c3 == fnode.irriTransmitInterval && c4 == fnode.dryTransmitInterval && c5 == fnode.watermeterCoefficient && c6 == fnode.pMax && c7 == fnode.pressureSensorType && c8 == fnode.dpSet && c9 == fnode.pressureControlFrequency && c10 == fnode.flushDuration && c11 == fnode.flushInterval && c12 == fnode.flowControlLatency && c13 == fnode.flushEnabled && c14 == fnode.pressureSensorPosition && c15 == fnode.onErrorStop && c16 == fnode.pressureLowThreshold && c17 == fnode.pressureHighThreshold && c18 == fnode.alarmsEnabled && c19 == fnode.dpThreshold && c20 == fnode.inletPressureSet && c21 == fnode.outletPressureSet && c22 == fnode.periodicFlushInterval && c23 == fnode.minFlushInterval && c24 == fnode.filterNumber) {

                sprintf(fnode.dataBuffer, "%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%c", "{CMD:\"FSETSYSOK\",C1:", c1, ",C2:", c2, ",C3:", c3, ",C4:", c4, ",C5:", c5, ",C6:", c6, ",C7:", c7, ",C8:", c8, ",C9:", c9, ",C10:", c10, ",C11:", c11, ",C12:", c12, ",C13:", c13, ",C14:", c14, ",C15:", c15, ",C16:", c16, ",C17:", c17, ",C18:", c18, ",C19:", c19, ",C20:", c20, ",C21:", c21, ",C22:", c22, ",C23:", c23, ",C24:", c24, '}');
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

                // YENİ SET Değerlerine göre ayarlar
                // Filtre sayısı
                fnode.filterNumber = c24;
                fnode.lastFlushPhase = ((uint16_t)fnode.filterNumber * 4) + 1;

                // Sayaç mevcutsa ISR'yi aktifle
                if (fnode.systemSetup & (1 << 3)) {

                    watermeterInterrupt.rise(NULL);
                    watermeterInterrupt.rise(&watermeter_isr);

                } else {

                    watermeterInterrupt.rise(NULL);
                }

                if (fnode.autosendStatus == 0) {

                    fnode.autosend = false;

                } else {

                    fnode.autosend = true;
                }

                // If irrigation phase and autosend is active and new data transmission interval is different than old one attach data transmission ISR again
                if (fnode.irrigation == true && fnode.autosend == true && irriTrsIntOld != fnode.irriTransmitInterval) {

                    dataTransmitTicker.detach();
                    dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);

                    // If not irrigation phase and autosend is active and new data transmission interval is different than old one attach data transmission ISR again
                } else if (fnode.irrigation == false && fnode.autosend == true && dryTrsIntOld != fnode.dryTransmitInterval) {

                    dataTransmitTicker.detach();
                    dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);

                    // If autosend is not active detach data transmission ISR
                } else if (fnode.autosend == false) {

                    dataTransmitTicker.detach();

                }

                // periodicFlushInterval değeri 0 ise periyodik yıkama yapılmaz
                if (fnode.periodicFlushInterval == 0) {

                    fnode.periodicFlushEnabled = false;
                    periodicFlushTicker.detach();
                    fnode.periodicFlushCounter = 0;

                } else {

                    fnode.periodicFlushEnabled = true;
                    fnode.periodicFlushCounter = 0;

                    // Periodic flush isr works every 1 second to increase periodicCounter by 1
                    // If periodicCounter value >= peridicFlushInterval * 3600
                    // Example:
                    // Periodic flush interval is 6 hours
                    // Periodic counter counts every 1 seconds by ISR
                    // In 1 hour there is 3600 seconds..... In 6 hours 6 * 3600 = 21600 seconds

                    if (fnode.irrigation == true) {

                        periodicFlushTicker.attach(&periodic_flush_isr, 1);                               // ISR set every 1 second

                    } else {

                        periodicFlushTicker.detach();

                    }
                }

                // minFlushInterval değeri 0'dan farklı ise DP yıkamaları min süre beklenerek yapılır
                if (fnode.minFlushInterval == 0) {

                    fnode.minFlushEnabled = false;

                } else {

                    fnode.minFlushEnabled = true;
                }

            } else {

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSETSYSERR\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }
        }
        break;

        case FGETCFG: {

            // Get configuration from EEPROM
            c1 = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
            c2 = eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR);
            c3 = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
            c4 = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
            c5_a = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1);
            c5_b = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
            c5 = (c5_a << 8) + c5_b;
            c6 = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
            c7 = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
            c8 = eeprom_read(EEPROM_TYPE, DP_ADDR);
            c9 = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
            c10 = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
            c11 = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
            c12 = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
            c13 = eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR);
            c14 = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
            c15 = eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR);
            c16 = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
            c17 = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
            c18 = eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR);
            c19 = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
            c20 = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
            c21 = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
            c22 = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
            c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
            c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
            c23 = (c23_a << 8) + c23_b;
            c24 = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);

            sprintf(fnode.dataBuffer, "%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%c", "{CMD:\"FGETCFGOK\",C1:", c1, ",C2:", c2, ",C3:", c3, ",C4:", c4, ",C5:", c5, ",C6:", c6, ",C7:", c7, ",C8:", c8, ",C9:", c9, ",C10:", c10, ",C11:", c11, ",C12:", c12, ",C13:", c13, ",C14:", c14, ",C15:", c15, ",C16:", c16, ",C17:", c17, ",C18:", c18, ",C19:", c19, ",C20:", c20, ",C21:", c21,  ",C22:", c22, ",C23:", c23, ",C24:", c24, '}');
            send_to_coordinator(fnode.dataBuffer);
            memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

        }
        break;

        case FSTART: {

            if (fnode.autosend == false) {

                fnode.autosend = true;

                if (fnode.irrigation) {

                    dataTransmitTicker.detach();
                    dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);

                } else {

                    dataTransmitTicker.detach();
                    dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);

                }

                // Save autosend enable status to EEPROM
                eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 1);

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTARTOK\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            } else {

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTARTERR\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }

        }
        break;


        case FSTOP: {

            if (fnode.autosend == true) {

                fnode.autosend = false;

                dataTransmitTicker.detach();

                // Save autosend disable status to EEPROM
                eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 0);

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTOPOK\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            } else {

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTOPERR\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }
        }
        break;

        case FFIX: {

            if (fnode.errorOccured == true) {

                fnode.errorOccured = false;

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FFIXOK\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            } else {

                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FFIXERR\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }
        }
        break;

        case FGETSTATUS: {

            //STAT:"IRR"
            if (fnode.irrigation == true) {

                sprintf(fnode.dataBuffer, "%s", "{STAT:\"IRR\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

                //STAT:"DRY"
            } else {

                sprintf(fnode.dataBuffer, "%s", "{STAT:\"DRY\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }

        }
        break;

        case FGETFSTATUS: {

            // Flushing Now
            if(fnode.flushing) {
                sprintf(fnode.dataBuffer, "%s", "{STAT:\"FLUSHING\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            } else {

                sprintf(fnode.dataBuffer, "%s", "{STAT:\"NOTFLUSHING\"}");
                send_to_coordinator(fnode.dataBuffer);
                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

            }
        }
        break;

        case FFGETSTAT: {

            memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            // Filtrasyon JSON headırını yaz
            //sprintf(fnode.temporaryBuffer, "%s", json[0]);
            sprintf(fnode.temporaryBuffer, "%s", "{STAT:{");
            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
            
            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 basınç sensörü varsa
            if (fnode.systemSetup & (1 << 1)) {

                // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
                if (fnode.systemSetup & (1 << 1)) {

                    sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
                    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

                    // Basınç sensörü varken DP sensörü yoksa basınç sensörünün pozisyonuna göre giriş veya çıkış basıncını yaz
                } else {

                    // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
                    if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {

                        sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
                        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

                        // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
                    } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {

                        sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
                        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

                    }
                }

                // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
            } else {

                sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
            }

            // Eğer DP sensörü varsa DP verisini ekle
            if (fnode.systemSetup & (1 << 1)) {

                sprintf(fnode.temporaryBuffer, "%s%.1f", jsonHeader[2], fnode.dpPressure);
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

                // DP sensörü yoksa DP verisi NULL olsun
            } else {

                sprintf(fnode.temporaryBuffer, "%s%s", jsonHeader[2], "null");
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            }


            // Sulama durumu
            if (fnode.irrigation == true) {

                sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            } else {

                sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            }

            // Yıkama durumu
            if (fnode.flushing == true) {

                sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            } else {

                sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));

            }

            sprintf(fnode.temporaryBuffer, "%s", "},RT:1}");

            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
            
            send_to_coordinator(fnode.dataBuffer);
            memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));

        }
        break;

        // Elle yıkamayı başlat
        case FLUSHNOW: {

            // Eğer zaten yıkama varsa
            if(fnode.flushing == true) {

                send_alarm(ALREADY_FLUSHING, fnode.globalFlushingFilter, fnode.currentWorkingSlave);

                // Yıkama yoksa başla
            } else if (fnode.flushEnabled == 1 && fnode.errorOccured == false) {

                    periodicFlushTicker.detach();
                    fnode.periodicFlushCounter = 0;

                    fnode.flushing = true;
                    fnode.flushStarted = true;
                    fnode.checkDp = false;

                    minFlushTicker.detach();
                    fnode.minFlushCounter = 0;
                    fnode.isMinTimePassed = false;

                    fnode.globalFlushPhase = 1;
                    fnode.currentFlushPhase = 1;
                    fnode.globalFlushingFilter = 1;
                    fnode.currentFlushingFilter = 1;
                    fnode.currentWorkingSlave = 0;

                    send_alarm(BACKFLUSH_MANUAL_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave);

            } else if (fnode.flushEnabled == 0 && fnode.errorOccured == false) {

                send_alarm(FLUSH_DISABLED, fnode.globalFlushingFilter, fnode.currentWorkingSlave);

            }
        }
        break;
    }
}

bool send_command(uint8_t _slaveid, uint8_t _command, uint8_t _filterid)
{
    bool _ackinit = false;

    if (_slaveid == MASTER_ID) {

        if (_command == OPEN_SOLENOID || _command == TEST_OPEN_SOLENOID) {

            if (open_solenoid(_filterid) == true) {

                _ackinit = true;

            }

        } else if (_command == CLOSE_SOLENOID || _command == TEST_CLOSE_SOLENOID) {

            if (close_solenoid(_filterid)) {

                _ackinit = true;

            }
        }

    } else {

        fnode.masterTxBuffer[0] = MASTER_ID;
        fnode.masterTxBuffer[1] = _slaveid;
        fnode.masterTxBuffer[2] = _command;
        fnode.masterTxBuffer[3] = _filterid;
        fnode.masterTxBuffer[4] = 0x0D;

        for (uint8_t i = 0; i < sizeof(fnode.masterTxBuffer); i++) {

            for (uint8_t j = 0; j < 3; j++) {

                if (master.putc(fnode.masterTxBuffer[i]) == fnode.masterTxBuffer[i]) {

                    _ackinit = true;

                } else {

                    _ackinit = false;

                }

                if (_ackinit == true) {

                    break;

                }
            }

            if (_ackinit == false) {

                break;

            }
        }

        // Slave'den cevap tamamlanıncaya/gelinceye kadar bekle (ISR ile tamamlanır)
        while (fnode.masterInterruptComplete != true) {}

        if (fnode.masterInterruptComplete == true) {

            if (fnode.masterRxBuffer[0] == _OK_) {

                _ackinit = true;

            } else {

                _ackinit  = false;

            }
        }


        memset (fnode.masterRxBuffer, 0, sizeof(fnode.masterRxBuffer));
        master.attach(&master_rx_isr, Serial::RxIrq);

        fnode.masterInterruptComplete = false;
    }

    return _ackinit;
}

// Data aktarım ISR
void data_transmit_isr()
{
    fnode.transmitData = true;
}

// RF Rx ISR
void rf_rx_isr()
{
    fnode.rfBufferChar = rf.getc();

    if (fnode.rfBufferChar != '\r') {

        fnode.rfBuffer[fnode.rfBufferCounter] = fnode.rfBufferChar;
        fnode.rfBufferCounter++;

    } else if (fnode.rfBufferChar == '\r') {

        rf.attach(NULL, Serial::RxIrq);
        fnode.rfBufferCounter = 0;
        fnode.rfInterruptComplete = true;
    }
}

void master_rx_isr()
{
    fnode.masterBufferChar = master.getc();

    if (fnode.masterBufferChar != '\r') {

        fnode.masterRxBuffer[fnode.masterBufferCounter] = fnode.masterBufferChar;
        fnode.masterBufferCounter++;

    } else if (fnode.masterBufferChar == '\r') {

        master.attach(NULL, Serial::RxIrq);
        fnode.masterBufferCounter = 0;
        fnode.masterInterruptComplete = true;
    }
}

// Sayaç pals ISR
void watermeter_isr()
{
    fnode.pulse ++;
    fnode.pulseTransmit ++;
    fnode.pulsePressureCheck ++;
}

// Yıkama fazı değişim ISR
void flush_phase_isr()
{
    fnode.flush_isr = true;
}

// Basınç kontrol ISR
void pressure_check_isr()
{
    fnode.checkPressure = true;
}

void periodic_flush_isr()
{
    fnode.periodicFlushCounter ++;
}

void min_flush_interval_isr()
{
    fnode.minFlushCounter ++;
}

void rt_data_transmit_isr()
{
    fnode.transmit_rtData = true;
    fnode.rtCounter ++;
}
#endif