/*  
   Copyright (C) 2009, 2010 Matt Reba, Jeremiah Dillingham

    This file is part of BrewTroller.

    BrewTroller is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    BrewTroller is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with BrewTroller.  If not, see <http://www.gnu.org/licenses/>.


BrewTroller - Open Source Brewing Computer
Software Lead: Matt Reba (matt_AT_brewtroller_DOT_com)
Hardware Lead: Jeremiah Dillingham (jeremiah_AT_brewtroller_DOT_com)

Documentation, Forums and more information available at http://www.brewtroller.com
*/

byte scheduler;

enum schedulerTasks {
  SCHEDULETASK_TIMERS,
#ifndef NOUI
  SCHEDULETASK_LCD,
#endif
  SCHEDULETASK_TEMPS,
  SCHEDULETASK_BUZZER,
  SCHEDULETASK_VOLS,
#ifdef FLOWRATE_CALCS
  SCHEDULETASK_FLOWRATES,
#endif
  SCHEDULETASK_PROGRAMS,
  SCHEDULETASK_COMS,
#ifdef PVOUT
  SCHEDULETASK_OUTPUTPROFILES,
#endif
  SCHEDULETASK_COUNT
};

void brewCore() {

  //START HIGH PRIORITY: Time-sensitive updates perfromed on each iteration
  #ifdef HEARTBEAT
    heartbeat();
  #endif
  processHeatOutputs();
  //END HIGH PRIORITY
  
  //START NORMAL PRIORITY: Updated in turn
  switch (scheduler) {
#ifndef NOUI
    case SCHEDULETASK_LCD:
      LCD.update();
      break;
#endif  

    case SCHEDULETASK_TIMERS:
      //Timers: Timer.pde
      updateTimers();
      break;
      
    case SCHEDULETASK_TEMPS:
     //temps: Temp.pde
     updateTemps();
     break;

    case SCHEDULETASK_BUZZER:
      //Alarm update allows to have a beeping alarm
      updateBuzzer();
      break;
      
    case SCHEDULETASK_VOLS:
      //Volumes: Volume.pde
      updateVols();
      break;
      
#ifdef FLOWRATE_CALCS
    case SCHEDULETASK_FLOWRATES:
      updateFlowRates();
      break;
#endif      
      
    case SCHEDULETASK_PROGRAMS:
      //Step Logic: StepLogic.pde
      stepCore();
      break;
      
    case SCHEDULETASK_COMS:
      //Communications: Com.pde
      updateCom();
      break;
      
#ifdef PVOUT
    case SCHEDULETASK_OUTPUTPROFILES:
      //Auto Valve Logic: Outputs.pde
      processAutoValve();
      
      //Set Valve Outputs based on active valve profiles (if changed): Outputs.pde
      updateValves();
      break;
#endif 
  }
  
  if(++scheduler >= SCHEDULETASK_COUNT)
    scheduler = 0;
}

#ifdef HEARTBEAT
  unsigned long hbStart = 0;
  void heartbeat() {
    if (millis() - hbStart > 750) {
      hbPin.toggle();
      hbStart = millis();
    }
  }
#endif