1

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers function.h Source File

function.h

00001 #ifndef FUNCTION_H
00002 #define FUNCTION_H
00003 
00004 /*
00005     ****************************************************************************
00006     ****************************************************************************
00007     ** DEVINT BİLİŞİM YAZILIM DONANIM TİC. LTD. ŞTİ. TARAFINDAN GELİŞTİRİLMİŞTİR
00008     ** İzmir / TÜRKİYE
00009     **
00010     ** Copyright (C) 2015
00011     ****************************************************************************
00012     ****************************************************************************
00013     *************************************************************** K A M B O **
00014 */
00015 
00016 // FONKSIYON PROTOTİPLERİ
00017 void configure_eeprom_default_values(void);
00018 //******************************************************************************
00019 
00020 void init_node(void);
00021 //******************************************************************************
00022 
00023 float read_pressure_dp(void);
00024 //******************************************************************************
00025 
00026 float read_pressure(void);
00027 //******************************************************************************
00028 
00029 void prepare_data(void);
00030 //******************************************************************************
00031 
00032 void prepare_data_fread(void);
00033 //******************************************************************************
00034 
00035 void send_to_coordinator(char* char_array);
00036 //******************************************************************************
00037 
00038 void process_command(uint8_t cmmnd);
00039 //******************************************************************************
00040 
00041 void data_transmit_isr(void);
00042 //******************************************************************************
00043 
00044 void rf_rx_isr(void);
00045 //******************************************************************************
00046 
00047 void master_rx_isr(void);
00048 //******************************************************************************
00049 
00050 bool open_solenoid(uint8_t filter_no);
00051 //******************************************************************************
00052 
00053 bool close_solenoid(uint8_t filter_no);
00054 //******************************************************************************
00055 
00056 float map(float x, float in_min, float in_max, float out_min, float out_max);
00057 //******************************************************************************
00058 
00059 void watermeter_isr(void);
00060 //******************************************************************************
00061 
00062 void flowrate_isr(void);
00063 //******************************************************************************
00064 
00065 void flush_phase_isr(void);
00066 //******************************************************************************
00067 
00068 void pressure_check_isr(void);
00069 //******************************************************************************
00070 
00071 bool check_and_close_valves(void);
00072 //******************************************************************************
00073 
00074 void periodic_flush_isr(void);
00075 //******************************************************************************
00076 
00077 void min_flush_interval_isr(void);
00078 //******************************************************************************
00079 
00080 void rt_data_transmit_isr(void);
00081 //******************************************************************************
00082 
00083 void send_alarm(uint8_t _alarmID, uint16_t _filterID, uint8_t _slaveID);
00084 //******************************************************************************
00085 
00086 bool send_command(uint8_t _slaveid, uint8_t _command, uint8_t _filterid);
00087 //******************************************************************************
00088 
00089 // FONKSIYONLAR
00090 float map(float x, float in_min, float in_max, float out_min, float out_max)
00091 {
00092     return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
00093 }
00094 
00095 //
00096 bool check_and_close_valves()
00097 {
00098     bool check = false;
00099 
00100     for (uint8_t _slaveID = 0; _slaveID <= fnode.totalSlaveNumber - 1; _slaveID++) {
00101 
00102         for (uint8_t _filterNo = 0; _filterNo < 5; _filterNo ++) {
00103 
00104             if (send_command(_slaveID, CLOSE_SOLENOID, _filterNo)) {
00105 
00106                 check = true;
00107                 wait_ms(500);
00108 
00109             } else {
00110 
00111                 check = false;
00112 
00113             }
00114 
00115             if (check == false) {
00116                 break;
00117             }
00118         }
00119 
00120         if (check == false) {
00121             break;
00122         }
00123     }
00124 
00125     return check;
00126 }
00127 
00128 bool open_solenoid(uint8_t _filter_no)
00129 {
00130     bool _success = false;
00131 
00132     switch (_filter_no) {
00133 
00134         case FILTER_1_SOLENOID: {                                            // OUT1
00135 
00136             // İleri
00137             fnode.filterByte_2 &= ~(1 << 6);                       // Bit 6 = 0
00138             fnode.filterByte_1 = fnode.filterByte_1;
00139 
00140             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00141 
00142                 _success = true;
00143 
00144                 // H-köprüsünü aç ve uyandır
00145                 fnode.filterByte_2 &= ~(1 << 5);                       // Bit 5 = 0
00146                 fnode.filterByte_2 &= ~(1 << 4);                       // Bit 4 = 0
00147                 fnode.filterByte_1 = fnode.filterByte_1;
00148 
00149                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00150 
00151                     wait_ms(250);
00152 
00153                     _success = true;
00154 
00155                     // Uyut ve H-köprüsünü kapat
00156                     fnode.filterByte_2 |= 1 << 4;                          // Bit 4 = 1
00157                     fnode.filterByte_2 |= 1 << 5;                          // Bit 5 = 1
00158                     fnode.filterByte_1 = fnode.filterByte_1;
00159 
00160                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00161 
00162                         _success = true;
00163 
00164                     } else {
00165 
00166                         _success = false;
00167 
00168                     }
00169 
00170                 } else {
00171 
00172                     _success = false;
00173 
00174                 }
00175 
00176             } else {
00177 
00178                 _success = false;
00179 
00180             }
00181         }
00182         break;
00183 
00184         case FILTER_2_SOLENOID: {                                            // OUT2
00185 
00186             // İleri
00187             fnode.filterByte_2 &= ~(1 << 3);                       // Bit 3 = 0
00188             fnode.filterByte_1 = fnode.filterByte_1;
00189 
00190             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00191 
00192                 _success = true;
00193 
00194                 // H-köprüsünü aç ve uyandır
00195                 fnode.filterByte_2 &= ~(1 << 2);                       // Bit 2 = 0
00196                 fnode.filterByte_2 &= ~(1 << 1);                       // Bit 1 = 0
00197                 fnode.filterByte_1 = fnode.filterByte_1;
00198 
00199                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00200 
00201                     wait_ms(250);
00202 
00203                     _success = true;
00204 
00205                     // Uyut ve H-köprüsünü kapat
00206                     fnode.filterByte_2 |= 1 << 1;                          // Bit 1 is 1
00207                     fnode.filterByte_2 |= 1 << 2;                          // Bit 2 is 1
00208                     fnode.filterByte_1 = fnode.filterByte_1;
00209 
00210                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00211 
00212                         _success = true;
00213 
00214                     } else {
00215 
00216                         _success = false;
00217 
00218                     }
00219 
00220 
00221                 } else {
00222 
00223                     _success = false;
00224 
00225                 }
00226 
00227             } else {
00228 
00229                 _success = false;
00230 
00231             }
00232         }
00233         break;
00234 
00235         case FILTER_3_SOLENOID: {                                            // OUT3
00236 
00237             // İleri
00238             fnode.filterByte_2 &= ~(1 << 0);                       // Bit 0 = 0
00239             fnode.filterByte_1 = fnode.filterByte_1;
00240 
00241             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00242 
00243                 _success = true;
00244 
00245                 // H-köprüsünü aç ve uyandır
00246                 fnode.filterByte_1 &= ~(1 << 7);                       // Bit 7 = 0
00247                 fnode.filterByte_1 &= ~(1 << 6);                       // Bit 6 = 0
00248                 fnode.filterByte_2 = fnode.filterByte_2;
00249 
00250                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00251 
00252                     wait_ms(250);
00253 
00254                     _success = true;
00255 
00256                     // Uyut ve H-köprüsünü kapat
00257                     fnode.filterByte_1 |= 1 << 6;                          // Bit 6 = 1
00258                     fnode.filterByte_1 |= 1 << 7;                          // Bit 7 = 1
00259                     fnode.filterByte_2 = fnode.filterByte_2;
00260 
00261                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00262 
00263                         _success = true;
00264 
00265                     } else {
00266 
00267                         _success = false;
00268 
00269                     }
00270 
00271                 } else {
00272 
00273                     _success = false;
00274 
00275                 }
00276 
00277             } else {
00278 
00279                 _success = false;
00280 
00281             }
00282         }
00283         break;
00284 
00285         case FILTER_4_SOLENOID: {                                            // OUT4
00286 
00287             // İleri
00288             fnode.filterByte_1 &= ~(1 << 5);                       // Bit 5 = 0
00289             fnode.filterByte_2 = fnode.filterByte_2;
00290 
00291             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00292 
00293                 _success = true;
00294 
00295                 // H-köprüsünü aç ve uyandır
00296                 fnode.filterByte_1 &= ~(1 << 4);                       // Bit 4 = 0
00297                 fnode.filterByte_1 &= ~(1 << 3);                       // Bit 3 = 0
00298                 fnode.filterByte_2 = fnode.filterByte_2;
00299 
00300                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00301 
00302                     wait_ms(250);
00303 
00304                     _success = true;
00305 
00306                     // Uyut ve H-köprüsünü kapat
00307                     fnode.filterByte_1 |= 1 << 3;                          // Bit 3 = 1
00308                     fnode.filterByte_1 |= 1 << 4;                          // Bit 4 = 0
00309                     fnode.filterByte_2 = fnode.filterByte_2;
00310 
00311                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00312 
00313                         _success = true;
00314 
00315                     } else {
00316 
00317                         _success = false;
00318 
00319                     }
00320 
00321                 } else {
00322 
00323                     _success = false;
00324 
00325                 }
00326 
00327             } else {
00328 
00329                 _success = false;
00330 
00331             }
00332         }
00333         break;
00334 
00335         case FILTER_MAIN_SOLENOID: {                                         // OUT5
00336 
00337             // İleri
00338             fnode.filterByte_1 &= ~(1 << 2);                       // Bit 2 = 0
00339             fnode.filterByte_2 = fnode.filterByte_2;
00340 
00341             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00342 
00343                 _success = true;
00344 
00345                 // H-köprüsünü aç ve uyandır
00346                 fnode.filterByte_1 &= ~(1 << 1);                       // Bit 1 = 0
00347                 fnode.filterByte_1 &= ~(1 << 0);                       // Bit 0 = 0
00348                 fnode.filterByte_2 = fnode.filterByte_2;
00349 
00350                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00351 
00352                     wait_ms(250);
00353 
00354                     _success = true;
00355 
00356                     // Uyut ve H-köprüsünü kapat
00357                     fnode.filterByte_1 |= 1 << 0;                          // Bit 0 = 1
00358                     fnode.filterByte_1 |= 1 << 1;                          // Bit 1 = 0
00359                     fnode.filterByte_2 = fnode.filterByte_2;
00360 
00361                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00362 
00363                         _success = true;
00364 
00365                     } else {
00366 
00367                         _success = false;
00368 
00369                     }
00370 
00371                 } else {
00372 
00373                     _success = false;
00374 
00375                 }
00376 
00377             } else {
00378 
00379                 _success = false;
00380 
00381             }
00382         }
00383         break;
00384     }
00385 
00386     return _success;
00387 }
00388 
00389 //
00390 bool close_solenoid(uint8_t _filter_no)
00391 {
00392     bool _success = false;
00393 
00394     switch (_filter_no) {
00395 
00396         case FILTER_1_SOLENOID: {                                            // OUT1
00397 
00398             // Geri
00399             fnode.filterByte_2 |= 1 << 6;                          // Bit 6 = 1
00400             fnode.filterByte_1 = fnode.filterByte_1;
00401 
00402             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00403 
00404                 _success = true;
00405 
00406                 // H-köprüsünü aç ve uyandır
00407                 fnode.filterByte_2 &= ~(1 << 5);                       // Bit 5 = 0
00408                 fnode.filterByte_2 &= ~(1 << 4);                       // Bit 4 = 0
00409                 fnode.filterByte_1 = fnode.filterByte_1;
00410 
00411                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00412 
00413                     wait_ms(250);
00414 
00415                     _success = true;
00416 
00417                     // Uyut ve H-köprüsünü kapat
00418                     fnode.filterByte_2 |= 1 << 4;                          // Bit 4 = 1
00419                     fnode.filterByte_2 |= 1 << 5;                          // Bit 5 = 1
00420                     fnode.filterByte_1 = fnode.filterByte_1;
00421 
00422                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00423 
00424                         _success = true;
00425 
00426                     } else {
00427 
00428                         _success = false;
00429 
00430                     }
00431 
00432                 } else {
00433 
00434                     _success = false;
00435 
00436                 }
00437 
00438 
00439             } else {
00440 
00441                 _success = false;
00442 
00443             }
00444         }
00445         break;
00446 
00447         case FILTER_2_SOLENOID: {                                            // OUT2
00448 
00449             // Geri
00450             fnode.filterByte_2 |= 1 << 3;                          // Bit 3 = 1
00451             fnode.filterByte_1 = fnode.filterByte_1;
00452 
00453             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00454 
00455                 _success = true;
00456 
00457                 // H-köprüsünü aç ve uyandır
00458                 fnode.filterByte_2 &= ~(1 << 2);                       // Bit 2 = 0
00459                 fnode.filterByte_2 &= ~(1 << 1);                       // Bit 1 = 0
00460                 fnode.filterByte_1 = fnode.filterByte_1;
00461 
00462                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00463 
00464                     wait_ms(250);
00465 
00466                     _success = true;
00467 
00468                     // Uyut ve H-köprüsünü kapat
00469                     fnode.filterByte_2 |= 1 << 1;                          // Bit 1 = 1
00470                     fnode.filterByte_2 |= 1 << 2;                          // Bit 2 = 1
00471                     fnode.filterByte_1 = fnode.filterByte_1;
00472 
00473                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00474 
00475                         _success = true;
00476 
00477                     } else {
00478 
00479                         _success = false;
00480 
00481                     }
00482 
00483                 } else {
00484 
00485                     _success = false;
00486 
00487                 }
00488 
00489             } else {
00490 
00491                 _success = false;
00492 
00493             }
00494         }
00495         break;
00496 
00497         case FILTER_3_SOLENOID: {                                            // OUT3
00498 
00499             // Geri
00500             fnode.filterByte_2 |= 1 << 0;                          // Bit 0 = 1
00501             fnode.filterByte_1 = fnode.filterByte_1;
00502 
00503             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00504 
00505                 _success = true;
00506 
00507                 // H-köprüsünü aç ve uyandır
00508                 fnode.filterByte_1 &= ~(1 << 7);                       // Bit 7 = 0
00509                 fnode.filterByte_1 &= ~(1 << 6);                       // Bit 6 = 0
00510                 fnode.filterByte_2 = fnode.filterByte_2;
00511 
00512                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00513 
00514                     wait_ms(250);
00515 
00516                     _success = true;
00517 
00518                     // Uyut ve H-köprüsünü kapat
00519                     fnode.filterByte_1 |= 1 << 6;                          // Bit 6 = 1
00520                     fnode.filterByte_1 |= 1 << 7;                          // Bit 7 = 1
00521                     fnode.filterByte_2 = fnode.filterByte_2;
00522 
00523                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00524 
00525                         _success = true;
00526 
00527                     } else {
00528 
00529                         _success = false;
00530 
00531                     }
00532 
00533                 } else {
00534 
00535                     _success = false;
00536 
00537                 }
00538 
00539             } else {
00540 
00541                 _success = false;
00542 
00543             }
00544         }
00545         break;
00546 
00547         case FILTER_4_SOLENOID: {                                            // OUT4
00548 
00549             // Geri
00550             fnode.filterByte_1 |= 1 << 5;                          // Bit 5 = 1
00551             fnode.filterByte_2 = fnode.filterByte_2;
00552 
00553             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00554 
00555                 _success = true;
00556 
00557                 // H-köprüsünü aç ve uyandır
00558                 fnode.filterByte_1 &= ~(1 << 4);                       // Bit 4 = 0
00559                 fnode.filterByte_1 &= ~(1 << 3);                       // Bit 3 = 0
00560                 fnode.filterByte_2 = fnode.filterByte_2;
00561 
00562                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00563 
00564                     wait_ms(250);
00565 
00566                     _success = true;
00567 
00568                     // Uyut ve H-köprüsünü kapat
00569                     fnode.filterByte_1 |= 1 << 3;                          // Bit 3 = 1
00570                     fnode.filterByte_1 |= 1 << 4;                          // Bit 4 = 0
00571                     fnode.filterByte_2 = fnode.filterByte_2;
00572 
00573                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00574 
00575                         _success = true;
00576 
00577                     } else {
00578 
00579                         _success = false;
00580 
00581                     }
00582 
00583                 } else {
00584 
00585                     _success = false;
00586 
00587                 }
00588 
00589             } else {
00590 
00591                 _success = false;
00592 
00593             }
00594         }
00595         break;
00596 
00597         case FILTER_MAIN_SOLENOID: {                                         // OUT5
00598 
00599             // Geri
00600             fnode.filterByte_1 |= 1 << 2;                          // Bit 2 = 1
00601             fnode.filterByte_2 = fnode.filterByte_2;
00602 
00603             if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00604 
00605                 _success = true;
00606 
00607                 // H-köprüsünü aç ve uyandır
00608                 fnode.filterByte_1 &= ~(1 << 1);                       // Bit 1 = 0
00609                 fnode.filterByte_1 &= ~(1 << 0);                       // Bit 0 = 0
00610                 fnode.filterByte_2 = fnode.filterByte_2;
00611 
00612                 if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00613 
00614                     wait_ms(250);
00615 
00616                     _success = true;
00617 
00618                     // Uyut ve H-köprüsünü kapat
00619                     fnode.filterByte_1 |= 1 << 0;                          // Bit 0 = 1
00620                     fnode.filterByte_1 |= 1 << 1;                          // Bit 1 = 0
00621                     fnode.filterByte_2 = fnode.filterByte_2;
00622 
00623                     if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
00624 
00625                         _success = true;
00626 
00627                     } else {
00628 
00629                         _success = false;
00630 
00631                     }
00632 
00633                 } else {
00634 
00635                     _success = false;
00636 
00637                 }
00638 
00639             } else {
00640 
00641                 _success = false;
00642 
00643             }
00644         }
00645         break;
00646     }
00647 
00648     return _success;
00649 }
00650 
00651 //
00652 void configure_eeprom_default_values()
00653 {
00654     if (eeprom_read(EEPROM_TYPE, DEFAULT_CONFIG_ADDR) != 35) {
00655 
00656         for (uint8_t i = 0; i < 99; i++) {
00657 
00658             eeprom_write(EEPROM_TYPE, i, 0xFF);
00659 
00660         }
00661 
00662         eeprom_write(EEPROM_TYPE, DEFAULT_CONFIG_ADDR, 35);
00663 
00664         eeprom_write(EEPROM_TYPE, SYSTEM_SETUP_ADDR, SYSTEM_SETUP_DEFAULT);
00665         eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, AUTOSEND_STATUS_DEFAULT);
00666         eeprom_write(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR, IRRI_TRANSMIT_INTERVAL_DEFAULT);
00667         eeprom_write(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR, DRY_TRANSMIT_INTERVAL_DEFAULT);
00668         eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1, WATERMETER_COEFF_DEFAULT >> 8);
00669         eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2, WATERMETER_COEFF_DEFAULT & 0xFF);
00670         eeprom_write(EEPROM_TYPE, PMAX_ADDR, PMAX_DEFAULT);
00671         eeprom_write(EEPROM_TYPE, PRESSURE_SENSOR_ADDR, PRESSURE_SENSOR_DEFAULT);
00672         eeprom_write(EEPROM_TYPE, DP_ADDR, DP_DEFAULT);
00673         eeprom_write(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR, PRESSURE_CONTROL_FREQUENCY_DEFAULT);
00674         eeprom_write(EEPROM_TYPE, FLUSH_DURATION_ADDR, FLUSH_DURATION_DEFAULT);
00675         eeprom_write(EEPROM_TYPE, FLUSH_INTERVAL_ADDR, FLUSH_INTERVAL_DEFAULT);
00676         eeprom_write(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR, FLOW_CONTROL_LATENCY_DEFAULT);
00677         eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, FLUSH_ENABLE_DEFAULT);
00678         eeprom_write(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR, PR_SENSOR_POSITION_DEFAULT);
00679         eeprom_write(EEPROM_TYPE, BACKFLUSH_STOP_ADDR, BACKFLUSH_STOP_DEFAULT);
00680         eeprom_write(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR, INLET_PRS_LOW_TRS_DEFAULT);
00681         eeprom_write(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR, INLET_PRS_HIGH_TRS_DEFAULT);
00682         eeprom_write(EEPROM_TYPE, ALARMS_ENABLE_ADDR, ALARMS_ENABLE_DEFAULT);
00683         eeprom_write(EEPROM_TYPE, DP_HIGH_TRS_ADDR, DP_HIGH_TRS_DEFAULT);
00684         eeprom_write(EEPROM_TYPE, INLET_PRS_SET_ADDR, INLET_PRS_SET_DEFAULT);
00685         eeprom_write(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR, OUTLET_PRS_SET_FOR_DP_DEFAULT);
00686         eeprom_write(EEPROM_TYPE, PERIODIC_FLUSH_ADDR, PERIODIC_FLUSH_DEFAULT);
00687         eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1, MIN_FLUSH_INTERVAL_DEFAULT >> 8);
00688         eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2, MIN_FLUSH_INTERVAL_DEFAULT & 0xFF);
00689         eeprom_write(EEPROM_TYPE, FILTER_NUMBER_ADDR, FILTER_NUMBER_DEFAULT);
00690     }
00691 }
00692 
00693 //
00694 void init_node()
00695 {
00696     // EEPROM'dan sistem ayarlarını oku
00697     fnode.systemSetup = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
00698 
00699     // Filtre sayısını hesapla
00700     fnode.filterNumber = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);
00701     fnode.lastFlushPhase = ((uint16_t)fnode.filterNumber * 4) + 1;
00702 
00703     // Sayaç mevcuts ISR'yi aktifle
00704     if ((fnode.systemSetup >> 3) & 1 == 1) {
00705 
00706         watermeterInterrupt.rise(&watermeter_isr);
00707 
00708     }
00709 
00710     // EEPROM'dan sulama sırasında veri gönderim sıklığını oku
00711     fnode.irriTransmitInterval = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
00712 
00713     // EEPROM'dan sulama dışında veri gönderim sıklığını oku
00714     fnode.dryTransmitInterval = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
00715 
00716     // EEPROM'dan otomatik veri gönderimini oku
00717     if (eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR) == 1) {
00718 
00719         fnode.autosend = true;
00720 
00721     } else {
00722 
00723         fnode.autosend = false;
00724 
00725     }
00726 
00727     if (eeprom_read(EEPROM_TYPE, IRRI_STATUS_ADDR) == 1) {
00728 
00729         fnode.irrigation = true;
00730 
00731         dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);
00732 
00733         timer.reset();
00734         timer.start();
00735 
00736     } else {
00737 
00738         fnode.irrigation = false;
00739 
00740         dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);
00741 
00742         timer.reset();
00743         timer.start();
00744 
00745     }
00746 
00747     // EEPROM'dan sayaç katsayısını oku
00748     fnode.watermeterCoefficient = (eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1) << 8) + eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
00749 
00750     // EEPROM'dan basınç sensörünün okuyabileceği maksimum basıncı oku
00751     fnode.pMax = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
00752 
00753     // EEPROM'dan basınç sensörü tipini oku (4-20 mA veya 0-3.3v)
00754     fnode.pressureSensorType = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
00755 
00756     // EEPROM'dan DP set değerini oku
00757     fnode.dpSet = eeprom_read(EEPROM_TYPE, DP_ADDR);
00758 
00759     // EEPROM'dan basınç kontrol sıklığını oku
00760     fnode.pressureControlFrequency = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
00761 
00762     // EEPROM'dan 1 filtre yıkama süresini oku
00763     fnode.flushDuration = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
00764 
00765     // EEPROM'dan 2 filtre yıkaması arasındaki bekleme süresini oku
00766     fnode.flushInterval = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
00767 
00768     // EEPROM'dan akış kontrolü gecikme süresini oku (Akış kontrolü filtre yıkaması başladıktan ya da bittikten kaç saniye sonra yapılacak?)
00769     fnode.flowControlLatency = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
00770 
00771     // EEPROM'dan ters yıkama kontrolü aktif ya da pasif durumunu oku
00772     if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 1) {
00773 
00774         fnode.flushEnabled = 1;
00775 
00776     } else {
00777 
00778         fnode.flushEnabled = 0;
00779 
00780     }
00781 
00782     // EEPROM'dan basınç sensörünün yerleştirme noktasını oku (Filtre öncesi ya da sonrası)
00783     fnode.pressureSensorPosition = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
00784 
00785     // EEPROM'dan hata durumunda ters yıkamanın durdurulup durdurulmayacağını oku
00786     if (eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR) == 0) {
00787 
00788         fnode.onErrorStop = 0;
00789 
00790     } else {
00791 
00792         fnode.onErrorStop = 1;
00793 
00794     }
00795 
00796     fnode.pressureLowThreshold = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
00797     fnode.pressureHighThreshold = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
00798 
00799     // Timer ve tickerları başlat
00800     // Basınç sürekli kontrol edilecek
00801     pressureCheckTicker.attach(&pressure_check_isr, fnode.pressureControlFrequency);
00802 
00803     // EEPROM'dan alarmların açık/kapalı durumunu oku
00804     if (eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR) == 0) {
00805 
00806         fnode.alarmsEnabled = 0;
00807 
00808     } else {
00809 
00810         fnode.alarmsEnabled = 1;
00811 
00812     }
00813 
00814     // EEPROM'dan DP alarmı eşik değerini oku
00815     // Yıkama sırasında DP bu değerin üstüne çıkarsa alarm gönderilir
00816     // Bazı durumlarda DP düşmeyebilir !!!
00817     fnode.dpThreshold = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
00818 
00819     // EEPROM'dan sulamanın başladığının anlaşılacağı giriş basıncı set değerini oku
00820     fnode.inletPressureSet = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
00821 
00822     // EEPROM'dan DP kontrolünün başlayacağı filtrasyon çıkış basıncı set değerini oku
00823     fnode.outletPressureSet = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
00824 
00825     // periodicFlushInterval değeri 0 ise periyodik yıkama yapılmaz
00826     fnode.periodicFlushInterval = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
00827 
00828     if (fnode.periodicFlushInterval == 0) {
00829 
00830         fnode.periodicFlushEnabled = false;
00831         periodicFlushTicker.detach();
00832         fnode.periodicFlushCounter = 0;
00833 
00834     } else {
00835 
00836         fnode.periodicFlushEnabled = true;
00837         fnode.periodicFlushCounter = 0;
00838 
00839         // Periodic flush isr works every 1 second to increase periodicCounter by 1
00840         // If periodicCounter value >= peridicFlushInterval * 3600
00841         // Example:
00842         // Periodic flush interval is 6 hours
00843         // Periodic counter counts every 1 seconds by ISR
00844         // In 1 hour there is 3600 seconds..... In 6 hours 6 * 3600 = 21600 seconds
00845 
00846         if (fnode.irrigation == true) {
00847 
00848             periodicFlushTicker.attach(&periodic_flush_isr, 1);                               // ISR set every 1 second
00849 
00850         } else {
00851 
00852             periodicFlushTicker.detach();
00853 
00854         }
00855     }
00856 
00857     // minFlushInterval değeri 0'dan farklı ise DP yıkamaları min süre beklenerek yapılır
00858     c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
00859     c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
00860     fnode.minFlushInterval = (c23_a << 8) + c23_b;
00861 
00862     if (fnode.minFlushInterval == 0) {
00863 
00864         fnode.minFlushEnabled = false;
00865 
00866     } else {
00867 
00868         fnode.minFlushEnabled = true;
00869     }
00870 
00871     if (fnode.filterNumber % 4 == 0) {
00872 
00873         fnode.totalSlaveNumber = fnode.filterNumber / 4;
00874 
00875     } else {
00876 
00877         fnode.totalSlaveNumber = (fnode.filterNumber / 4) + 1;
00878     }
00879 }
00880 
00881 //
00882 float read_pressure_dp()
00883 {
00884     // Analog kanal okumasının RMS (Root Mean Square) hesaplaması
00885     memset(rmsStore, 0, sizeof(rmsStore));
00886     totalSampling = 0.0;
00887     tempValue = 0.0;
00888     tdp = 0.0;
00889 
00890     for (uint8_t b = 0; b < RMS_SAMPLING_NUMBER; b++) {
00891 
00892         tempValue = dpSensor.read();
00893         rmsStore[b] = tempValue * tempValue;
00894         totalSampling = totalSampling + rmsStore[b];
00895 
00896     }
00897 
00898     tdp = (sqrt ((float)((totalSampling / RMS_SAMPLING_NUMBER)))) * 4096.0f;
00899     //
00900 
00901     // Fark basınç hesaplaması, BAR, -4 ile +4 bar arası
00902     // DP + 4 = ((Sensor okuması - 409.6) / 409.6) ==> Honeywell sensor katalog sadeleştirilmiş denklem
00903     tdpResult = ((tdp-409.6f)/409.6f) - 4.0f;
00904 
00905     if (tdpResult < 0) {
00906 
00907         tdpResult = 0;
00908 
00909     }
00910 
00911     tdpResult = floor(tdpResult * 10) / 10;
00912 
00913     return tdpResult;
00914 }
00915 
00916 //
00917 float read_pressure()
00918 {
00919     // Analog kanal okumasının RMS (Root Mean Square) hesaplaması
00920     memset(rmsStore, 0, sizeof(rmsStore));
00921     totalSampling = 0;
00922     tempValue = 0;
00923     tp = 0;
00924 
00925     for (uint8_t b = 0; b < RMS_SAMPLING_NUMBER; b++) {
00926 
00927         tempValue = pressureSensor.read();
00928         rmsStore[b] = tempValue * tempValue;
00929         totalSampling = totalSampling + rmsStore[b];
00930 
00931     }
00932 
00933     tp = (sqrt ((float)((totalSampling / RMS_SAMPLING_NUMBER)))) * 4096.0f;
00934     //
00935 
00936     if (fnode.pressureSensorType == 0) {
00937 
00938         // Ham analog verisinden basınç hesaplaması, BAR
00939         // Honeywell Truw Stability sensörlerine özel, PSI, 3.3v, map'lenmemiş
00940         tp = ((tp - 409.6f) / (3276.8f / (float)fnode.pMax)) * 0.0689476f; // 0.0689 is for psi to bar conversion;
00941 
00942     } else {
00943 
00944         // Ham analog verisinden basınç hesaplaması, BAR
00945         // 4-20 mA sensöre özel, BAR
00946         // 4 mA = 480 mV = 595.8 RAW
00947         // 20 mA = 2400 mV = 2978.9 RAW
00948         tp = map (tp, 595.8f, 2978.9f, 0.0f, (float)fnode.pMax);
00949 
00950     }
00951 
00952     if (tp < 0) {
00953 
00954         tp = 0;
00955 
00956     }
00957 
00958     tp = floor(tp * 10) / 10;
00959 
00960     return tp;
00961 }
00962 
00963 void prepare_data_fread()
00964 {
00965     memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
00966     memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
00967 
00968     // Filtrasyon JSON headırını yaz
00969     sprintf(fnode.temporaryBuffer, "%s", json[0]);
00970     strcat(fnode.dataBuffer, fnode.temporaryBuffer);
00971     memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
00972 
00973     // Eğer basınç sensörü varsa
00974     if (fnode.systemSetup & (1 << 1)) {
00975 
00976         // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
00977         if (fnode.systemSetup & (1 << 1)) {
00978 
00979             sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
00980             strcat(fnode.dataBuffer, fnode.temporaryBuffer);
00981             memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
00982 
00983             // 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
00984         } else {
00985 
00986             // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
00987             if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {
00988 
00989                 sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
00990                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
00991                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
00992 
00993                 // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
00994             } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {
00995 
00996                 sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
00997                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
00998                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
00999 
01000             }
01001         }
01002 
01003         // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
01004     } else {
01005 
01006         sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
01007         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01008         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01009     }
01010 
01011     // Eğer DP sensörü varsa DP verisini ekle
01012     if (fnode.systemSetup & (1 << 1)) {
01013 
01014         sprintf(fnode.temporaryBuffer, "%s%.1f%c", jsonHeader[2], fnode.dpPressure, ',');
01015         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01016         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01017 
01018         // DP sensörü yoksa DP verisi NULL olsun
01019     } else {
01020 
01021         sprintf(fnode.temporaryBuffer, "%s%s%c", jsonHeader[2], "null", ',');
01022         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01023         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01024 
01025     }
01026 
01027     // Eğer sayaç mevcutsa su hacmi ve debi verilerini ekle
01028     // İki veri gönderimi arasındaki su hacmi ve debi verisini burada hesapla
01029     if (fnode.systemSetup & (1 << 3)) {
01030 
01031         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);
01032         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01033         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01034 
01035 
01036     } else {
01037 
01038         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");
01039         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01040         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01041 
01042     }
01043 
01044     // Sulama durumu
01045     if (fnode.irrigation == true) {
01046 
01047         sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
01048         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01049         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01050 
01051     } else {
01052 
01053         sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
01054         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01055         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01056 
01057     }
01058 
01059     // Yıkama durumu
01060     if (fnode.flushing == true) {
01061 
01062         sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
01063         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01064         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01065 
01066     } else {
01067 
01068         sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
01069         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01070         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01071 
01072     }
01073 
01074     sprintf(fnode.temporaryBuffer, "%s", "},RT:1}");
01075 
01076     strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01077     memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01078 }
01079 
01080 
01081 //
01082 void prepare_data()
01083 {
01084     memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01085     memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01086 
01087     // Filtrasyon JSON headırını yaz
01088     sprintf(fnode.temporaryBuffer, "%s", json[0]);
01089     strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01090     memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01091 
01092     // Eğer basınç sensörü varsa
01093     if (fnode.systemSetup & (1 << 1)) {
01094 
01095         // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
01096         if (fnode.systemSetup & (1 << 0)) {
01097 
01098             sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
01099             strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01100             memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01101 
01102             // 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
01103         } else {
01104 
01105             // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
01106             if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {
01107 
01108                 sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
01109                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01110                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01111 
01112                 // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
01113             } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {
01114 
01115                 sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
01116                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01117                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01118 
01119             }
01120         }
01121 
01122         // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
01123     } else {
01124 
01125         sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
01126         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01127         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01128     }
01129 
01130     // Eğer DP sensörü varsa DP verisini ekle
01131     if (fnode.systemSetup & (1 << 0)) {
01132 
01133         sprintf(fnode.temporaryBuffer, "%s%.1f%c", jsonHeader[2], fnode.dpPressure, ',');
01134         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01135         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01136 
01137         // DP sensörü yoksa DP verisi NULL olsun
01138     } else {
01139 
01140         sprintf(fnode.temporaryBuffer, "%s%s%c", jsonHeader[2], "null", ',');
01141         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01142         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01143 
01144     }
01145 
01146     // Eğer sayaç mevcutsa su hacmi ve debi verilerini ekle
01147     // İki veri gönderimi arasındaki su hacmi ve debi verisini burada hesapla
01148     if (fnode.systemSetup & (1 << 3)) {
01149 
01150         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);
01151         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01152         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01153 
01154 
01155     } else {
01156 
01157         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");
01158         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01159         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01160 
01161     }
01162 
01163     // Sulama durumu
01164     if (fnode.irrigation == true) {
01165 
01166         sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
01167         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01168         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01169 
01170     } else {
01171 
01172         sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
01173         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01174         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01175 
01176     }
01177 
01178     // Yıkama durumu
01179     if (fnode.flushing == true) {
01180 
01181         sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
01182         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01183         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01184 
01185     } else {
01186 
01187         sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
01188         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01189         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01190 
01191     }
01192 
01193     sprintf(fnode.temporaryBuffer, "%s", "}}");
01194 
01195     strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01196     memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01197 }
01198 
01199 //
01200 void send_to_coordinator(char* char_array)
01201 {
01202     rf.putc(COORD_ADDR_1);
01203     rf.putc(COORD_ADDR_2);
01204     rf.putc(EQUAL);
01205     rf.puts(char_array);
01206     rf.putc(CR);
01207     wait_ms(50);
01208 }
01209 
01210 //
01211 void process_command(uint8_t cmnd)
01212 {
01213     switch(cmnd) {
01214 
01215         case FENABLE: {
01216 
01217             // Eğer ters yıkama zaten akitflenmişse hata mesajı gönder
01218             if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 1) {
01219 
01220                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FENABLEERR\"}");
01221                 send_to_coordinator(fnode.dataBuffer);
01222                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01223 
01224                 // Ters yıkamayı devre dışı bırak
01225             } else {
01226 
01227                 // Yıkamanın devreye alındığını EEPROM'a yaz
01228                 eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, 1);
01229 
01230                 fnode.flushEnabled = 1;
01231 
01232                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FENABLEOK\"}");
01233                 send_to_coordinator(fnode.dataBuffer);
01234                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01235 
01236             }
01237         }
01238         break;
01239 
01240         case FDISABLE: {
01241 
01242             // Eğer ters yıkama zaten akitflenmişse hata mesajı gönder
01243             if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 0) {
01244 
01245                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FDISABLEERR\"}");
01246                 send_to_coordinator(fnode.dataBuffer);
01247                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01248 
01249                 // Ters yıkamayı devre dışı bırak
01250             } else {
01251 
01252                 // Yıkamanın devre dışı kaldığını EEPROM'a yaz
01253                 eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, 0);
01254 
01255                 fnode.flushEnabled = 0;
01256 
01257                 /*
01258                 // Yıkama zamanlayıcısını kapat
01259                 flushTimer.detach();
01260 
01261                 // Yıkama fazını sıfırla
01262                 fnode.flushPhase = 0;
01263 
01264                 // Solenoid vanaları kontrol et ve kapat
01265                 check_and_close_valves();
01266                 */
01267 
01268                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FDISABLEOK\"}");
01269                 send_to_coordinator(fnode.dataBuffer);
01270                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01271 
01272             }
01273         }
01274         break;
01275 
01276         case FSETSYS: {
01277 
01278             // Sistem ayarları
01279             eeprom_write(EEPROM_TYPE, SYSTEM_SETUP_ADDR, fnode.systemSetup);
01280 
01281             // Otomatik veri aktarımı
01282             eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, fnode.autosendStatus);
01283 
01284             // Yeni set edilecek veri aktarım aralıkları eskisinden farklıysa zamanlayıcıları yeni ayarla başlat
01285             // Eski ile yeni aktarım aralıkları aynı ise değişiklik yapma (Alt satırlarda)
01286             irriTrsIntOld = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
01287             eeprom_write(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR, fnode.irriTransmitInterval);
01288 
01289             dryTrsIntOld = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
01290             eeprom_write(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR, fnode.dryTransmitInterval);
01291 
01292             // Sayaç katsayısı
01293             eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1, fnode.watermeterCoefficient >> 8);
01294             eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2, fnode.watermeterCoefficient & 0xFF);
01295 
01296             // Basınç sensörü maksimum basıncı
01297             eeprom_write(EEPROM_TYPE, PMAX_ADDR, fnode.pMax);
01298 
01299             // Basınç sensörü tipi
01300             eeprom_write(EEPROM_TYPE, PRESSURE_SENSOR_ADDR, fnode.pressureSensorType);
01301 
01302             // DP set
01303             eeprom_write(EEPROM_TYPE, DP_ADDR, fnode.dpSet);
01304 
01305             // Basınç kontrol sıklığı
01306             eeprom_write(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR, fnode.pressureControlFrequency);
01307 
01308             // 1 filtre yıkama süresi
01309             eeprom_write(EEPROM_TYPE, FLUSH_DURATION_ADDR, fnode.flushDuration);
01310 
01311             // Yıkama aralığı
01312             eeprom_write(EEPROM_TYPE, FLUSH_INTERVAL_ADDR, fnode.flushInterval);
01313 
01314             // Akış kontrol gecikmesi
01315             eeprom_write(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR, fnode.flowControlLatency);
01316 
01317             // Ters yıkama devrede/devrede değil
01318             eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, fnode.flushEnabled);
01319 
01320             // Basınç sensörü pozisyonu
01321             eeprom_write(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR, fnode.pressureSensorPosition);
01322 
01323             // Hata durumunda ters yıkamayı durdur/durdurma
01324             eeprom_write(EEPROM_TYPE, BACKFLUSH_STOP_ADDR, fnode.onErrorStop);
01325 
01326             // Giriş basıncı alarm alt sınır eşik
01327             eeprom_write(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR, fnode.pressureLowThreshold);
01328 
01329             // Giriş basıncı alarm üst sınır eşik
01330             eeprom_write(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR, fnode.pressureHighThreshold);
01331 
01332             // Alarmlar devrede
01333             eeprom_write(EEPROM_TYPE, ALARMS_ENABLE_ADDR, fnode.alarmsEnabled);
01334 
01335             // DP alarm eşik değeri
01336             eeprom_write(EEPROM_TYPE, DP_HIGH_TRS_ADDR, fnode.dpThreshold);
01337 
01338             eeprom_write(EEPROM_TYPE, INLET_PRS_SET_ADDR, fnode.inletPressureSet);
01339 
01340             eeprom_write(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR, fnode.outletPressureSet);
01341 
01342             eeprom_write(EEPROM_TYPE, PERIODIC_FLUSH_ADDR, fnode.periodicFlushInterval);
01343 
01344             eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1, fnode.minFlushInterval >> 8);
01345             eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2, fnode.minFlushInterval & 0xFF);
01346 
01347             eeprom_write(EEPROM_TYPE, FILTER_NUMBER_ADDR, fnode.filterNumber);
01348 
01349 
01350             // Check written SSETSYS values on EEPROM
01351             c1 = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
01352             c2 = eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR);
01353             c3 = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
01354             c4 = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
01355             c5_a = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1);
01356             c5_b = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
01357             c5 = (c5_a << 8) + c5_b;
01358             c6 = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
01359             c7 = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
01360             c8 = eeprom_read(EEPROM_TYPE, DP_ADDR);
01361             c9 = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
01362             c10 = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
01363             c11 = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
01364             c12 = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
01365             c13 = eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR);
01366             c14 = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
01367             c15 = eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR);
01368             c16 = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
01369             c17 = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
01370             c18 = eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR);
01371             c19 = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
01372             c20 = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
01373             c21 = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
01374             c22 = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
01375             c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
01376             c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
01377             c23 = (c23_a << 8) + c23_b;
01378             c24 = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);
01379 
01380             // Kaydedilen değerler ile gönderilen değerleri karşılaştır
01381             // Aynı ise sunucuya mesaj gönder
01382             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) {
01383 
01384                 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, '}');
01385                 send_to_coordinator(fnode.dataBuffer);
01386                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01387 
01388                 // YENİ SET Değerlerine göre ayarlar
01389                 // Filtre sayısı
01390                 fnode.filterNumber = c24;
01391                 fnode.lastFlushPhase = ((uint16_t)fnode.filterNumber * 4) + 1;
01392 
01393                 // Sayaç mevcutsa ISR'yi aktifle
01394                 if (fnode.systemSetup & (1 << 3)) {
01395 
01396                     watermeterInterrupt.rise(NULL);
01397                     watermeterInterrupt.rise(&watermeter_isr);
01398 
01399                 } else {
01400 
01401                     watermeterInterrupt.rise(NULL);
01402                 }
01403 
01404                 if (fnode.autosendStatus == 0) {
01405 
01406                     fnode.autosend = false;
01407 
01408                 } else {
01409 
01410                     fnode.autosend = true;
01411                 }
01412 
01413                 // If irrigation phase and autosend is active and new data transmission interval is different than old one attach data transmission ISR again
01414                 if (fnode.irrigation == true && fnode.autosend == true && irriTrsIntOld != fnode.irriTransmitInterval) {
01415 
01416                     dataTransmitTicker.detach();
01417                     dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);
01418 
01419                     // If not irrigation phase and autosend is active and new data transmission interval is different than old one attach data transmission ISR again
01420                 } else if (fnode.irrigation == false && fnode.autosend == true && dryTrsIntOld != fnode.dryTransmitInterval) {
01421 
01422                     dataTransmitTicker.detach();
01423                     dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);
01424 
01425                     // If autosend is not active detach data transmission ISR
01426                 } else if (fnode.autosend == false) {
01427 
01428                     dataTransmitTicker.detach();
01429 
01430                 }
01431 
01432                 // periodicFlushInterval değeri 0 ise periyodik yıkama yapılmaz
01433                 if (fnode.periodicFlushInterval == 0) {
01434 
01435                     fnode.periodicFlushEnabled = false;
01436                     periodicFlushTicker.detach();
01437                     fnode.periodicFlushCounter = 0;
01438 
01439                 } else {
01440 
01441                     fnode.periodicFlushEnabled = true;
01442                     fnode.periodicFlushCounter = 0;
01443 
01444                     // Periodic flush isr works every 1 second to increase periodicCounter by 1
01445                     // If periodicCounter value >= peridicFlushInterval * 3600
01446                     // Example:
01447                     // Periodic flush interval is 6 hours
01448                     // Periodic counter counts every 1 seconds by ISR
01449                     // In 1 hour there is 3600 seconds..... In 6 hours 6 * 3600 = 21600 seconds
01450 
01451                     if (fnode.irrigation == true) {
01452 
01453                         periodicFlushTicker.attach(&periodic_flush_isr, 1);                               // ISR set every 1 second
01454 
01455                     } else {
01456 
01457                         periodicFlushTicker.detach();
01458 
01459                     }
01460                 }
01461 
01462                 // minFlushInterval değeri 0'dan farklı ise DP yıkamaları min süre beklenerek yapılır
01463                 if (fnode.minFlushInterval == 0) {
01464 
01465                     fnode.minFlushEnabled = false;
01466 
01467                 } else {
01468 
01469                     fnode.minFlushEnabled = true;
01470                 }
01471 
01472             } else {
01473 
01474                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSETSYSERR\"}");
01475                 send_to_coordinator(fnode.dataBuffer);
01476                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01477 
01478             }
01479         }
01480         break;
01481 
01482         case FGETCFG: {
01483 
01484             // Get configuration from EEPROM
01485             c1 = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
01486             c2 = eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR);
01487             c3 = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
01488             c4 = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
01489             c5_a = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1);
01490             c5_b = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
01491             c5 = (c5_a << 8) + c5_b;
01492             c6 = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
01493             c7 = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
01494             c8 = eeprom_read(EEPROM_TYPE, DP_ADDR);
01495             c9 = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
01496             c10 = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
01497             c11 = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
01498             c12 = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
01499             c13 = eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR);
01500             c14 = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
01501             c15 = eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR);
01502             c16 = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
01503             c17 = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
01504             c18 = eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR);
01505             c19 = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
01506             c20 = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
01507             c21 = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
01508             c22 = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
01509             c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
01510             c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
01511             c23 = (c23_a << 8) + c23_b;
01512             c24 = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);
01513 
01514             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, '}');
01515             send_to_coordinator(fnode.dataBuffer);
01516             memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01517 
01518         }
01519         break;
01520 
01521         case FSTART: {
01522 
01523             if (fnode.autosend == false) {
01524 
01525                 fnode.autosend = true;
01526 
01527                 if (fnode.irrigation) {
01528 
01529                     dataTransmitTicker.detach();
01530                     dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);
01531 
01532                 } else {
01533 
01534                     dataTransmitTicker.detach();
01535                     dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);
01536 
01537                 }
01538 
01539                 // Save autosend enable status to EEPROM
01540                 eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 1);
01541 
01542                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTARTOK\"}");
01543                 send_to_coordinator(fnode.dataBuffer);
01544                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01545 
01546             } else {
01547 
01548                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTARTERR\"}");
01549                 send_to_coordinator(fnode.dataBuffer);
01550                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01551 
01552             }
01553 
01554         }
01555         break;
01556 
01557 
01558         case FSTOP: {
01559 
01560             if (fnode.autosend == true) {
01561 
01562                 fnode.autosend = false;
01563 
01564                 dataTransmitTicker.detach();
01565 
01566                 // Save autosend disable status to EEPROM
01567                 eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 0);
01568 
01569                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTOPOK\"}");
01570                 send_to_coordinator(fnode.dataBuffer);
01571                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01572 
01573             } else {
01574 
01575                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTOPERR\"}");
01576                 send_to_coordinator(fnode.dataBuffer);
01577                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01578 
01579             }
01580         }
01581         break;
01582 
01583         case FFIX: {
01584 
01585             if (fnode.errorOccured == true) {
01586 
01587                 fnode.errorOccured = false;
01588 
01589                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FFIXOK\"}");
01590                 send_to_coordinator(fnode.dataBuffer);
01591                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01592 
01593             } else {
01594 
01595                 sprintf(fnode.dataBuffer, "%s", "{CMD:\"FFIXERR\"}");
01596                 send_to_coordinator(fnode.dataBuffer);
01597                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01598 
01599             }
01600         }
01601         break;
01602 
01603         case FGETSTATUS: {
01604 
01605             //STAT:"IRR"
01606             if (fnode.irrigation == true) {
01607 
01608                 sprintf(fnode.dataBuffer, "%s", "{STAT:\"IRR\"}");
01609                 send_to_coordinator(fnode.dataBuffer);
01610                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01611 
01612                 //STAT:"DRY"
01613             } else {
01614 
01615                 sprintf(fnode.dataBuffer, "%s", "{STAT:\"DRY\"}");
01616                 send_to_coordinator(fnode.dataBuffer);
01617                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01618 
01619             }
01620 
01621         }
01622         break;
01623 
01624         case FGETFSTATUS: {
01625 
01626             // Flushing Now
01627             if(fnode.flushing) {
01628                 sprintf(fnode.dataBuffer, "%s", "{STAT:\"FLUSHING\"}");
01629                 send_to_coordinator(fnode.dataBuffer);
01630                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01631 
01632             } else {
01633 
01634                 sprintf(fnode.dataBuffer, "%s", "{STAT:\"NOTFLUSHING\"}");
01635                 send_to_coordinator(fnode.dataBuffer);
01636                 memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01637 
01638             }
01639         }
01640         break;
01641 
01642         case FFGETSTAT: {
01643 
01644             memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01645             memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01646 
01647             // Filtrasyon JSON headırını yaz
01648             //sprintf(fnode.temporaryBuffer, "%s", json[0]);
01649             sprintf(fnode.temporaryBuffer, "%s", "{STAT:{");
01650             strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01651             memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01652             
01653             fnode.pressure = read_pressure();
01654             fnode.dpPressure = read_pressure_dp();
01655 
01656             // 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
01657             // Giriş basıncı = Okunan basınç
01658             // Çıkış basıncı = Okunan basınç - Fark basınç
01659             if (fnode.pressureSensorPosition == 0) {
01660 
01661                 fnode.inletPressure = fnode.pressure;
01662                 fnode.outletPressure = fnode.pressure - fnode.dpPressure;
01663 
01664                 if (fnode.outletPressure < 0) {
01665 
01666                     fnode.outletPressure = 0;
01667 
01668                 }
01669 
01670                 // 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
01671                 // Giriş basıncı = Okunan basınç + Fark basınç
01672                 // Çıkış basıncı = Okunan basınç
01673             } else {
01674 
01675                 fnode.inletPressure = fnode.pressure + fnode.dpPressure;
01676                 fnode.outletPressure = fnode.pressure;
01677 
01678             }
01679 
01680             // Eğer basınç sensörü varsa
01681             if (fnode.systemSetup & (1 << 1)) {
01682 
01683                 // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
01684                 if (fnode.systemSetup & (1 << 1)) {
01685 
01686                     sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
01687                     strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01688                     memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01689 
01690                     // 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
01691                 } else {
01692 
01693                     // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
01694                     if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {
01695 
01696                         sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
01697                         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01698                         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01699 
01700                         // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
01701                     } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {
01702 
01703                         sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
01704                         strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01705                         memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01706 
01707                     }
01708                 }
01709 
01710                 // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
01711             } else {
01712 
01713                 sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
01714                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01715                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01716             }
01717 
01718             // Eğer DP sensörü varsa DP verisini ekle
01719             if (fnode.systemSetup & (1 << 1)) {
01720 
01721                 sprintf(fnode.temporaryBuffer, "%s%.1f", jsonHeader[2], fnode.dpPressure);
01722                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01723                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01724 
01725                 // DP sensörü yoksa DP verisi NULL olsun
01726             } else {
01727 
01728                 sprintf(fnode.temporaryBuffer, "%s%s", jsonHeader[2], "null");
01729                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01730                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01731 
01732             }
01733 
01734 
01735             // Sulama durumu
01736             if (fnode.irrigation == true) {
01737 
01738                 sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
01739                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01740                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01741 
01742             } else {
01743 
01744                 sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
01745                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01746                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01747 
01748             }
01749 
01750             // Yıkama durumu
01751             if (fnode.flushing == true) {
01752 
01753                 sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
01754                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01755                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01756 
01757             } else {
01758 
01759                 sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
01760                 strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01761                 memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01762 
01763             }
01764 
01765             sprintf(fnode.temporaryBuffer, "%s", "},RT:1}");
01766 
01767             strcat(fnode.dataBuffer, fnode.temporaryBuffer);
01768             memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
01769             
01770             send_to_coordinator(fnode.dataBuffer);
01771             memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
01772 
01773         }
01774         break;
01775 
01776         // Elle yıkamayı başlat
01777         case FLUSHNOW: {
01778 
01779             // Eğer zaten yıkama varsa
01780             if(fnode.flushing == true) {
01781 
01782                 send_alarm(ALREADY_FLUSHING, fnode.globalFlushingFilter, fnode.currentWorkingSlave);
01783 
01784                 // Yıkama yoksa başla
01785             } else if (fnode.flushEnabled == 1 && fnode.errorOccured == false) {
01786 
01787                     periodicFlushTicker.detach();
01788                     fnode.periodicFlushCounter = 0;
01789 
01790                     fnode.flushing = true;
01791                     fnode.flushStarted = true;
01792                     fnode.checkDp = false;
01793 
01794                     minFlushTicker.detach();
01795                     fnode.minFlushCounter = 0;
01796                     fnode.isMinTimePassed = false;
01797 
01798                     fnode.globalFlushPhase = 1;
01799                     fnode.currentFlushPhase = 1;
01800                     fnode.globalFlushingFilter = 1;
01801                     fnode.currentFlushingFilter = 1;
01802                     fnode.currentWorkingSlave = 0;
01803 
01804                     send_alarm(BACKFLUSH_MANUAL_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave);
01805 
01806             } else if (fnode.flushEnabled == 0 && fnode.errorOccured == false) {
01807 
01808                 send_alarm(FLUSH_DISABLED, fnode.globalFlushingFilter, fnode.currentWorkingSlave);
01809 
01810             }
01811         }
01812         break;
01813     }
01814 }
01815 
01816 bool send_command(uint8_t _slaveid, uint8_t _command, uint8_t _filterid)
01817 {
01818     bool _ackinit = false;
01819 
01820     if (_slaveid == MASTER_ID) {
01821 
01822         if (_command == OPEN_SOLENOID || _command == TEST_OPEN_SOLENOID) {
01823 
01824             if (open_solenoid(_filterid) == true) {
01825 
01826                 _ackinit = true;
01827 
01828             }
01829 
01830         } else if (_command == CLOSE_SOLENOID || _command == TEST_CLOSE_SOLENOID) {
01831 
01832             if (close_solenoid(_filterid)) {
01833 
01834                 _ackinit = true;
01835 
01836             }
01837         }
01838 
01839     } else {
01840 
01841         fnode.masterTxBuffer[0] = MASTER_ID;
01842         fnode.masterTxBuffer[1] = _slaveid;
01843         fnode.masterTxBuffer[2] = _command;
01844         fnode.masterTxBuffer[3] = _filterid;
01845         fnode.masterTxBuffer[4] = 0x0D;
01846 
01847         for (uint8_t i = 0; i < sizeof(fnode.masterTxBuffer); i++) {
01848 
01849             for (uint8_t j = 0; j < 3; j++) {
01850 
01851                 if (master.putc(fnode.masterTxBuffer[i]) == fnode.masterTxBuffer[i]) {
01852 
01853                     _ackinit = true;
01854 
01855                 } else {
01856 
01857                     _ackinit = false;
01858 
01859                 }
01860 
01861                 if (_ackinit == true) {
01862 
01863                     break;
01864 
01865                 }
01866             }
01867 
01868             if (_ackinit == false) {
01869 
01870                 break;
01871 
01872             }
01873         }
01874 
01875         // Slave'den cevap tamamlanıncaya/gelinceye kadar bekle (ISR ile tamamlanır)
01876         while (fnode.masterInterruptComplete != true) {}
01877 
01878         if (fnode.masterInterruptComplete == true) {
01879 
01880             if (fnode.masterRxBuffer[0] == _OK_) {
01881 
01882                 _ackinit = true;
01883 
01884             } else {
01885 
01886                 _ackinit  = false;
01887 
01888             }
01889         }
01890 
01891 
01892         memset (fnode.masterRxBuffer, 0, sizeof(fnode.masterRxBuffer));
01893         master.attach(&master_rx_isr, Serial::RxIrq);
01894 
01895         fnode.masterInterruptComplete = false;
01896     }
01897 
01898     return _ackinit;
01899 }
01900 
01901 // Data aktarım ISR
01902 void data_transmit_isr()
01903 {
01904     fnode.transmitData = true;
01905 }
01906 
01907 // RF Rx ISR
01908 void rf_rx_isr()
01909 {
01910     fnode.rfBufferChar = rf.getc();
01911 
01912     if (fnode.rfBufferChar != '\r') {
01913 
01914         fnode.rfBuffer[fnode.rfBufferCounter] = fnode.rfBufferChar;
01915         fnode.rfBufferCounter++;
01916 
01917     } else if (fnode.rfBufferChar == '\r') {
01918 
01919         rf.attach(NULL, Serial::RxIrq);
01920         fnode.rfBufferCounter = 0;
01921         fnode.rfInterruptComplete = true;
01922     }
01923 }
01924 
01925 void master_rx_isr()
01926 {
01927     fnode.masterBufferChar = master.getc();
01928 
01929     if (fnode.masterBufferChar != '\r') {
01930 
01931         fnode.masterRxBuffer[fnode.masterBufferCounter] = fnode.masterBufferChar;
01932         fnode.masterBufferCounter++;
01933 
01934     } else if (fnode.masterBufferChar == '\r') {
01935 
01936         master.attach(NULL, Serial::RxIrq);
01937         fnode.masterBufferCounter = 0;
01938         fnode.masterInterruptComplete = true;
01939     }
01940 }
01941 
01942 // Sayaç pals ISR
01943 void watermeter_isr()
01944 {
01945     fnode.pulse ++;
01946     fnode.pulseTransmit ++;
01947     fnode.pulsePressureCheck ++;
01948 }
01949 
01950 // Yıkama fazı değişim ISR
01951 void flush_phase_isr()
01952 {
01953     fnode.flush_isr = true;
01954 }
01955 
01956 // Basınç kontrol ISR
01957 void pressure_check_isr()
01958 {
01959     fnode.checkPressure = true;
01960 }
01961 
01962 void periodic_flush_isr()
01963 {
01964     fnode.periodicFlushCounter ++;
01965 }
01966 
01967 void min_flush_interval_isr()
01968 {
01969     fnode.minFlushCounter ++;
01970 }
01971 
01972 void rt_data_transmit_isr()
01973 {
01974     fnode.transmit_rtData = true;
01975     fnode.rtCounter ++;
01976 }
01977 #endif