void handleGenieEvent (struct genieReplyStruct *reply) { if (reply->cmd != GENIE_REPORT_EVENT) { printf ("Invalid event from the display: 0x%02X\r\n", reply->cmd) ; return ; } /**/ if (reply->object == GENIE_OBJ_WINBUTTON) { /**/ if (reply->index == 2) // Button 2 -> Reset Min { minTemp = currentTemp ; updateTemp (minTemps, minTemp, TEMP_BASE_MIN, 1) ; } else if (reply->index == 6) // Button 6 -> Reset Max { maxTemp = currentTemp ; updateTemp (maxTemps, maxTemp, TEMP_BASE_MAX, 2) ; } else printf ("Unknown button: %d\n", reply->index) ; } else printf ("Unhandled Event: object: %2d, index: %d data: %d [%02X %02X %04X]\r\n", reply->object, reply->index, reply->data, reply->object, reply->index, reply->data) ; }
static void *handleTemperature (void *data) { double angle ; int i, sum ; for (i = 0 ; i < 7 ; ++i) temps [i] = minTemps [i] = maxTemps [i] = 0 ; angle = 0.0 ; minTemp = 40 ; maxTemp = -10 ; for (;;) { sum = 0 ; for (i = 0 ; i < 24 ; ++i) { currentTemp = (int)rint ((sin (angle / 180.0 * M_PI) + 1.0) * 25.0 - 10.0) ; sum += currentTemp ; if (currentTemp > maxTemp) maxTemp = currentTemp ; if (currentTemp < minTemp) minTemp = currentTemp ; updateTemp (temps, currentTemp, TEMP_BASE, 0) ; angle += 1.0 ; if (angle > 360.0) angle = 0.0 ; usleep (100000) ; } for (i = 1 ; i < 7 ; ++i) { temps [i - 1] = temps [i] ; minTemps [i - 1] = minTemps [i] ; maxTemps [i - 1] = maxTemps [i] ; } temps [6] = sum / 24 ; minTemps [6] = minTemp ; maxTemps [6] = maxTemp ; updateTemp (minTemps, minTemp, TEMP_BASE_MIN, 1) ; updateTemp (maxTemps, maxTemp, TEMP_BASE_MAX, 2) ; } return NULL ; }
static void *handleTemperaturePressure (void *data) { double temperature; double pressure; time_t sec; double sample = 1200; //trigger time (second) for trend time_t initial = time (NULL) ; double delta ; for (;;){ if(bmp085_Calibration(fd) > 0 ){ temperature = bmp085_GetTemperature(bmp085_ReadUT(fd)); sleep(1); pressure = bmp085_GetPressure(bmp085_ReadUP(fd)); int press = round(pressure/100); int temp = round(temperature/10); updateTemp (temp) ; updatePressure (press) ; sleep(4) ; //Wait 4s to avoid concurrent access sec = time (NULL); delta = difftime(sec, initial); if (delta > sample ){ trend (press); initial = time(NULL); sleep (1); } } sleep (2); } return 0; }
// Euler problem 8 int greatestProductConsecutiveDigits(char *digitString) { struct tempFive tempStore; int i; for (i = 0; i < 5; i++) tempStore.temp[i] = '0'; tempStore.next = 0; int product = 1; int largest = 0; // read five digits from digitString // and calculate product while (*digitString != 'a') // more digits to test { tempStore = updateTemp(tempStore, *digitString); digitString++; product = productTemp(tempStore); if (product > largest) { largest = product; // printf("\n largest is now %i \n", largest); } } return largest; }
/** Runs temperature sensor thread which updates temperature value for display * @brief Obtains temperature voltage readout from ADC1 Channel 16 */ void Thread_TempSensor (void const *argument){ osEvent Status_TempSensor; // Update temperature values when signaled to do so, clear said signal after execution while(1){ Status_TempSensor = osSignalWait((int32_t) THREAD_GREEN_LIGHT, (uint32_t) THREAD_TIMEOUT); updateTemp(); } }
void Bmp085::init(){ uint8_t buf[2]; I2C2Class::getInstance()->read(BMP085ADDR,AC1,buf,2); ac1 = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,AC2,buf,2); ac2 = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,AC3,buf,2); ac3 = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,AC4,buf,2); ac4 = (((uint16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,AC5,buf,2); ac5 = (((uint16_t)buf[0])<<8)|((uint16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,AC6,buf,2); ac6 = (((uint16_t)buf[0])<<8)|((uint16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,B1,buf,2); b1 = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,B2,buf,2); b2 = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,MB,buf,2); mb = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,MC,buf,2); mc = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); I2C2Class::getInstance()->read(BMP085ADDR,MD,buf,2); md = (((int16_t)buf[0])<<8)|((int16_t)buf[1]); for(int i=0;i<20;i++){ startMeasureingTemp(); vTaskDelay(10); updateTemp(); startMeasureingPressure(); vTaskDelay(10); updatePressure(); } startMeasureingTemp(); }
static void heatControl(float setpoint) { static uint16_t stepCounter = 0; switch(stepCounter) { case ms2steps(250): setPowerOff(); break; case ms2steps(275): actitivityDetectionEnabled = 1; break; case ms2steps(300): updateTemp(); vram.PWM_Sp = PID(setpoint, (float)vram.CurrTemp / 10); if (vram.PWM_Sp > 0) { actitivityDetectionEnabled = 0; setPowerDuty(vram.PWM_Sp); } stepCounter = 0; break; } ++stepCounter; }
void main(void) { unsigned char state, menuState, x, y, menuButtonTouched, currentProgramEditing, currentPeriodEditing, currentMenuViewing = 0; unsigned char tempTime; char currentTempMenuViewing; unsigned char released = 1; // Semaphore unsigned char touched = 0; extern struct room rooms[2]; // For programs Tab extern unsigned char weeklySchedule[]; // For days tab //EnableInterrupts; /* enable interrupts */ /* include your code here */ CONFIG1_COPD = 1; INTSCR_MODE = 1; INTSCR_IMASK = 1; initI2C(); initPortX(); initADC(); initSCI(); configureTemp(); startTemp(); initFlash(); initializeDisplay(); initializeThermostat(); // Pass this function before enabling interrupts drawMainScreen(); drawSolidButton(homeButton); state = MAIN; menuState = NONE; //setModeMain(82,I_HEAT); EnableInterrupts; INTSCR_IMASK = 0; for(;;) { //sendModeAux(72, I_COOL); saveProgramData(); // Poll clock drawTopBar(); switch (state) { case MAIN: updateTemp(); break; case PROGRAMS_TAB: break; case DAYS_TAB: break; case SETTINGS: break; } // Poll touchscreen if (!isScreenTouched()) { released = 1; } if (isScreenTouched() && released) { released = 0; x = getX(); y = getY(); x = mapToXPixel(x); y = mapToYPixel(y); switch (state) { case MAIN: if (isOverride[currentRoom]) { if (isButtonTouched(x, y, overrideButton)) { isOverride[currentRoom] = 0; drawMainScreen(); } } if (isButtonTouched(x, y, programButton)) { drawProgramsTab(); state = PROGRAMS_TAB; menuState = NONE; } else if (isButtonTouched(x, y, settingsButton)) { drawSettingsScreen(); state = SETTINGS; menuState = NONE; } else { switch (menuState) { case NONE: if (isButtonTouched(x, y, setToButton)) { switch (isOverride[currentRoom]) { case 0: currentMenuViewing = determineTempMenu(currentPeriod[currentRoom].temperature); break; case 1: currentMenuViewing = determineTempMenu(overridePeriod[currentRoom].temperature); break; } goToText(20, 1); printNum(menuButtonTouched); drawMainSetToMenu(currentMenuViewing); menuState = SET_TO_MENU; } else if (isButtonTouched(x, y, roomButton)) { drawMainRoomMenu(); menuState = ROOM_MENU; } else if (isButtonTouched(x, y, fanButton)) { drawMainFanMenu(); menuState = FAN_MENU; } else if (isButtonTouched(x, y, modeButton)) { drawMainModeMenu(); menuState = MAIN_MODE_MENU; } break; case SET_TO_MENU: menuButtonTouched = isVerticalMenuButtonTouched(x, y, setToMenu); if(menuButtonTouched) { switch (currentMenuViewing) { case 1: if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 59 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 2: if (menuButtonTouched == 1) drawMainSetToMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 62 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 3: if (menuButtonTouched == 1) drawMainSetToMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 65 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 4: if (menuButtonTouched == 1) drawMainSetToMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 68 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 5: if (menuButtonTouched == 1) drawMainSetToMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 71 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 6: if (menuButtonTouched == 1) drawMainSetToMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 74 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 7: if (menuButtonTouched == 1) drawMainSetToMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 77 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 8: if (menuButtonTouched == 1) { drawMainSetToMenu(--currentMenuViewing); } else if (menuButtonTouched == 5) drawMainSetToMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 80 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; case 9: if (menuButtonTouched == 1) { drawMainSetToMenu(--currentMenuViewing); } else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 83 + menuButtonTouched); drawMainScreen(); menuState = NONE; } break; } } break; case ROOM_MENU: menuButtonTouched = isHorizontalMenuButtonTouched(x, y, roomMenu); switch (menuButtonTouched) { case 1: currentRoom = ROOM_MAIN; drawMainScreen(); menuState = NONE; break; case 2: currentRoom = ROOM_AUX; drawMainScreen(); menuState = NONE; break; } break; case FAN_MENU: menuButtonTouched = isHorizontalMenuButtonTouched(x, y, fanMenu); switch (menuButtonTouched) { case 1: fanMode[currentRoom] = FAN_ON; drawMainScreen(); menuState = NONE; break; case 2: fanMode[currentRoom] = FAN_OFF; drawMainScreen(); menuState = NONE; break; case 3: fanMode[currentRoom] = FAN_AUTO; drawMainScreen(); menuState = NONE; break; } break; // Will cause manual override case MAIN_MODE_MENU: menuButtonTouched = isHorizontalMenuButtonTouched(x, y, modeMenu); switch (menuButtonTouched) { case 1: overridePeriod[currentRoom].mode = HEAT; menuState = NONE; break; case 2: overridePeriod[currentRoom].mode = COOL; menuState = NONE; break; case 3: overridePeriod[currentRoom].mode = OFF; menuState = NONE; break; } if (overridePeriod[currentRoom].mode != currentPeriod[currentRoom].mode) { isOverride[currentRoom] = 1; } else { isOverride[currentRoom] = 0; } if (menuButtonTouched) { drawMainScreen(); } break; } } /****END MENUSTATE****/ break; /****END MAIN****/ case PROGRAMS_TAB: if (isButtonTouched(x, y, homeButton)) { drawMainScreen(); state = MAIN; } else if (isButtonTouched(x, y, settingsButton)) { drawSettingsScreen(); state = SETTINGS; } else if (isButtonTouched(x, y, daysTab)) { drawDaysTab(); state = DAYS_TAB; } else if (isButtonTouched(x, y, program1Button)) { drawProgrammingScreen(0); state = PROGRAMMING_SCREEN; currentProgramEditing = 0; } else if (isButtonTouched(x, y, program2Button)) { drawProgrammingScreen(1); state = PROGRAMMING_SCREEN; currentProgramEditing = 1; } else if (isButtonTouched(x, y, program3Button)) { drawProgrammingScreen(2); state = PROGRAMMING_SCREEN; currentProgramEditing = 2; } else if (isButtonTouched(x, y, program4Button)) { drawProgrammingScreen(3); state = PROGRAMMING_SCREEN; currentProgramEditing = 3; } break; case PROGRAMMING_SCREEN: if (isButtonTouched(x, y, homeButton)) { drawMainScreen(); state = MAIN; menuState = NONE; } else if (isButtonTouched(x, y, settingsButton)) { drawSettingsScreen(); state = SETTINGS; menuState = NONE; } else if (isButtonTouched(x, y, okButton)) { drawProgramsTab(); state = PROGRAMS_TAB; menuState = NONE; } switch (menuState) { case NONE: if (isButtonTouched(x, y, hour1Button)) { currentPeriodEditing = 0; currentMenuViewing = determineHoursMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); drawHoursMenu(currentMenuViewing); menuState = HOURS_MENU; } else if (isButtonTouched(x, y, hour2Button)) { currentPeriodEditing = 1; currentMenuViewing = determineHoursMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); drawHoursMenu(currentMenuViewing); menuState = HOURS_MENU; } else if (isButtonTouched(x, y, hour3Button)) { currentPeriodEditing = 2; currentMenuViewing = determineHoursMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); drawHoursMenu(currentMenuViewing); menuState = HOURS_MENU; } else if (isButtonTouched(x, y, hour4Button)) { currentPeriodEditing = 3; currentMenuViewing = determineHoursMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); drawHoursMenu(currentMenuViewing); menuState = HOURS_MENU; } else if (isButtonTouched(x, y, minutes1Button)) { currentPeriodEditing = 0; drawMinutesMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); menuState = MINUTES_MENU; } else if (isButtonTouched(x, y, minutes2Button)) { currentPeriodEditing = 1; drawMinutesMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); menuState = MINUTES_MENU; } else if (isButtonTouched(x, y, minutes3Button)) { currentPeriodEditing = 2; drawMinutesMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); menuState = MINUTES_MENU; } else if (isButtonTouched(x, y, minutes4Button)) { currentPeriodEditing = 3; drawMinutesMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime); menuState = MINUTES_MENU; } else if (isButtonTouched(x, y, amPm1Button)) { toggleAmPm(currentProgramEditing, 0); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } else if (isButtonTouched(x, y, amPm2Button)) { toggleAmPm(currentProgramEditing, 1); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } else if (isButtonTouched(x, y, amPm3Button)) { toggleAmPm(currentProgramEditing, 2); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } else if (isButtonTouched(x, y, amPm4Button)) { toggleAmPm(currentProgramEditing, 3); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } else if (isButtonTouched(x, y, temp1Button)) { currentPeriodEditing = 0; currentMenuViewing = determineTempMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature); drawProgrammingTempMenu(currentMenuViewing); menuState = TEMP_MENU; } else if (isButtonTouched(x, y, temp2Button)) { currentPeriodEditing = 1; currentMenuViewing = determineTempMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature); drawProgrammingTempMenu(currentMenuViewing); menuState = TEMP_MENU; } else if (isButtonTouched(x, y, temp3Button)) { currentPeriodEditing = 2; currentMenuViewing = determineTempMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature); drawProgrammingTempMenu(currentMenuViewing); menuState = TEMP_MENU; } else if (isButtonTouched(x, y, temp4Button)) { currentPeriodEditing = 3; currentMenuViewing = determineTempMenu(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature); drawProgrammingTempMenu(currentMenuViewing); menuState = TEMP_MENU; } else if (isButtonTouched(x, y, mode1Button)) { currentPeriodEditing = 0; drawProgrammingModeMenu(currentPeriodEditing); menuState = PROGRAM_MODE_MENU; } else if (isButtonTouched(x, y, mode2Button)) { currentPeriodEditing = 1; drawProgrammingModeMenu(currentPeriodEditing); menuState = PROGRAM_MODE_MENU; } else if (isButtonTouched(x, y, mode3Button)) { currentPeriodEditing = 2; drawProgrammingModeMenu(currentPeriodEditing); menuState = PROGRAM_MODE_MENU; } else if (isButtonTouched(x, y, mode4Button)) { currentPeriodEditing = 3; drawProgrammingModeMenu(currentPeriodEditing); menuState = PROGRAM_MODE_MENU; } break; case HOURS_MENU: menuButtonTouched = isVerticalMenuButtonTouched(x, y, hoursMenu); if (menuButtonTouched) { switch (currentMenuViewing) { case 1: if (menuButtonTouched == 5) { drawHoursMenu(++currentMenuViewing); } else { updateHours(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime), menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 2: if (menuButtonTouched == 1) drawHoursMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawHoursMenu(++currentMenuViewing); else { updateHours(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime), menuButtonTouched + 3); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 3: if (menuButtonTouched == 1) drawHoursMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawHoursMenu(++currentMenuViewing); else { updateHours(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime), menuButtonTouched + 6); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 4: if (menuButtonTouched == 1) drawHoursMenu(--currentMenuViewing); else if (menuButtonTouched == 2) { updateHours(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime), 11); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } else if (menuButtonTouched == 3) { updateHours(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime), 12); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; } } break; case MINUTES_MENU: menuButtonTouched = isVerticalMenuButtonTouched(x, y, minutesMenu); if(menuButtonTouched) { updateMinutes(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].startTime), menuButtonTouched - 1); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case TEMP_MENU: menuButtonTouched = isVerticalMenuButtonTouched(x, y, programmingTempMenu); if(menuButtonTouched) { switch (currentMenuViewing) { case 1: if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 59 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 2: if (menuButtonTouched == 1) drawProgrammingTempMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 62 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 3: if (menuButtonTouched == 1) drawProgrammingTempMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 65 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 4: if (menuButtonTouched == 1) drawProgrammingTempMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 68 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 5: if (menuButtonTouched == 1) drawProgrammingTempMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 71 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 6: if (menuButtonTouched == 1) drawProgrammingTempMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 74 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 7: if (menuButtonTouched == 1) drawProgrammingTempMenu(--currentMenuViewing); else if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 77 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 8: if (menuButtonTouched == 1) { drawProgrammingTempMenu(--currentMenuViewing); } else if (menuButtonTouched == 5) drawProgrammingTempMenu(++currentMenuViewing); else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 80 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; case 9: if (menuButtonTouched == 1) { drawProgrammingTempMenu(--currentMenuViewing); } else { updateProgrammingTemp(&(rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].temperature), 83 + menuButtonTouched); drawProgrammingScreen(currentProgramEditing); menuState = NONE; } break; } } break; case PROGRAM_MODE_MENU: programmingModeMenu[1] = (1 + 3*(currentPeriodEditing+1)); menuButtonTouched = isHorizontalMenuButtonTouched(x, y, programmingModeMenu); switch (menuButtonTouched) { case 1: rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].mode = HEAT; drawProgrammingScreen(currentProgramEditing); menuState = NONE; break; case 2: rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].mode = COOL; drawProgrammingScreen(currentProgramEditing); menuState = NONE; break; case 3: rooms[currentRoom].programs[currentProgramEditing].periods[currentPeriodEditing].mode = OFF; drawProgrammingScreen(currentProgramEditing); menuState = NONE; break; } programmingModeMenu[1] = 1; break; } break; case DAYS_TAB: if (isButtonTouched(x, y, homeButton)) { drawMainScreen(); state = MAIN; menuState = NONE; } else if (isButtonTouched(x, y, settingsButton)) { drawSettingsScreen(); state = SETTINGS; menuState = NONE; } else if (isButtonTouched(x, y, programsTab)) { drawProgramsTab(); state = PROGRAMS_TAB; menuState = NONE; } switch (menuState) { case NONE: if (isButtonTouched(x, y, monButton)) { drawDaysMenu(monMenu); menuState = MONDAY; } else if (isButtonTouched(x, y, tueButton)) { drawDaysMenu(tueMenu); menuState = TUESDAY; } else if (isButtonTouched(x, y, wedButton)) { drawDaysMenu(wedMenu); menuState = WEDNESDAY; } else if (isButtonTouched(x, y, thuButton)) { drawDaysMenu(thuMenu); menuState = THURSDAY; } else if (isButtonTouched(x, y, friButton)) { drawDaysMenu(friMenu); menuState = FRIDAY; } else if (isButtonTouched(x, y, satButton)) { drawDaysMenu(satMenu); menuState = SATURDAY; } else if (isButtonTouched(x, y, sunButton)) { drawDaysMenu(sunMenu); menuState = SUNDAY; } break; case MONDAY: menuButtonTouched = isVerticalMenuButtonTouched(x, y, monMenu); if (menuButtonTouched) { weeklySchedule[0] = menuButtonTouched - 1; drawDaysTab(); menuState = NONE; } break; case TUESDAY: menuButtonTouched = isVerticalMenuButtonTouched(x, y, tueMenu); if (menuButtonTouched) { weeklySchedule[1] = menuButtonTouched - 1; drawDaysTab(); menuState = NONE; } break; case WEDNESDAY: menuButtonTouched = isVerticalMenuButtonTouched(x, y, wedMenu); if (menuButtonTouched) { weeklySchedule[2] = menuButtonTouched - 1; drawDaysTab(); menuState = NONE; } break; case THURSDAY: menuButtonTouched = isVerticalMenuButtonTouched(x, y, thuMenu); if (menuButtonTouched) { weeklySchedule[3] = menuButtonTouched - 1; drawDaysTab(); menuState = NONE; } break; case FRIDAY: menuButtonTouched = isVerticalMenuButtonTouched(x, y, friMenu); if (menuButtonTouched) { weeklySchedule[4] = menuButtonTouched - 1; drawDaysTab(); menuState = NONE; } break; case SATURDAY: menuButtonTouched = isVerticalMenuButtonTouched(x, y, satMenu); if (menuButtonTouched) { weeklySchedule[5] = menuButtonTouched - 1; drawDaysTab(); menuState = NONE; } break; case SUNDAY: menuButtonTouched = isVerticalMenuButtonTouched(x, y, sunMenu); if (menuButtonTouched) { weeklySchedule[6] = menuButtonTouched - 1; drawDaysTab(); menuState = NONE; } break; } break; case SETTINGS: if (isButtonTouched(x, y, homeButton)) { drawMainScreen(); state = MAIN; } else if (isButtonTouched(x, y, programButton)) { drawProgramsTab(); state = PROGRAMS_TAB; } break; } refreshThermostat(); } __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ }
void controlStateMachine() { enum STATEStyp nextState = g_State; static uint32_t stepCounter = 0; switch(g_State) { case S_BOOTUP: setPowerOff(); resetOffTimer(); setString("boot", 4, 0, 0); // set initial temp setpoint vram.TempSP = nvram.Tsp; if ( stepCounter > ms2steps(1000) ) // after 1s we go to operation { if (setupMode) nextState = S_SETUP; else if (nvram.IsOpenLoop == 1) nextState = S_OPEN_LOOP; else nextState = S_OPERATION; } break; case S_SETUP: if (g_InitState) vram.TempSP = nvram.Tsp; updateTemp(); if (!setupMode) { if (nvram.IsOpenLoop == 1) nextState = S_OPEN_LOOP; else nextState = S_OPERATION; } break; case S_OPERATION: { if (g_InitState) { activateOperMenu(); } heatControl(vram.TempSP); // thermocouple absent detection if (vram.CurrTemp < OPENLOOP_TEMP_VALUE) ++loopDetectCntr; else loopDetectCntr = 0; if (loopDetectCntr > LOOP_DETECTION_TIME) { loopDetectCntr = 0; nvram.IsOpenLoop = 1; } if (nvram.IsOpenLoop == 1) nextState = S_OPEN_LOOP; if (--vram.OffCntDwn <= 0) nextState = S_OFF; break; } case S_OPEN_LOOP: if (g_InitState) { vram.PWM_Sp = 2; vram.CurrTemp = 0; activateManualMenu(); } if (vram.PWM_Sp < 0) vram.PWM_Sp = 0; setPowerDuty(vram.PWM_Sp); if (nvram.IsOpenLoop == 0) nextState = S_OPERATION; // go back to automatic operation if (--vram.OffCntDwn <= 0) nextState = S_OFF; break; case S_OFF: if (g_InitState) setPowerOff(); updateTemp(); if ( !(stepCounter % ms2steps(1000) ) ) setString("OFF", 3, 0, 0); if ( !(stepCounter % ms2steps(2000) ) ) { char buff[10]; sprintf(buff, "%hd*", vram.CurrTemp / 10); rightAlign(buff); setString(buff, strlen(buff), 0, 0); } if (vram.OffCntDwn > 0) nextState = nvram.IsOpenLoop ? S_OPEN_LOOP : S_OPERATION; break; case S_START_BL: break; } if (S_BOOTUP != g_State && S_OFF != g_State && !(stepCounter % ms2steps(100)) ) // we update display each 100 ms updateDisplay(); if (nextState != g_State) // we changed state this time { g_InitState = 1; g_State = nextState; } else g_InitState = 0; ++stepCounter; }