Qubit 2020 / presensfirmwareupdate

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lcd_events.cpp Source File

lcd_events.cpp

00001 #include "cisme.h"
00002 #include "lcd.h"
00003 #include "lcd_events.h"
00004 #include "keys.h"
00005 #include "debug.h"
00006 #include "light.h"
00007 #include "pump.h"
00008 #include "buzzer.h"
00009 #include "presens.h"
00010 #include "adc.h"
00011 #include "experiments.h"
00012 #include "calibration.h"
00013 #include "battery.h"
00014 
00015 #ifdef USE_LCD
00016 
00017 typedef enum {
00018     HOME,
00019     EXP_PARAMS,
00020     UTILITIES,
00021     SYS_PARAMS,
00022     NUM_STATES,
00023 } LcdState;
00024 
00025 typedef void (*EventHandler)(void);
00026 typedef void (*PrepareExperiment)(void);
00027 typedef bool (*RunExperiment)(void);
00028 
00029 static LcdState state;
00030 
00031 // Event handlers
00032 static void home(void);
00033 static void expParams(void);
00034 static void utilities(void);
00035 static void dateTime(void);
00036 static void light(void);
00037 static void pump(void);
00038 static void sysParams(void);
00039 static void purge(void);
00040 static void about(void);
00041 static void phCal(void);
00042 static void o2Cal(void);
00043 static void rawData(void);
00044 static void salinity(void);
00045 static void expType(void);
00046 static void expTime(void);
00047 static void expPump(void);
00048 static void expLight(void);
00049 static void expRun(void);
00050 static void toggleLight(void);
00051 static void togglePump(void);
00052 
00053 static const EventHandler events[NUM_STATES][NUM_KEYS] = {
00054     //ZERO  ONE         TWO         THREE       FOUR        FIVE        SIX         SEVEN           EIGHT   NINE        ASTERISK    HASH    NONE
00055     {home,  expParams,  utilities,  home,       home,       home,       home,       toggleLight,    home,   togglePump, home,       home,   home}, // HOME
00056     {NULL,  expType,    expTime,    expPump,    expLight,   expRun,     home,       NULL,           NULL,   NULL,       NULL,       NULL,   NULL}, // EXP_PARAMS
00057     {NULL,  dateTime,   light,      pump,       sysParams,  purge,      home,       NULL,           NULL,   NULL,       NULL,       NULL,   NULL}, // UTILITIES
00058     {NULL,  about,      phCal,      o2Cal,      rawData,    salinity,   utilities,  NULL,           NULL,   NULL,       NULL,       NULL,   NULL}, // SYS_PARAMS
00059 };
00060 
00061 static void home(void)
00062 {
00063     static bool startup = true;
00064     float presensData[PRESENS_RES_LENGTH];
00065 
00066     if (state != HOME) {
00067         lcdClear();
00068     }
00069 
00070     state = HOME;
00071 
00072     presensGetData(presensData);
00073     float O2Float = presensData[2];
00074 
00075     if (startup) {
00076         L4 = 1;
00077         buzzerBeep(0.1);
00078         buzzerBeep(0.1);
00079         lcdClear();
00080         L1 = 0;
00081         L2 = 0;
00082         L3 = 0;
00083         L4 = 0;
00084         startup = false;
00085     }
00086 
00087     lcdWrite(0, 0,   JUSTIFICATION_CENTER, " CISME 10.0     Bat _ %3.1f", batteryGet());        // Battery Voltage
00088     lcdWrite(1, 0,   JUSTIFICATION_CENTER, "-----------------------");
00089     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "       %%a.s O2 _  %3.0f", O2Float);        // O2
00090     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "              pH _   %3.2f", pHCorrected);
00091     lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "             T_C _  %2.1f", PHTEMP);        // Temp);
00092     lcdWrite(5, 0,   JUSTIFICATION_CENTER, "---%s--%s---", (lightOn() ? "Light-On" : "--------"),
00093                                                            ( pumpOn() ? "Pump-On" : "-------"));
00094     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "1 - Run Experiment");
00095     lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "2 - Utilities");
00096 
00097     NVIC_EnableIRQ(UART1_IRQn);
00098 
00099     Key key = keyGet();
00100     events[state][key]();
00101 }
00102 
00103 static void expParams(void)
00104 {
00105     state = EXP_PARAMS;
00106 
00107     lcdClear();
00108     lcdWrite(0, 0,   JUSTIFICATION_CENTER, "Params Edit");
00109     lcdWrite(1, 0,   JUSTIFICATION_CENTER, "-----------------------");
00110     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "1 - Type");
00111     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "2 - Duration");
00112     lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "3 - Flow");
00113     lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "4 - Light");
00114     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "5 - RUN");
00115     lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "6 - Home Screen");
00116 
00117     // Write current values
00118     switch (MeasurementTypeVal) {
00119         case 9:
00120             lcdWrite(2, 16, JUSTIFICATION_ABSOLUTE, "-");
00121             lcdWrite(3, 16, JUSTIFICATION_ABSOLUTE, "-");
00122             break;
00123         case 0:
00124             lcdWrite(2, 16, JUSTIFICATION_ABSOLUTE, "R");
00125             lcdWrite(3, 16, JUSTIFICATION_ABSOLUTE, "%d", minRESP);
00126             break;
00127         case 1:
00128             lcdWrite(2, 16, JUSTIFICATION_ABSOLUTE, "P");
00129             lcdWrite(3, 16, JUSTIFICATION_ABSOLUTE, "%d", minPHOTO);
00130             break;
00131         case 2:
00132             lcdWrite(2, 16, JUSTIFICATION_ABSOLUTE, "R+P");
00133             lcdWrite(3, 16, JUSTIFICATION_ABSOLUTE, "%d %d", minRESP, minPHOTO);
00134             break;
00135         case 3:
00136             lcdWrite(2, 16, JUSTIFICATION_ABSOLUTE, "P+R");
00137             lcdWrite(3, 16, JUSTIFICATION_ABSOLUTE, "%d %d", minPHOTO, minRESP);
00138             break;
00139         case 4:
00140             lcdWrite(2, 13, JUSTIFICATION_ABSOLUTE, "Program");
00141             lcdWrite(3, 13, JUSTIFICATION_ABSOLUTE, "Program");
00142             lcdWrite(4, 13, JUSTIFICATION_ABSOLUTE, "Program");
00143             lcdWrite(5, 13, JUSTIFICATION_ABSOLUTE, "Program");
00144             break;
00145         default:
00146             break;
00147     }
00148 
00149     // Write current values for flow and time
00150     if (MeasurementTypeVal != 4) {
00151         lcdWrite(4, 16, JUSTIFICATION_ABSOLUTE, "%d", flowintime);
00152         lcdWrite(5, 16, JUSTIFICATION_ABSOLUTE, "%d", lightintime);
00153     }
00154 }
00155 
00156 static void utilities(void)
00157 {
00158     state = UTILITIES;
00159 
00160     lcdClear();
00161     lcdWrite(0, 0,   JUSTIFICATION_CENTER, "Utilities Menu");
00162     lcdWrite(1, 0,   JUSTIFICATION_CENTER, "-----------------------");
00163     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "1 - Date & Time");
00164     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "2 - Toggle Light");
00165     lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "3 - Toggle Pump");
00166     lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "4 - System Parameters");
00167     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "5 - Purge");
00168     lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "6 - Exit");
00169 }
00170 
00171 static void setDateTime(void)
00172 {
00173     struct tm dateTime = {0};
00174 
00175     lcdClear();
00176     lcdWrite(0, 1, JUSTIFICATION_ABSOLUTE, "SET DATE AND TIME");
00177     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "MONTH [01-12]");
00178     dateTime.tm_mon = lcdGetParam(1, 12, 2, 15) - 1;
00179     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "DAY [01-31]");
00180     dateTime.tm_mday = lcdGetParam(1, 31, 3, 15);
00181     lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "YEAR [20##]");
00182     dateTime.tm_year = lcdGetParam(0, 99, 4, 15) + 100;
00183     lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "HOUR [00-23]");
00184     dateTime.tm_hour = lcdGetParam(0, 23, 5, 15);
00185     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "MINUTE [00-59]");
00186     dateTime.tm_min = lcdGetParam(0, 59, 6, 15);
00187 
00188     // Send Date Command to PICODos
00189     INFO("Date Command = DATE %02d-%02d-%02d %02d:%02d:00",
00190          (dateTime.tm_mon + 1), dateTime.tm_mday, (dateTime.tm_year - 100),
00191          dateTime.tm_hour, dateTime.tm_min);
00192     set_time(mktime(&dateTime));
00193 }
00194 
00195 static void dateTime(void)
00196 {
00197     Key key = KEY_NONE;
00198     time_t now;
00199     struct tm* timeNow;
00200 
00201     do {
00202         time_t seconds = time(NULL);
00203 
00204         /* get time to make filename */
00205         time(&now);
00206         timeNow = localtime(&now);
00207 
00208         if (timeNow->tm_year < 100) {
00209             timeNow->tm_year = 100;
00210         }
00211 
00212         lcdClear();
00213         lcdWrite(0, 0, JUSTIFICATION_CENTER, "CISME 10.0");
00214         lcdWrite(2, 0, JUSTIFICATION_CENTER, "Verify Date and Time");
00215         lcdWrite(4, 0, JUSTIFICATION_CENTER, "%02d/%02d/20%02d %02d:%02d:%02d",
00216                 (timeNow->tm_mon + 1), timeNow->tm_mday, (timeNow->tm_year - 100),
00217                 timeNow->tm_hour, timeNow->tm_min, timeNow->tm_sec);
00218         lcdWrite(6, 0, JUSTIFICATION_CENTER, "(*)Change        (#)OK");
00219 
00220         DEBUG1("%s", ctime(&seconds));
00221 
00222         key = keyWait();
00223         if (key == KEY_ASTERISK) {
00224             setDateTime();
00225         }
00226     } while (key != KEY_HASH);
00227 
00228     utilities();
00229 }
00230 
00231 static void currentNew(int value, const char* rangeStr)
00232 {
00233     lcdWrite(1,  0,   JUSTIFICATION_CENTER, "-----------------------");
00234     lcdWrite(2,  1,   JUSTIFICATION_CENTER, "(%s)", rangeStr);
00235     lcdWrite(4,  1, JUSTIFICATION_ABSOLUTE, "Current");
00236     lcdWrite(4,  9, JUSTIFICATION_ABSOLUTE, "-");
00237     lcdWrite(4, 11, JUSTIFICATION_ABSOLUTE, "[");
00238     lcdWrite(4, 12, JUSTIFICATION_ABSOLUTE,  "%03d", value);
00239     lcdWrite(4, 16, JUSTIFICATION_ABSOLUTE, "]");
00240     lcdWrite(5,  1, JUSTIFICATION_ABSOLUTE, "New");
00241     lcdWrite(5, 11, JUSTIFICATION_ABSOLUTE, "[");
00242     lcdWrite(5, 16, JUSTIFICATION_ABSOLUTE, "]");
00243     lcdWrite(7,  1,   JUSTIFICATION_CENTER, "* backspace  # save");
00244 }
00245 
00246 static int getPump(void)
00247 {
00248     // Set pump speed
00249     lcdClear();
00250     lcdWrite(0, 1, JUSTIFICATION_CENTER, "Measurement Flow");
00251     currentNew(flowintime, "0, 5-100%");
00252 
00253     // Now allow user to edit value
00254     flowintime = lcdGetParam(0, 100, 5, 12);
00255     if (flowintime < 5) {
00256         flowintime = 0;
00257     }
00258     return (flowintime);
00259 }
00260 
00261 static int getLight(void)
00262 {
00263     // Set light level
00264     lcdClear();
00265     lcdWrite(0, 1, JUSTIFICATION_CENTER, "Measurement Light");
00266     currentNew(lightintime, "0, 6-100%");
00267 
00268     // Now allow user to edit value
00269     lightintime = lcdGetParam(0, 100, 5, 12);
00270     if (lightintime < 6) {
00271         lightintime = 0;
00272     }
00273     return (lightintime);
00274 }
00275 
00276 static void light(void)
00277 {
00278     MeasurementLight = getLight();
00279 
00280     lightSet(MeasurementLight);
00281     INFO("Measurement light %d", MeasurementLight);
00282 
00283     utilities();
00284 }
00285 
00286 static void pumpFlowSpeed(void)
00287 {
00288     lcdClear();
00289     lcdWrite(0, 1, JUSTIFICATION_ABSOLUTE, "Current flow:");
00290     lcdWrite(1, 1, JUSTIFICATION_ABSOLUTE, "Current speed:");
00291     lcdWrite(6, 0,   JUSTIFICATION_CENTER, "(*)Change        (#)OK");
00292 }
00293 
00294 static void pump(void)
00295 {
00296     Key key = KEY_NONE;
00297     pumpFlowSpeed();
00298 
00299     do {
00300         unsigned char flow = pumpCurrentIntensity();
00301         lcdWrite(0, 15, JUSTIFICATION_ABSOLUTE, "%5u", flow);
00302 
00303         unsigned int speed = pumpSpeed();
00304         lcdWrite(1, 15, JUSTIFICATION_ABSOLUTE, "%5u", speed);
00305 
00306         key = keyGet();
00307         if (key == KEY_ASTERISK) {
00308             MeasurementFlow = getPump();
00309             pumpSet(MeasurementFlow);
00310             INFO("Measurement flow %d", MeasurementFlow);
00311             pumpFlowSpeed();
00312         }
00313         wait(0.5);
00314 
00315     } while (key != KEY_HASH);
00316 
00317     utilities();
00318 }
00319 
00320 static void sysParams(void)
00321 {
00322     state = SYS_PARAMS;
00323 
00324     lcdClear();
00325     lcdWrite(0, 0,   JUSTIFICATION_CENTER, "Set System Parameters");
00326     lcdWrite(1, 0,   JUSTIFICATION_CENTER, "-----------------------");
00327     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "1 - About");
00328     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "2 - pH Auto Cal");
00329     lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "3 - O2 Cal ");
00330     lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "4 - Raw Data Streams ");
00331     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "5 - Salinity");
00332     lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "6 - Exit");
00333 }
00334 
00335 static void purge(void)
00336 {
00337     lcdClear();
00338     lcdWrite(0, 0, JUSTIFICATION_CENTER, "Purge");
00339     lcdWrite(2, 0, JUSTIFICATION_CENTER, "Cycles the pump between");
00340     lcdWrite(3, 0, JUSTIFICATION_CENTER, "0%% and 100%%");
00341     lcdWrite(4, 0, JUSTIFICATION_CENTER, "4 sec 100%%, 2 sec 0%%");
00342     lcdWrite(7, 0, JUSTIFICATION_CENTER, "* - Exit,  # - Start");
00343 
00344     if (keyWaitInRange(rangeAsteriskHash) == KEY_ASTERISK) {
00345         utilities();
00346         return;
00347     }
00348 
00349     lcdClear();
00350     lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "Press * to exit Purge");
00351 
00352     do {
00353         lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "Purge Cycle: Pump On");
00354         pumpSet(PUMP_MAX_INTENSITY);
00355         wait(4);
00356         lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "Purge Cycle: Pump Off");
00357         pumpSet(PUMP_OFF_INTENSITY);
00358         wait(2);
00359     }  while (keyGet() != KEY_ASTERISK);
00360 
00361     utilities();
00362 }
00363 
00364 static int getExpDuration(int MeasurementTypeVal)
00365 {
00366     lcdClear();
00367     lcdWrite(0, 0, JUSTIFICATION_CENTER, "SET DURATION");
00368     lcdWrite(1, 0, JUSTIFICATION_CENTER, "-----------------------");
00369 
00370     if (MeasurementTypeVal == 0) {
00371         lcdWrite(2, 0, JUSTIFICATION_CENTER, "TYPE   - R (Total Time)");
00372     } else if (MeasurementTypeVal == 1) {
00373         lcdWrite(2, 0, JUSTIFICATION_CENTER, "TYPE   - P (Total Time)");
00374     } else if (MeasurementTypeVal == 2) {
00375         lcdWrite(2, 0, JUSTIFICATION_CENTER, "TYPE   - R + P");
00376     } else if (MeasurementTypeVal == 3) {
00377         lcdWrite(2, 0, JUSTIFICATION_CENTER, "TYPE   - P + R");
00378     }
00379 
00380     lcdWrite(7, 1, JUSTIFICATION_CENTER, "* backspace  # Enter");
00381 
00382     if ((MeasurementTypeVal == 0) || (MeasurementTypeVal == 1)) {
00383         lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "MINUTE [00-59]");
00384         unsigned char minutes = lcdGetParam(0, 59, 4, 19);
00385         printf("Minute = %u\n", minutes);
00386 
00387         if (MeasurementTypeVal == 0) {
00388             minRESP = minutes;
00389         } else {
00390             minPHOTO = minutes;
00391         }
00392     } else if (MeasurementTypeVal == 2) {
00393         lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "RESP MINUTE [00-59]");
00394         minRESP = lcdGetParam(0, 59, 4, 19);
00395         printf("Minute = %u\n", minRESP);
00396 
00397         lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "PHOTO MINUTE [00-59]");
00398         minPHOTO = lcdGetParam(0, 59, 5, 19);
00399         printf("Minute = %u\n", minPHOTO);
00400     } else if (MeasurementTypeVal == 3) {
00401         lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "PHOTO MINUTE [00-59]");
00402         minPHOTO = lcdGetParam(0, 59, 4, 19);
00403         printf("Minute = %u\n", minPHOTO);
00404 
00405         lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "RESP MINUTE [00-59]");
00406         minRESP = lcdGetParam(0, 59, 4, 19);
00407         printf("Minute = %u\n", minRESP);
00408     }
00409 
00410     return (minRESP);
00411 }
00412 
00413 static int getExpType(void)
00414 {
00415     lcdClear();
00416     lcdWrite(0, 0,   JUSTIFICATION_CENTER, "Measurement Type");
00417     lcdWrite(1, 0,   JUSTIFICATION_CENTER, "-----------------------");
00418     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "1 - R");
00419     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "2 - P");
00420     lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "3 - R + P");
00421     lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "4 - P + R");
00422     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "5 - Saved Program");
00423 
00424     Key key = keyWait();
00425     INFO("Choice = %u", key);
00426 
00427     return (key - 1);
00428 }
00429 
00430 static void expType(void)
00431 {
00432     MeasurementTypeVal = getExpType();
00433     expParams();
00434 }
00435 
00436 static void expTime(void)
00437 {
00438     getExpDuration(MeasurementTypeVal);
00439     expParams();
00440 }
00441 
00442 static void expPump(void)
00443 {
00444     MeasurementFlow = getPump();
00445     expParams();
00446 }
00447 
00448 static void expLight(void)
00449 {
00450     MeasurementLight = getLight();
00451     expParams();
00452 }
00453 
00454 static void expRun(void)
00455 {
00456     PrepareExperiment preparation;
00457     RunExperiment     experimentStep;
00458 
00459     lcdClear();
00460 
00461     INFO("Experiment started.");
00462 
00463     if (MeasurementTypeVal == PGM) {
00464 
00465         preparation    = experimentPrepareUserProgram;
00466         experimentStep = experimentRunUserProgram;
00467     } else {
00468         preparation    = experimentPrepareDefinedProgram;
00469         experimentStep = experimentRunDefinedProgram;
00470     }
00471 
00472     preparation();
00473 
00474     while (true) {
00475         if (experimentStep()) {
00476             INFO("Experiment completed.");
00477             fprintf(currentFile, "Experiment Completed\n");
00478             lcdClear();
00479             break;
00480         }
00481 
00482         Key choice = keyGet();
00483 
00484         if (choice == KEY_THREE && SwitchMode == 0 &&
00485                 MeasurementTypeVal != R && MeasurementTypeVal != P) {     // Option 3 - change mode in R+P experiment
00486             lcdClear();
00487             lcdWrite(0, 0,   JUSTIFICATION_CENTER, "ARE YOU SURE?");
00488             lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "1 - Yes");
00489             lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "2 - No");
00490 
00491             if (keyWaitInRange(rangeOneTwo) == KEY_ONE) {
00492 
00493                 lcdClear();             // if yes want to change mode
00494                 SwitchMode = 1;
00495                 INFO("Experiment switched by user.");
00496                 fprintf(currentFile,"User Advanced Step\n");
00497                 continue;
00498             }
00499 
00500             lcdClear();
00501             lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "3 - Change Mode");
00502             lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "4 - Stop");
00503 
00504         } else if (choice == KEY_FOUR) { // Option 4 - Stop the experiment
00505             lcdClear();
00506             lcdWrite(0, 0,   JUSTIFICATION_CENTER, "ARE YOU SURE?");
00507             lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "1 - Yes");
00508             lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "2 - No");
00509 
00510             if (keyWaitInRange(rangeOneTwo) == KEY_ONE) {
00511 
00512                 INFO("User Ended Experiment");
00513                 fprintf(currentFile,"User Ended Experiment\n");
00514                 lcdClear();
00515                 break;
00516 
00517             }
00518 
00519             lcdClear();
00520             lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "4 - Stop");
00521 
00522             if ((MeasurementTypeVal == PR || MeasurementTypeVal == RP) &&
00523                     SwitchMode == 0) {
00524                 lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "3 - Change Mode");
00525             }
00526         }
00527     }
00528 
00529     finishExperiment();
00530 
00531     lcdWrite(2, 0, JUSTIFICATION_CENTER, FileName);
00532     lcdWrite(4, 0, JUSTIFICATION_CENTER, "Press # to continue");
00533     Key key = KEY_NONE;
00534     while (key != KEY_HASH) {
00535         buzzerBeep(2);
00536         key = keyWait();
00537     }
00538     lcdClear();
00539 
00540     home();
00541 }
00542 
00543 static void about(void)
00544 {
00545     lcdClear();
00546     lcdWrite(0, 0, JUSTIFICATION_CENTER, "CISME 10.0 February 2016");
00547     lcdWrite(1, 0, JUSTIFICATION_CENTER, "Coral InSituMEtabolism");
00548     lcdWrite(2, 0, JUSTIFICATION_CENTER, "Built by Mera for UNCW");
00549     lcdWrite(3, 0, JUSTIFICATION_CENTER, "Brian Murphy");
00550     lcdWrite(4, 0, JUSTIFICATION_CENTER, "Robert Whitehead");
00551     lcdWrite(5, 0, JUSTIFICATION_CENTER, "Charles Mazel");
00552     lcdWrite(6, 0, JUSTIFICATION_CENTER, "Alina Szmant");
00553 
00554     wait(6);
00555     sysParams();
00556 }
00557 
00558 static void phCal(void)
00559 {
00560     Key key = KEY_NONE;
00561     float pH1Float, PHValue1;
00562     float PHTEMPK, PHTEMPa;
00563     float mSINGLEPT, eoSINGLEPT;
00564 
00565     lcdClear();
00566     lcdWrite(1, 0,   JUSTIFICATION_CENTER, "Calibrate ISFET");
00567     lcdWrite(2, 0,   JUSTIFICATION_CENTER, "Temperature");
00568     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "Bvalue - %3.6f", B);
00569     lcdWrite(7, 0,   JUSTIFICATION_CENTER, "Change? 1-Yes, 2-No");
00570     wait(.1);
00571 
00572     if (keyWaitInRange(rangeOneTwo) == KEY_ONE) {              // if yes want to change mode
00573         //ph temp cal
00574         lcdClear();
00575         lcdWrite(1, 0, JUSTIFICATION_CENTER, "Calibrate ISFET");
00576         lcdWrite(2, 0, JUSTIFICATION_CENTER, "Temperature");
00577         lcdWrite(3, 0, JUSTIFICATION_CENTER, "With Pump");
00578         lcdWrite(7, 0, JUSTIFICATION_CENTER, "7-On ,9-Off");
00579 
00580         key = keyWaitInRange(rangeSevenOrNine);
00581         if (key == KEY_SEVEN) {              // if yes want to change mode
00582             pumpSet(50);
00583         } else { // KEY_NINE
00584             pumpSet(PUMP_OFF_INTENSITY);
00585         }
00586 
00587         lcdClear();
00588         lcdWrite(0, 0,   JUSTIFICATION_CENTER, "Temp Calibration");
00589         lcdWrite(1, 0,   JUSTIFICATION_CENTER, "Single Point");
00590         lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "ISFET Temp");
00591         lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "Temp(C) - XX.XXX");
00592         lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "Place in Temp");
00593         lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "Press # to start");
00594         float TempC = (float)lcdGetParam(0, 99999, 4, 15) / 1000;
00595 
00596         float bValue = calibrationTemperature(TempC);
00597         calibrationTemperatureSave(bValue);
00598 
00599         wait(1.0);
00600     }
00601 
00602     lcdClear();
00603     lcdWrite(1, 0, JUSTIFICATION_ABSOLUTE, "pH Buffer - %3.3f", PHBUFFERF);
00604     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "pH Temp (C) - %3.5f", PHTEMPF);
00605     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "pH Temp (K) - %f", PHTEMPKF);
00606     lcdWrite(4, 0, JUSTIFICATION_ABSOLUTE, "pH Volts - %f", PHVOLTSF);
00607     lcdWrite(5, 0, JUSTIFICATION_ABSOLUTE, "Slope - %2.6f", MSINGLEPT);
00608     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "Eo - %2.6f", EOSINGLEPT);
00609     lcdWrite(7, 0,   JUSTIFICATION_CENTER, "Change? 1-Yes,2-No");
00610 
00611     if (keyWaitInRange(rangeOneTwo) == KEY_TWO) {              // if yes want to change mode
00612         sysParams();
00613         return;
00614     }
00615 
00616     lcdClear();
00617     lcdWrite(1, 0, JUSTIFICATION_CENTER, "Calibrate ISFET");
00618     lcdWrite(2, 0, JUSTIFICATION_CENTER, "pH");
00619     lcdWrite(3, 0, JUSTIFICATION_CENTER, "With Pump");
00620     lcdWrite(7, 0, JUSTIFICATION_CENTER, "7-On ,9-Off");
00621     wait(0.2);
00622 
00623     if (keyWaitInRange(rangeSevenOrNine) == KEY_SEVEN) {              // if yes want to change mode
00624         pumpSet(50);
00625     } else { // Nine
00626         pumpSet(PUMP_OFF_INTENSITY);
00627     }
00628 
00629     lcdClear();
00630     lcdWrite(0, 0,   JUSTIFICATION_CENTER, "pH Auto Calibration");
00631     lcdWrite(1, 0,   JUSTIFICATION_CENTER, "Single Point");
00632     lcdWrite(2, 0, JUSTIFICATION_ABSOLUTE, "pH Buffer Value");
00633     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "Place Buffer");
00634     lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "Press # to start");
00635     lcdWrite(3, 0, JUSTIFICATION_ABSOLUTE, "pH - XX.XXX");
00636     pH1Float = (float)lcdGetParam(0, 99999, 4, 15) / 1000;
00637 
00638     calibrationPh(pH1Float, &PHTEMPa, &mSINGLEPT, &eoSINGLEPT, &PHValue1);
00639     PHTEMPK = PHTEMPa + 273.15;
00640     wait(0.5);
00641 
00642     lcdClear();
00643     lcdWrite(1, 0, JUSTIFICATION_CENTER, "pH Buffer - %2.3f", pH1Float);
00644     lcdWrite(2, 0, JUSTIFICATION_CENTER, "pH Temp (C) - %2.3f", PHTEMP);
00645     lcdWrite(3, 0, JUSTIFICATION_CENTER, "pH Temp (K) - %2.3f", PHTEMPK);
00646     lcdWrite(4, 0, JUSTIFICATION_CENTER, "pH Volts - %2.6f", PHValue1);
00647     lcdWrite(5, 0, JUSTIFICATION_CENTER, "Slope - %2.6f", mSINGLEPT);
00648     lcdWrite(6, 0, JUSTIFICATION_CENTER, "Eo - %2.6f", eoSINGLEPT);
00649 
00650     INFO("PHBUFFERF %2.6f pH1Float %2.6f", PHBUFFERF, pH1Float);
00651     PHBUFFERF = (float)pH1Float;
00652     PHTEMPF = (float)PHTEMP;
00653 
00654     INFO("PHTEMPF %2.6f",PHTEMPF);
00655 
00656     PHTEMPKF = (float)PHTEMPK;
00657     PHVOLTSF = (float)PHValue1;
00658     MSINGLEPT = (float)mSINGLEPT;
00659     EOSINGLEPT = (float)eoSINGLEPT;
00660 
00661     calibrationPhSave();
00662 }
00663 
00664 static void o2Cal(void)
00665 {
00666     lcdClear();
00667     lcdWrite(0, 0, JUSTIFICATION_CENTER, "Pressure Cal - %1.2f", PresCal);
00668     lcdWrite(1, 0, JUSTIFICATION_CENTER, "0%% Phase - %1.2f", PhaseCal1);
00669     lcdWrite(2, 0, JUSTIFICATION_CENTER, "0%% Temp - %1.2f", TempCal1);
00670     lcdWrite(3, 0, JUSTIFICATION_CENTER, "100%% Phase - %1.2f", PhaseCal2);
00671     lcdWrite(4, 0, JUSTIFICATION_CENTER, "100%% Temp - %1.2f", TempCal2);
00672 
00673     lcdWrite(5, 0,   JUSTIFICATION_CENTER, "Change values?");
00674     lcdWrite(6, 0, JUSTIFICATION_ABSOLUTE, "1 - Yes");
00675     lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "2 - No");
00676 
00677     if (keyWaitInRange(rangeOneTwo) == KEY_TWO) {              // if yes want to change mode
00678         sysParams();
00679         return;
00680     }
00681 
00682     lcdClear();
00683     lcdWrite(0, 0, JUSTIFICATION_CENTER, "Oxygen Calibration");
00684 
00685     // Pressure Calibration
00686     lcdWrite(2, 0, JUSTIFICATION_CENTER, "Pres Cal [500-2000]");
00687     PresCal = lcdGetParam(500, 2000, 4, 17);
00688     INFO("Pres Cal: %f", PresCal);
00689 
00690     // 0% Phase Calibration
00691     lcdWrite(2, 0, JUSTIFICATION_CENTER, "0%% P Ang [0-90.00]");
00692     PhaseCal1 = (float)lcdGetParam(0, 9000, 4, 17) / 100;
00693     INFO("PhaseCal1: %f", PhaseCal1);
00694 
00695     // 0% Temp Calibration
00696     lcdWrite(2, 0, JUSTIFICATION_CENTER, "0%% Temp [0-50.00]     ");
00697     TempCal1 = (float)lcdGetParam(0, 5000, 4, 17) / 100;
00698 
00699     INFO("TempCal1: %f", TempCal1);
00700 
00701     // 100% Phase Calibration
00702     lcdWrite(2, 0, JUSTIFICATION_CENTER, "100%% P. Ang. [0-90.00]");
00703     PhaseCal2 = (float)lcdGetParam(0, 9000, 4, 17) / 100;
00704     INFO("PhaseCal2: %f", PhaseCal2);
00705 
00706     // 100% Phase Calibration
00707     lcdWrite(2, 0, JUSTIFICATION_CENTER, "100%% Temp [0-50.00]");
00708     TempCal2 = (float)lcdGetParam(0, 5000, 4, 17) / 100;
00709     INFO("TempCal2: %f", TempCal2);
00710 
00711     // LED Current
00712     lcdWrite(2, 0, JUSTIFICATION_CENTER, "LED Current [0-255]");
00713     LEDCurrent = lcdGetParam(0, 255, 4, 17);
00714     INFO("LEDCurrent: %f", LEDCurrent);
00715 
00716     calibrationO2();
00717 
00718     sysParams();
00719 }
00720 
00721 static void rawData(void)
00722 {
00723     float AmplitudeFloat, PhaseFloat;
00724     float presensData[PRESENS_RES_LENGTH];
00725 
00726     float O2Float = 0;
00727 
00728     lcdClear();
00729 
00730     do {
00731         presensGetData(presensData);
00732         AmplitudeFloat  = presensData[0];
00733         PhaseFloat      = presensData[1];
00734         O2Float         = presensData[2];
00735 
00736         lcdWrite(0, 0,   JUSTIFICATION_CENTER, "Raw Data     Bat _  %3.2f", batteryGet()); // Battery Voltage
00737         lcdWrite(1, 0,   JUSTIFICATION_CENTER, "%%a.s O2_ %3.0f pH_ %3.2f", O2Float, pHCorrected); // O2
00738         lcdWrite(2, 0,   JUSTIFICATION_CENTER, "o2 Amp _ %d", (int)AmplitudeFloat); // Amp
00739         lcdWrite(3, 0,   JUSTIFICATION_CENTER, "o2 Phase _ %3.2f", PhaseFloat);
00740         lcdWrite(4, 0,   JUSTIFICATION_CENTER, "pH adc V _ %3.3f", pH);
00741         lcdWrite(5, 0,   JUSTIFICATION_CENTER, "T adc V _ %3.3f", pHT);
00742         lcdWrite(6, 0,   JUSTIFICATION_CENTER, "T C _ %1.1f", PHTEMP);
00743         lcdWrite(7, 0, JUSTIFICATION_ABSOLUTE, "# - Back");
00744 
00745         NVIC_EnableIRQ(UART1_IRQn);
00746     } while (keyGet() != KEY_HASH);
00747 
00748     sysParams();
00749 }
00750 
00751 static void salinity(void)
00752 {
00753     lcdClear();
00754     lcdWrite(0,  0,   JUSTIFICATION_CENTER, " Enter Salinity:");
00755     lcdWrite(1,  0,   JUSTIFICATION_CENTER, "-----------------------");
00756     lcdWrite(2,  1,   JUSTIFICATION_CENTER, "(31 - 39)");
00757     lcdWrite(4,  1, JUSTIFICATION_ABSOLUTE, "Current");
00758     lcdWrite(4,  9, JUSTIFICATION_ABSOLUTE, "-");
00759     lcdWrite(4, 11, JUSTIFICATION_ABSOLUTE, "[");
00760     lcdWrite(4, 12, JUSTIFICATION_ABSOLUTE,  "%02d", Salinity);
00761     lcdWrite(4, 15, JUSTIFICATION_ABSOLUTE, "]");
00762     lcdWrite(5,  1, JUSTIFICATION_ABSOLUTE, "New");
00763     lcdWrite(5, 11, JUSTIFICATION_ABSOLUTE, "[");
00764     lcdWrite(5, 15, JUSTIFICATION_ABSOLUTE, "]");
00765     lcdWrite(7,  1,   JUSTIFICATION_CENTER, "* backspace  # save");
00766 
00767     Salinity = lcdGetParam(31, 39, 5, 12);
00768 
00769     sysParams();
00770 }
00771 
00772 static void toggleLight(void)
00773 {
00774     if (lightOn() == false) {
00775         lightSet(25);
00776     } else {
00777         lightSet(LIGHT_OFF_INTENSITY);
00778     }
00779 
00780     home();
00781 }
00782 
00783 static void togglePump(void)
00784 {
00785     if (pumpOn() == false) {
00786         pumpSet(60);
00787     } else {
00788         pumpSet(PUMP_OFF_INTENSITY);
00789     }
00790 
00791     home();
00792 }
00793 
00794 void lcdEventSplash(void)
00795 {
00796     lcdClear();
00797     lcdWrite(1, 0, JUSTIFICATION_CENTER, "--------------------");
00798     lcdWrite(2, 0, JUSTIFICATION_CENTER, "CISME 10.0");
00799     lcdWrite(3, 0, JUSTIFICATION_CENTER, "February 2016");
00800     lcdWrite(4, 0, JUSTIFICATION_CENTER, "--------------------");
00801     lcdWrite(6, 0, JUSTIFICATION_CENTER, "Mera Software Services");
00802     lcdWrite(7, 0, JUSTIFICATION_CENTER, "978-689-0003");
00803 }
00804 
00805 void lcdEventsStart(void)
00806 {
00807     home();
00808 
00809     while (true) {
00810         Key key = keyWait();
00811         if (events[state][key] != NULL) {
00812             events[state][key]();
00813         }
00814     }
00815 }
00816 
00817 #endif // USE_LCD