VortechMenu

Related to the development libraries, released by Curt Binder
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

rimai wrote:It's much easier to do that with smart phone, but if you want something like this on the controler, you could do something like another user has done for his LED lights.
You could make it so the mode increments everytime you visit that menu option and then cycle back to first when it reaches the last mode.
Or maybe having another custom screen just for picking modes? Just like jsclownfish did for his alternate custom screens: http://forum.reefangel.com/viewtopic.php?f=11&t=923

Thank You.
Last edited by JNieuwenhuizen on Thu Apr 12, 2012 11:53 am, edited 1 time in total.
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

binder wrote:Here's something that cycles through the modes from 1 through 9. The cycle is as follows:

Lagoon -> Reef Crest -> Short Wave -> Long Wave -> Nutrient -> Tidal Swell -> Night Mode

Code: Select all

// this goes above the menu entries
byte vtmode = 0;

void MenuEntry7()
{
	vtmode++;
	if ( vtmode == 7 ) vtmode = 9;
	if ( vtmode > 9 ) vtmode = 1;
	// 1st parameter is Mode, 2nd is speed, 3rd is duration
	ReefAngel.RF.SetMode(vtmode, InternalMemory.RFSpeed_read(), InternalMemory.RFDuration_read());
	ReefAngel.DisplayedMenu = RETURN_MAIN_MODE;	
}
The only problem with the vortech modes and having a menu entry on the controller for them is they have a Pump Speed and a Duration variable. Right now, I have it set to use the Speed and Duration from the internal memory settings.
It could easily be changed to use a specific Speed and Duration for each one of the modes. Since I don't have one of these modules, nor have I used them before, I do not know what the ideal settings would or should be. I'm just coding a generic function that should handle a majority of the cases.
Hi Binder.

I have tried the code and it does not cycle the modes. It stays on the internal memory mode.

Also, I see Roberto mentioned in his initial thread when the RF was released, that modes 10 and 11 are there, can I change the 9 in the code to 11?
binder
Posts: 2871
Joined: Fri Mar 18, 2011 6:20 pm
Location: Illinois
Contact:

Re: VortechMenu

Post by binder »

If it stays on the Internal Memory mode, what does the rest of your INO file look like? Do you have something that sets it elsewhere? I'm just curious because nothing in the code I posted would use the Internal Memory for the modes.
Does the mode get set properly when you enter Feeding mode?
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

Hi binder.

My code has a few places it sets internal memory values. The complete code is here - I can always set my internal memory to no values?? i dont know if that would work. If I go to feeding mode, it does set the pumps to feeding mode.
http://forum.reefangel.com/viewtopic.ph ... 8654#p8654
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

Hi binder.

Did you see the reply I posted?

- Jean
binder
Posts: 2871
Joined: Fri Mar 18, 2011 6:20 pm
Location: Illinois
Contact:

Re: VortechMenu

Post by binder »

JNieuwenhuizen wrote:Hi binder.

Did you see the reply I posted?

- Jean
I briefly looked at it for a second but have not really looked at it yet. Will try to do so today.
binder
Posts: 2871
Joined: Fri Mar 18, 2011 6:20 pm
Location: Illinois
Contact:

Re: VortechMenu

Post by binder »

See my comment on the other thread:
http://forum.reefangel.com/viewtopic.ph ... 8722#p8722
Poiromaniax
Posts: 180
Joined: Thu Apr 05, 2012 6:20 am
Location: JHB, South Africa

Re: VortechMenu

Post by Poiromaniax »

Hey all,

Im also looking into doing this,

Is there a way of changing the modes via web interface? or even the iphone app?
Image
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

I do it with my android.
Which smart phone do you have?

Sent from my SPH-D700 using Tapatalk 2
Roberto.
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Sorry, I just reread your post and saw you have iPhone.
It seems there is a bug on the iPhone app that causes it to crash if you try to change the mode with it.
http://forum.reefangel.com/viewtopic.php?p=8822#p8822
Roberto.
Poiromaniax
Posts: 180
Joined: Thu Apr 05, 2012 6:20 am
Location: JHB, South Africa

VortechMenu

Post by Poiromaniax »

Cool,

Any other way to change modes? Considering my vortech will now become the slave
Image
binder
Posts: 2871
Joined: Fri Mar 18, 2011 6:20 pm
Location: Illinois
Contact:

Re: VortechMenu

Post by binder »

Poiromaniax wrote:Cool,

Any other way to change modes? Considering my vortech will now become the slave
You can manually change the modes via the web interface. This is the same way that the iPhone and Android apps work.

Code: Select all

// RF Mode
http://YOURIPADDRESS:2000/mb855,X

// RF Speed
http://YOURIPADDRESS:2000/mb856,X

// RF Duration
http://YOURIPADDRESS:2000/mb857,X
You simply use your IP address and port. Then, you would use the value you want in place of X. This is just like what was mentioned earlier.

Or you can use the java status app to change the memory locations:
http://forum.reefangel.com/viewtopic.php?f=8&t=246
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

So I have tested the code with the changes suggested, It still only changes the mode for a second and then returns to normal operation.

Any chance we could re-visit this to see if we can get it going? :)
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Try this:

Code: Select all

// this goes above the menu entries
byte vtmode = 0;

Code: Select all

void MenuEntry7()
{
   vtmode++;
   if ( vtmode == 7 ) vtmode = 9;
   if ( vtmode > 9 ) vtmode = 1;
   InternalMemory.RFMode_write(vtmode);
   ReefAngel.DisplayedMenu = RETURN_MAIN_MODE;   
}
Roberto.
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

Hi

I tried the code you suggested, now it does not switch modes at all.
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Try this:

Code: Select all

void MenuEntry7()
{
  // TODO complete this function
  /*
 Need to have an override variable inside the loop that forces a specific mode whenever
   the menu is toggled. This should mimic the PWM override.
   */
  /*
 Cycle through the modes.
   Use the Internal Memory values OR create a switch statement that has default values
   for Speed and Duration based on the modes being switched to.
   Once at the end of the modes,
   return to constant mode (begining)
   resume normal operations
   */
   if (!fOverrideRF && vtechmode == 9)
     vtechmode=0;
     ReefAngel.RF.SetMode(Feeding_Stop,0,0); //Temp fix for coming out of Night mode
   else
     vtechmode++;
     
  fOverrideRF = true;
  if ( vtechmode == 7 ) vtechmode = 9;
  if ( vtechmode > 9 ) { 
    vtechmode = 0; 
    fOverrideRF = false; 
  }
  
  // 1st parameter is Mode, 2nd is speed, 3rd is duration
  ReefAngel.DisplayedMenu = RETURN_MAIN_MODE;
}
Roberto.
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

While trying out your code, I noticed a bug in your DrawTime() function that was causing the wdt to kick in.
Change this:

Code: Select all

  char temp[]=" ";
To this:

Code: Select all

  char temp[]="  ";
Roberto.
jpalmer
Posts: 31
Joined: Tue May 01, 2012 11:49 pm

Re: VortechMenu

Post by jpalmer »

binder wrote:
Poiromaniax wrote:Cool,

Any other way to change modes? Considering my vortech will now become the slave
You can manually change the modes via the web interface. This is the same way that the iPhone and Android apps work.

Code: Select all

// RF Mode
http://YOURIPADDRESS:2000/mb855,X

// RF Speed
http://YOURIPADDRESS:2000/mb856,X

// RF Duration
http://YOURIPADDRESS:2000/mb857,X
You simply use your IP address and port. Then, you would use the value you want in place of X. This is just like what was mentioned earlier.

Or you can use the java status app to change the memory locations:
http://forum.reefangel.com/viewtopic.php?f=8&t=246
Curious, are all of the URL options for the RA documented somewhere?

I know about /r1, /r99, /wifi, and now these few. Is there an authoratative source I can use to tell me all the different options without diving into a bunch of code? Alternately.. if I do need to dig through code, where would I start my search?
Image
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

It's on RA_Wifi.cpp
This is the extraction from the file:

Code: Select all

            if (strncmp("GET / ", m_pushback, 6)==0) reqtype = REQ_ROOT;
            else if (strncmp("GET /wifi", m_pushback, 9)==0) reqtype = REQ_WIFI;
            else if (strncmp("GET /r", m_pushback, 6)==0) reqtype = -REQ_RELAY;
            else if (strncmp("GET /mb", m_pushback, 7)==0) { reqtype = -REQ_M_BYTE; weboption2 = -1; bHasSecondValue = false; bCommaCount = 0; }
            else if (strncmp("GET /mi", m_pushback, 7)==0) { reqtype = -REQ_M_INT; weboption2 = -1; bHasSecondValue = false; bCommaCount = 0; }
            else if (strncmp("GET /ma", m_pushback, 7)==0) reqtype = -REQ_M_ALL;
            else if (strncmp("GET /mr", m_pushback, 7)==0) reqtype = -REQ_M_RAW;
            else if (strncmp("GET /v", m_pushback, 6)==0) reqtype = -REQ_VERSION;
            else if (strncmp("GET /d", m_pushback, 6)==0) { reqtype = -REQ_DATE; weboption2 = -1; weboption3 = -1; bCommaCount = 0; }
            else if (strncmp("HTTP/1.", m_pushback, 7)==0) reqtype = -REQ_HTTP;
            else if (strncmp("GET /sr", m_pushback, 7)==0) reqtype = -REQ_R_STATUS;
            else if (strncmp("GET /sa", m_pushback, 7)==0) reqtype = -REQ_RA_STATUS;
            else if (strncmp("GET /bp", m_pushback, 7)==0) reqtype = -REQ_BTN_PRESS;
            else if (strncmp("GET /mf", m_pushback, 7)==0) reqtype = -REQ_FEEDING;
            else if (strncmp("GET /mw", m_pushback, 7)==0) reqtype = -REQ_WATER;
//            else if (strncmp("GET /cr", m_pushback, 7)==0) reqtype = -REQ_CAL_RELOAD;
            else if (strncmp("GET /mt", m_pushback, 7)==0) reqtype = -REQ_ALARM_ATO;
            else if (strncmp("GET /mo", m_pushback, 7)==0) reqtype = -REQ_ALARM_OVERHEAT;
            //else reqtype = -REQ_UNKNOWN;
There isn't any documentation on the codes yet.
Roberto.
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

rimai wrote:Try this:

Code: Select all

void MenuEntry7()
{
  // TODO complete this function
  /*
 Need to have an override variable inside the loop that forces a specific mode whenever
   the menu is toggled. This should mimic the PWM override.
   */
  /*
 Cycle through the modes.
   Use the Internal Memory values OR create a switch statement that has default values
   for Speed and Duration based on the modes being switched to.
   Once at the end of the modes,
   return to constant mode (begining)
   resume normal operations
   */
   if (!fOverrideRF && vtechmode == 9)
     vtechmode=0;
     ReefAngel.RF.SetMode(Feeding_Stop,0,0); //Temp fix for coming out of Night mode
   else
     vtechmode++;
     
  fOverrideRF = true;
  if ( vtechmode == 7 ) vtechmode = 9;
  if ( vtechmode > 9 ) { 
    vtechmode = 0; 
    fOverrideRF = false; 
  }
  
  // 1st parameter is Mode, 2nd is speed, 3rd is duration
  ReefAngel.DisplayedMenu = RETURN_MAIN_MODE;
}
I get an error now - "Else without a previous If"
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Sorry.

Code: Select all

void MenuEntry7()
{
  // TODO complete this function
  /*
 Need to have an override variable inside the loop that forces a specific mode whenever
   the menu is toggled. This should mimic the PWM override.
   */
  /*
 Cycle through the modes.
   Use the Internal Memory values OR create a switch statement that has default values
   for Speed and Duration based on the modes being switched to.
   Once at the end of the modes,
   return to constant mode (begining)
   resume normal operations
   */
   if (!fOverrideRF && vtechmode == 9)
   {
     vtechmode=0;
     ReefAngel.RF.SetMode(Feeding_Stop,0,0); //Temp fix for coming out of Night mode
   }
   else
   {
     vtechmode++;
   }
     
  fOverrideRF = true;
  if ( vtechmode == 7 ) vtechmode = 9;
  if ( vtechmode > 9 ) { 
    vtechmode = 0; 
    fOverrideRF = false; 
  }
  
  // 1st parameter is Mode, 2nd is speed, 3rd is duration
  ReefAngel.DisplayedMenu = RETURN_MAIN_MODE;
}
Roberto.
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

So I have tried this one

Still doesnt change the modes.
Any other Ideas?

The closest one was Binders suggestion, as it changed for a split second.
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Does it change on screen and not on the module, or it doesn't even change on screen?
Roberto.
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

It does not change on screen , or on module.
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Can you post your latest entire code?
Roberto.
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

HI Roberto

Here is my current config - a few items are // out, as I am waiting for rufessor to complete the comms between the PWM module, and the RA

Code: Select all

#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <ReefAngel.h>
#include <avr/pgmspace.h>>
//***************************************************************************************************************************************************************************
//-------------------------------------------------------------------------- Screen set-up ---------------------------------------------------------------------------------
#define NumScreens 6
int ScreenID=0;
//***************************************************************************************************************************************************************************
//--------------------------------------------------------------------- Start of Global Variables ---------------------------------------------------------------------------
bool fOverrideRF = false;
byte vtechmode = 0;
boolean bFeeding=false;
byte x,y;
byte TempRelay =15;
byte TempRelay2=15;
//***************************************************************************************************************************************************************************
//----------------------------------------------------------------------- Custom Menu Code ----------------------------------------------------------------------------------
prog_char menu1_label[] PROGMEM = "Food!!";
prog_char menu2_label[] PROGMEM = "Cleanup";
prog_char menu3_label[] PROGMEM = "ATO Clear";
prog_char menu4_label[] PROGMEM = "Storm";
prog_char menu5_label[] PROGMEM = "pH Cal";
prog_char menu6_label[] PROGMEM = "Salinity Cal";
prog_char menu7_label[] PROGMEM = "Vortech Mode";
prog_char menu8_label[] PROGMEM = "Sump On";
prog_char menu9_label[] PROGMEM = "Sump Off";

void MenuEntry1()
{
   ReefAngel.DisplayMenuEntry("Food!!");
   ReefAngel.FeedingModeStart();
}
void MenuEntry2()
{
   ReefAngel.DisplayMenuEntry("Cleanup");
   ReefAngel.WaterChangeModeStart();
}
void MenuEntry3()
{
    ReefAngel.DisplayMenuEntry("ATO Clear"); 
    ReefAngel.ATOClear();
}
void MenuEntry4()
{
    ReefAngel.DisplayMenuEntry("Storm");
    ReefAngel.DisplayedMenu=RETURN_MAIN_MODE;
}
void MenuEntry5()
{
    ReefAngel.DisplayMenuEntry("pH Cal");
    ReefAngel.SetupCalibratePH();
    ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void MenuEntry6()
{
    ReefAngel.DisplayMenuEntry("Salinity Cal");
    ReefAngel.SetupCalibrateSalinity();
    ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void MenuEntry7()
{
  // TODO complete this function
  /*
 Need to have an override variable inside the loop that forces a specific mode whenever
   the menu is toggled. This should mimic the PWM override.
   */
  /*
 Cycle through the modes.
   Use the Internal Memory values OR create a switch statement that has default values
   for Speed and Duration based on the modes being switched to.
   Once at the end of the modes,
   return to constant mode (begining)
   resume normal operations
   */
   if (!fOverrideRF && vtechmode == 9)
   {
     vtechmode=0;
     ReefAngel.RF.SetMode(Feeding_Stop,0,0); //Temp fix for coming out of Night mode
   }
   else
   {
     vtechmode++;
   }
     
  fOverrideRF = true;
  if ( vtechmode == 7 ) vtechmode = 9;
  if ( vtechmode > 9 ) { 
    vtechmode = 0; 
    fOverrideRF = false; 
  }
  
  // 1st parameter is Mode, 2nd is speed, 3rd is duration
  ReefAngel.DisplayedMenu = RETURN_MAIN_MODE;
}


void MenuEntry8()
{
    ReefAngel.DisplayMenuEntry("Sump On");
    ReefAngel.Relay.RelayMaskOn = ReefAngel.LightsOnPorts;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ ) 
     {
       ReefAngel.Relay.RelayMaskOnE[i] = ReefAngel.LightsOnPortsE[i];
     }
    #endif  // RelayExp
    ReefAngel.Relay.Write();
}

void MenuEntry9()
{
    ReefAngel.DisplayMenuEntry("Sump Off");
    ReefAngel.Relay.RelayMaskOn = 0;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
     {
      ReefAngel.Relay.RelayMaskOnE[i] = 0;
     }
    #endif  // RelayExp
    ReefAngel.Relay.Write();
}
//***************************************************************************************************************************************************************************
//------------------------------------------------------------------------- Grouped Menu Entries ----------------------------------------------------------------------------
PROGMEM const char *menu_items[] =
{
    menu1_label, menu2_label, menu3_label,
    menu4_label, menu5_label, menu6_label,
    menu7_label,menu8_label,menu9_label
};
//***************************************************************************************************************************************************************************
//------------------------------------------------------------------------------- Custom Main -------------------------------------------------------------------------------
void DrawCircleOutline(byte x, byte y, byte radius, byte bordercolor);
void FillCircle(byte x, byte y, byte radius, byte fillcolor);
void DrawCircleOutletBox(byte x, byte y, byte RelayData, bool reverse = false);
//***************************************************************************************************************************************************************************
//-------------------------------------------------------------------------- Analog Clock constants -------------------------------------------------------------------------
const float pi = 3.141592653;
byte clock_center_x = 65;
byte clock_center_y = 65;
byte clock_radius = 55;
byte secondhand_radius = 33;
float secondangle;
byte secondend_x;
byte secondend_y;
float minuteangle;
float hourangle;
//***************************************************************************************************************************************************************************
//--------------------------------------------------------------------------- Analog Clock Structure ------------------------------------------------------------------------
int minutebase_radius = 3;
int minutehand_radius = 33;
int hourbase_radius = 3;
int hourhand_radius = 25;
int seconds_hand_x, seconds_hand_y, minutes_hand_x, minutes_hand_y, hours_hand_x, hours_hand_y;
int hours_hand_base_x, hours_hand_base_y, hours_hand_base_x1, hours_hand_base_y1;
int minutes_hand_base_x, minutes_hand_base_y, minutes_hand_base_x1, minutes_hand_base_y1;
int minutebase_x, minutebase_y, minutebase_x1, minutebase_y1;
int minuteend_x, minuteend_y;
int hourbase_x, hourbase_y, hourbase_x1, hourbase_y1;
int hourend_x, hourend_y;
float minfloat;
//***************************************************************************************************************************************************************************
//--------------------------------------------------------------------------------Time Stamp --------------------------------------------------------------------------------
time_t tsmax=now();
time_t tsmin=now();
time_t PHmax=now();
time_t PHmin=now();
//***************************************************************************************************************************************************************************
//------------------------------------------------------------------------------ Draw Minutes Hand --------------------------------------------------------------------------
void draw_minute(int color)
{
    Drawline(minutebase_x, minutebase_y, minutebase_x1, minutebase_y1, color);
    Drawline(minutebase_x, minutebase_y, minuteend_x, minuteend_y, color);
    Drawline(minutebase_x1, minutebase_y1, minuteend_x, minuteend_y, color);
}
//***************************************************************************************************************************************************************************
//--------------------------------------------------------------------------- Draw Hour Hand --------------------------------------------------------------------------------
void draw_hour(int color)
{
    Drawline(hourbase_x, hourbase_y, hourbase_x1, hourbase_y1, color);
    Drawline(hourbase_x, hourbase_y, hourend_x, hourend_y, color);
    Drawline(hourbase_x1, hourbase_y1, hourend_x, hourend_y, color);
}
//***************************************************************************************************************************************************************************
//------------------------------------------------------------------------------ Draw Line ----------------------------------------------------------------------------------
void Drawline (int x0, int y0, int x1, int y1, int color)
{
    int dy = y1 - y0;
    int dx = x1 - x0;
    int stepx, stepy;
    if (dy < 0)
    {
        dy = -dy;
        stepy = -1;
    }
    else
    {
        stepy = 1;
    }
    if (dx < 0)
    {
        dx = -dx;
        stepx = -1;
    }
    else
    {
        stepx = 1;
    }
    dy <<= 1; // dy is now 2*dy
    dx <<= 1; // dx is now 2*dx
    ReefAngel.LCD.PutPixel(color, x0, y0);
    if (dx > dy)
    {
        int fraction = dy - (dx >> 1); // same as 2*dy - dx
        while (x0 != x1)
        {
            if (fraction >= 0)
            {
                y0 += stepy;
                fraction -= dx; // same as fraction -= 2*dx
            }
            x0 += stepx;
            fraction += dy; // same as fraction -= 2*dy
            ReefAngel.LCD.PutPixel(color, x0, y0);
        }
    }
    else
    {
        int fraction = dx - (dy >> 1);
        while (y0 != y1)
        {
            if (fraction >= 0)
            {
                x0 += stepx;
                fraction -= dy;
            }
            y0 += stepy;
            fraction += dx;
            ReefAngel.LCD.PutPixel(color, x0, y0);
        }
    }
}
//***************************************************************************************************************************************************************************
//------------------------------------------------------------------------------ Draw Time ----------------------------------------------------------------------------------
void DrawTime(byte x, byte y, byte FGcolor, byte BGcolor, time_t ts)
{
    char text[13];
    char temp[]="  ";
    strcpy(text,"");
    itoa(hourFormat12(ts),temp,10);
    if (temp[1]==0) strcat(text,"0");
    strcat(text,temp);
    strcat(text,":");
    itoa(minute(ts),temp,10);
    if (temp[1]==0) strcat(text,"0");
    strcat(text,temp);
    strcat(text,":");
    itoa(second(ts),temp,10);
    if (temp[1]==0) strcat(text,"0");
    strcat(text,temp);
    if (isAM(ts))
    {
        strcat(text," AM");
    }
    else
    {
        strcat(text," PM");
    }
    ReefAngel.LCD.DrawText(FGcolor, BGcolor, x, y, text);
}
//***************************************************************************************************************************************************************************
//------------------------------------------------------------------------------ Draw Circle --------------------------------------------------------------------------------
void DrawCircle(int a, int b, int r, byte color)
{
    int f = 1 - r;
    int ddF_x = 1;
    int ddF_y = -2 * r;
    int x = 0;
    int y = r;

    ReefAngel.LCD.PutPixel(color, a, b+r);
    ReefAngel.LCD.PutPixel(color ,a, b-r);
    ReefAngel.LCD.PutPixel(color, a+r, b);
    ReefAngel.LCD.PutPixel(color, a-r, b);
    while (x<y)
    {
        if (f >= 0)
        {
            y--;
            ddF_y += 2;
            f += ddF_y;
        }
        x++;
        ddF_x += 2;
        f += ddF_x;

        ReefAngel.LCD.PutPixel(color, a + x, b + y);
        ReefAngel.LCD.PutPixel(color, a - x, b + y);
        ReefAngel.LCD.PutPixel(color, a + x, b - y);
        ReefAngel.LCD.PutPixel(color, a - x, b - y);
        ReefAngel.LCD.PutPixel(color, a + y, b + x);
        ReefAngel.LCD.PutPixel(color, a - y, b + x);
        ReefAngel.LCD.PutPixel(color, a + y, b - x);
        ReefAngel.LCD.PutPixel(color, a - y, b - x);
    }
}
//***************************************************************************************************************************************************************************

void DrawCustomMain()
{
    // Refresh is called at start of ShowInterface.
    // ShowInterface calls DrawCustomMain
    switch (ScreenID)
    {
//---------------------------------------------------------------------------- Screen Code 1--------------------------------------------------------------------------------
        case 0:
            //Top Banner
            ReefAngel.LCD.DrawLargeText(COLOR_WHITE, COLOR_CORNFLOWERBLUE, 0, 1, " Drop Reef Tank   ", Font8x8); //Top Banner
            // Display T1 Header Text
            ReefAngel.LCD.DrawLargeText(COLOR_STEELBLUE,255,5,15,"Sump Temp", Font8x8);
            // Display the T1 Temp Value
            char text[7];
            ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
            ReefAngel.LCD.Clear(255, 10, 25, 50, 60);
            if (ReefAngel.Params.Temp[T1_PROBE]>290) ReefAngel.LCD.DrawHugeNumbers(COLOR_RED, 255, 10, 25, text);
            else if (ReefAngel.Params.Temp[T1_PROBE]>270) ReefAngel.LCD.DrawHugeNumbers(COLOR_ORANGE, 255, 10, 25, text);
            else ReefAngel.LCD.DrawHugeNumbers(COLOR_MIDNIGHTBLUE, 255, 10, 25, text);
            // Display the T2 Header Text
            ReefAngel.LCD.DrawLargeText(0,255,5,45,"Room Temp", Font8x8);
            // Display the T2 Temp Value
            ReefAngel.LCD.Clear(255, 90, 50, 132, 60);
            ConvertNumToString(text, ReefAngel.Params.Temp[T2_PROBE], 10);
            ReefAngel.LCD.DrawLargeText(COLOR_MIDNIGHTBLUE, 255, 90, 45, text, Num8x8);
            // Display pH Header Text
            ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN,255,95,15,"pH", Font8x8);
            // Display pH Value
            ConvertNumToString(text, ReefAngel.Params.PH, 100);
            ReefAngel.LCD.Clear(0, 65, 62 , 65, 62);
            if (ReefAngel.Params.PH>840 || ReefAngel.Params.PH<790) ReefAngel.LCD.DrawLargeText(COLOR_RED, 255, 85, 25, text, Num8x8);
            else if (ReefAngel.Params.PH>830 || ReefAngel.Params.PH<800) ReefAngel.LCD.DrawLargeText(COLOR_ORANGE, 255, 85, 25, text, Num8x8);
            else ReefAngel.LCD.DrawLargeText(COLOR_MIDNIGHTBLUE, 255, 85, 25, text, Num8x8);
            
//****************************************************************************************************************************************************************************
//------------------------------------------------------------------ Display Vortech Mode ------------------------------------------------------------------------------------

            ReefAngel.LCD.DrawLargeText(0,255,5,55,"Vortech", Font8x8); 
            
//****************************************************************************************************************************************************************************            
//---------------------------------------------------------------- Display EcoSmart Mode Value -------------------------------------------------------------------------------

            ReefAngel.LCD.Clear(255, 66, 60, 132, 70);
            if (vtechmode == 0) ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN,255, 66, 55,"Constant");
            else if(vtechmode == 1) ReefAngel.LCD.DrawLargeText(COLOR_GOLD,255, 66, 55,"Lagoon");
            else if (vtechmode == 2) ReefAngel.LCD.DrawLargeText(COLOR_GOLD,255, 80, 55,"RCM");
            else if (vtechmode == 3) ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE,255, 80, 55,"Short");
            else if (vtechmode == 4) ReefAngel.LCD.DrawLargeText(COLOR_PINK,255, 66, 55,"Long");
            else if (vtechmode == 5) ReefAngel.LCD.DrawLargeText(COLOR_MAGENTA,255, 80, 55,"NTM");
            else if (vtechmode == 6) ReefAngel.LCD.DrawLargeText(COLOR_MAGENTA,255, 80, 55,"TSM");
            else if (vtechmode == 9) ReefAngel.LCD.DrawLargeText(COLOR_GRAY,255, 80, 55,"Night");
            
//****************************************************************************************************************************************************************************            
//------------------------------------------------------------------- Display Salinity ---------------------------------------------------------------------------------------

            ReefAngel.LCD.DrawLargeText(0,255,64,114,"Salinity", Font8x8);
            
//****************************************************************************************************************************************************************************
//----------------------------------------------------------------- Display Salinity Value -----------------------------------------------------------------------------------

            ReefAngel.LCD.Clear(255, 82, 85, 65, 95);
            ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
            ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN, 255, 85, 122, text, Num8x8);
            
//*****************************************************************************************************************************************************************************
//-----------------------------------------------------------Start Moon Phase,Cloud or Storm Display---------------------------------------------------------------------------
/* if (ReefAngel.PWM.Channel[5] > 0);
  {
    ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,70,105,MoonPhaseLabel());

  }
           if (ReefAngel.PWM.ExpansionChannel[0] > 0 && (hour() < 14 ) )
            {
               ReefAngel.LCD.DrawLargeText(COLOR_ORANGERED,255,3,65, "Sunrise",Font8x8);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,3,75, ReefAngel.PWM.ExpansionChannel[0]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,20,74, ":");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,24,75, ReefAngel.PWM.ExpansionChannel[1]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,41,74, ":");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,45,75, ReefAngel.PWM.ExpansionChannel[2]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,66,75, "|");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,70,75, ReefAngel.PWM.ExpansionChannel[3]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,87,74, ":");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,91,75, ReefAngel.PWM.ExpansionChannel[4]);
            }
           else if (ReefAngel.PWM.ExpansionChannel[0] > 0 && (hour() > 14 ))
            {
               ReefAngel.LCD.DrawLargeText(COLOR_ORANGERED,255,3,65, "Sunrise",Font8x8);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,3,75, ReefAngel.PWM.ExpansionChannel[0]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,20,74, ":");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,24,75, ReefAngel.PWM.ExpansionChannel[1]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,41,74, ":");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,45,75, ReefAngel.PWM.ExpansionChannel[2]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,66,75, "|");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,70,75, ReefAngel.PWM.ExpansionChannel[3]);
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,87,74, ":");
               ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,91,75, ReefAngel.PWM.ExpansionChannel[4]);
            }
  */         
//*****************************************************************************************************************************************************************************
//---------------------------------------------------------- Display Main and Expansion Relay Box -----------------------------------------------------------------------------

            TempRelay = ReefAngel.Relay.RelayData;
            TempRelay &= ReefAngel.Relay.RelayMaskOff;
            TempRelay |= ReefAngel.Relay.RelayMaskOn;
            ReefAngel.LCD.DrawCircleOutletBox(10,90, TempRelay);
            pingSerial();

            TempRelay2 = ReefAngel.Relay.RelayDataE[0];
            TempRelay2 &= ReefAngel.Relay.RelayMaskOffE[0];
            TempRelay2 |= ReefAngel.Relay.RelayMaskOnE[0];
            ReefAngel.LCD.DrawCircleOutletBox(40,90, TempRelay2);
            pingSerial();
            break;
            
//***************************************************************************************************************************************************************************
//---------------------------------------------------------------------------- Screen Code 2---------------------------------------------------------------------------------

        case 1:  //PWM Module Info
  ReefAngel.LCD.Clear(BtnActiveColor,5,0,127,11);
  ReefAngel.LCD.DrawText(DefaultBGColor,BtnActiveColor,30,3,"My Reef Angel");
  ReefAngel.LCD.DrawDate(6, 122);
  pingSerial();
//ReefAngel.LCD.DrawMonitor(15, 20, ReefAngel.Params,
//ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue());
  pingSerial();
  ReefAngel.LCD.Clear(DefaultFGColor,5,52,127,52);
  ReefAngel.LCD.DrawText(COLOR_DARKGOLDENROD,DefaultBGColor,30,55,"PWM Expansion");
  x=15;
  y=68;
  for (int a=0;a<6;a++)
  {
    if (a>2) x=75;
    if (a==3) y=68;
    ReefAngel.LCD.DrawText(COLOR_DARKGOLDENROD,DefaultBGColor,x,y,"Ch :");
    ReefAngel.LCD.DrawText(COLOR_DARKGOLDENROD,DefaultBGColor,x+12,y,a);
  //ConvertNumToString(text, ReefAngel.PWM.GetChannelValue(a), 1);
    strcat(text,"  ");
    ReefAngel.LCD.DrawText(COLOR_DARKGOLDENROD,DefaultBGColor,x+24,y,text);
    y+=10;
  }
  break;

//***************************************************************************************************************************************************************************
//---------------------------------------------------------------------------- Screen Code 3---------------------------------------------------------------------------------
        case 2:  //relay box key
            ReefAngel.LCD.DrawLargeText(COLOR_WHITE, COLOR_CORNFLOWERBLUE, 0, 1, " Drop Reef Tank ", Font8x8); //Top Banner
            TempRelay = ReefAngel.Relay.RelayData;
            TempRelay &= ReefAngel.Relay.RelayMaskOff;
            TempRelay |= ReefAngel.Relay.RelayMaskOn;
            ReefAngel.LCD.DrawCircleOutletBox(56,46,TempRelay);
            pingSerial();
            ReefAngel.LCD.DrawLargeText(0,255,27,20,"RelayBox 1", Font8x8);
            ReefAngel.LCD.DrawLargeText(0,255,3,44,"LDFan", Font8x8); //1
            ReefAngel.LCD.DrawLargeText(0,255,7,54,"N/A", Font8x8); //3
            ReefAngel.LCD.DrawLargeText(0,255,7,64,"ATU", Font8x8); //5
            ReefAngel.LCD.DrawLargeText(0,255,7,74,"Salty", Font8x8); //7
            ReefAngel.LCD.DrawLargeText(0,255,75,44,"Skimer", Font8x8);  //2
            ReefAngel.LCD.DrawLargeText(0,255,75,54,"Reactr", Font8x8);  //4
            ReefAngel.LCD.DrawLargeText(0,255,75,64,"Heatr", Font8x8); //6
            ReefAngel.LCD.DrawLargeText(0,255,75,74,"Relay", Font8x8);  //8
            break;
            
//***************************************************************************************************************************************************************************
//---------------------------------------------------------------------------- Screen Code 4---------------------------------------------------------------------------------
        case 3:  //relay box key
            ReefAngel.Refresh();
            ReefAngel.LCD.DrawLargeText(COLOR_WHITE, COLOR_CORNFLOWERBLUE, 0, 1, " Drop Reef Tank ", Font8x8); //Top Banner
            TempRelay2 = ReefAngel.Relay.RelayDataE[0];
            TempRelay2 &= ReefAngel.Relay.RelayMaskOffE[0];
            TempRelay2 |= ReefAngel.Relay.RelayMaskOnE[0];
            ReefAngel.LCD.DrawCircleOutletBox(56,46,TempRelay2);
            pingSerial();
            ReefAngel.LCD.DrawLargeText(0,255,27,20,"RelayBox 2", Font8x8);
            ReefAngel.LCD.DrawLargeText(0,255,7,44,"VTech", Font8x8);//1
            ReefAngel.LCD.DrawLargeText(0,255,3,54,"Return", Font8x8);//3
            ReefAngel.LCD.DrawLargeText(0,255,7,64,"N/A", Font8x8);//5
            ReefAngel.LCD.DrawLargeText(0,255,7,74,"PWM", Font8x8);//7
            ReefAngel.LCD.DrawLargeText(0,255,75,44,"VTech", Font8x8);//2
            ReefAngel.LCD.DrawLargeText(0,255,75,54,"SumpL", Font8x8);//4
            ReefAngel.LCD.DrawLargeText(0,255,75,64,"Heatr", Font8x8);//6
            ReefAngel.LCD.DrawLargeText(0,255,75,74,"LED", Font8x8);//8
            break;
            
//***************************************************************************************************************************************************************************
//---------------------------------------------------------------------------- Screen Code 5---------------------------------------------------------------------------------

        case 4:  //setclock
            // Analog clock is modified from the original source by Jeff Miller
            // Author: Jeff Miller   http://arduinofun.blogspot.com/
            ReefAngel.LCD.DrawLargeText(COLOR_WHITE, COLOR_CORNFLOWERBLUE, 0, 1, " Drop Reef Tank ", Font8x8); //Top Banner
            // Frame
            DrawCircle(clock_center_x, clock_center_y, clock_radius, COLOR_CORNFLOWERBLUE);
            DrawCircle(clock_center_x, clock_center_y, clock_radius - 1, COLOR_CORNFLOWERBLUE);
            DrawCircle(clock_center_x, clock_center_y, clock_radius - 2, COLOR_CORNFLOWERBLUE);
            // Face Tick Marks  (x = r cos theta, y = r sin theta)
            for (byte r=0; r < 12; r++)
            {
                float angle = (2 * pi / 12)*r;
                int tick_x_out = (clock_radius - 8) * cos (angle) + clock_center_x;
                int tick_y_out = (clock_radius - 8) * sin (angle) + clock_center_y;
                int tick_x_in = clock_radius *.72 * cos (angle) + clock_center_x;
                int tick_y_in = clock_radius * .72 * sin (angle) + clock_center_y;
                Drawline(tick_x_in, tick_y_in, tick_x_out, tick_y_out, COLOR_CORNFLOWERBLUE);
            }
            // Face Characters
            ReefAngel.LCD.DrawLargeText(0,255,clock_center_x - 8,106," 6", Font8x8);
            ReefAngel.LCD.DrawLargeText(0,255,clock_center_x - 8, 25,"12", Font8x8);
            ReefAngel.LCD.DrawLargeText(0,255,clock_center_x + 34,clock_center_y," 3", Font8x8);
            ReefAngel.LCD.DrawLargeText(0,255,clock_center_x - 50, clock_center_y - 4,"9 ", Font8x8);
            // Draw Seconds Hand
            secondangle = (2 * pi / 60) * second();
            if (second() > 15)
            {
                secondangle = secondangle -1.57;
            }
            else
            {
                secondangle = secondangle +4.71;
            }
            Drawline(clock_center_x, clock_center_y, secondend_x, secondend_y, WHITE);
            secondend_x = secondhand_radius * cos (secondangle) + clock_center_x;
            secondend_y = secondhand_radius * sin (secondangle) + clock_center_y;
            Drawline(clock_center_x, clock_center_y, secondend_x, secondend_y, BLACK);
// Redraw minutes hand since the section closest to the center gets erased by the seconds hand
            draw_minute(BLACK);
// Redraw hour hand
            draw_hour(BLACK);
// Draw Minutes Hand
            minuteangle = (2 * pi / 60) * minute();
            if (minute() > 15)
            {
                minuteangle = minuteangle -1.57;
            }
            else
            {
                minuteangle = minuteangle +4.71;
            }
            // Erase old minutes Hand
            draw_minute(WHITE);
            // Calculate Minute Hand Base
            minutebase_x = minutebase_radius * cos (minuteangle - pi/2) + clock_center_x;
            minutebase_y = minutebase_radius * sin (minuteangle - pi/2) + clock_center_y;
            minutebase_x1 = minutebase_radius * cos (minuteangle + pi/2) + clock_center_x;
            minutebase_y1 = minutebase_radius * sin (minuteangle + pi/2) + clock_center_y;
// Calculate Minute Hand Point
            minuteend_x = minutehand_radius * cos (minuteangle) + clock_center_x;
            minuteend_y = minutehand_radius * sin (minuteangle) + clock_center_y;
// Draw new minutes Hand
            draw_minute(BLACK);
// Redraw hour hand
            draw_hour(BLACK);
// Draw Hour Hand
            minfloat = minute(); // Convert minute short to float
            hourangle = (2 * pi / 12) * ((hourFormat12()) + (minfloat/60)); // Find angle for hour hand
            hourangle = hourangle -1.57;
// Erase old Hour Hand
            draw_hour(WHITE);
// Calculate hour Hand Base
            hourbase_x = hourbase_radius * cos (hourangle - pi/2) + clock_center_x;
            hourbase_y = hourbase_radius * sin (hourangle - pi/2) + clock_center_y;
            hourbase_x1 = hourbase_radius * cos (hourangle + pi/2) + clock_center_x;
            hourbase_y1 = hourbase_radius * sin (hourangle + pi/2) + clock_center_y;
// Calculate hour Hand Point
            hourend_x = hourhand_radius * cos (hourangle) + clock_center_x;
            hourend_y = hourhand_radius * sin (hourangle) + clock_center_y;
// Draw new hours Hand
            draw_hour(BLACK);
            ReefAngel.LCD.DrawDate(5,121);
            break;
            
//***************************************************************************************************************************************************************************
//---------------------------------------------------------------------------- Screen Code 6---------------------------------------------------------------------------------

        case 5: // Vortech Setup
            ReefAngel.LCD.DrawLargeText(COLOR_WHITE, COLOR_CORNFLOWERBLUE, 0, 1, " Drop Reef Tank ", Font8x8); //Top Banner
            ReefAngel.LCD.DrawText(0,255,20,50,"Assigning Slaves");
            ReefAngel.RF.SetMode(Slave_Start,0,0);
            if (ReefAngel.Joystick.IsButtonPressed())
            {
                ReefAngel.RF.SetMode(Slave_Stop,0,0);
                ReefAngel.LCD.DrawText(0,255,50,60,"Done");
            }
            break;

    }
}

void DrawCustomGraph()
{}

//***************************************************************************************************************************************************************************
//------------------------------------------------------------------------------ Begin Setup --------------------------------------------------------------------------------
void setup()
{
    ReefAngel.Init();  //Initialize controller
    ReefAngel.Timer[LCD_TIMER].SetInterval(180);
    ReefAngel.Timer[LCD_TIMER].Start();  // start timer
    ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));
    ReefAngel.SetTemperatureUnit(1);
    ReefAngel.FeedingModePorts = 0;
    ReefAngel.WaterChangePorts = Port2Bit | Port4Bit | Port5Bit | Port6Bit;
    ReefAngel.WaterChangePortsE[0] = Port3Bit;
    ReefAngel.OverheatShutoffPorts = Port6Bit;
    ReefAngel.OverheatShutoffPortsE[0] = Port6Bit;
    ReefAngel.LightsOnPorts = 0;
    ReefAngel.LightsOnPortsE[0] = Port4Bit;
//------------------------------------------------------------------------- Ports that are always on ------------------------------------------------------------------------
  ReefAngel.Relay.On(Port1);
  ReefAngel.Relay.On(Port4);
  ReefAngel.Relay.On(Port7);
  ReefAngel.Relay.On(Port8);
  ReefAngel.Relay.On(Box1_Port1);
  ReefAngel.Relay.On(Box1_Port2);
  ReefAngel.Relay.On(Box1_Port3);
  ReefAngel.Relay.On(Box1_Port7);
  ReefAngel.Relay.On(Box1_Port8);
}
//***************************************************************************************************************************************************************************
void loop()
{
//--------------------------------------------------------------------------- Specific Functions ----------------------------------------------------------------------------
    ReefAngel.Relay.DelayedOn(Port2, 2);
    ReefAngel.Relay.DelayedOn(Box1_Port1, 2);
    ReefAngel.Relay.DelayedOn(Box1_Port2, 2);
    ReefAngel.StandardATO( Port5,80 );
    ReefAngel.StandardHeater( Port6,247,255 );
    ReefAngel.StandardHeater( Box1_Port6,247,255 );
    ReefAngel.MoonLights(Box1_Port4);//SumpLight
    ReefAngel.Portal("JNieuwenhuizen");
//------------------------------------------------------------------------------ Multiple Screens ----------------------------------------------------------------------------

    if (ReefAngel.Joystick.IsLeft())
    {
        ReefAngel.ClearScreen(DefaultBGColor);
        ScreenID--;
    }
    if (ReefAngel.Joystick.IsRight())
    {
        ReefAngel.ClearScreen(DefaultBGColor);
        ScreenID++;
    }
    if (ScreenID<0) ScreenID=NumScreens;
    if (ScreenID>=NumScreens) ScreenID=0;

//***************************************************************************************************************************************************************************
//------------------------------------------------------------------ Start Time-of-Day Based Functions ----------------------------------------------------------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ These are the mode numbers for the RF Expansion Module for reference ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //#define Constant      0
    //#define Random1       1 // Lagoonal
    //#define Random2       2 // Reef Crest
    //#define ShortWave     3
    //#define LongWave      4
    //#define Smart_NTM     5 // Nutrient Transport Mode
    //#define Smart_TSM     6 // Tidal Swell Mode
    //#define Feeding_Start 7
    //#define Feeding_Stop  8
    //#define Night         9
    //#define Slave_Start   97
    //#define Slave_Stop    98
    //#define None          99
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----------------------------------------------------------------- Start RF Daytime Control ------------------------------------------------------------------------------
        if (hour() >8 && hour() < 14)
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Smart_NTM,80,7);
            vtechmode = Smart_NTM;
        }
       else if (hour() >14 && hour() < 22)
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Random2,60,7);
            vtechmode = Random2;
        }

//--------------------------------------------------------------- Start RF Nightmode Control -----------------------------------------------------------------------------
       else if (hour()>=22 || hour()<8) // Defining "Nightmode" hours for VorTech = between 10 PM and 8 AM
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Night,10,0);
            vtechmode = Night;
        }
        else
        {
            ReefAngel.RF.SetMode(Feeding_Stop,0,0); //Temp fix for coming out of Night mode
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Smart_NTM,80,7);
            vtechmode = Smart_NTM;
            ReefAngel.RF.SetMode(vtechmode, InternalMemory.RFSpeed_read(), InternalMemory.RFDuration_read());
        } 

    ReefAngel.ShowInterface();
}

//***************************************************************************************************************************************************************************

rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Sorry man...
Got busy and forgot to look at it.
I found out why :)
You forgot to check for fOverrideRF in your schedule.
use this:

Code: Select all

    if (!fOverrideRF)
    {
        if (hour() >8 && hour() < 14)
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Smart_NTM,80,7);
            vtechmode = Smart_NTM;
        }
       else if (hour() >14 && hour() < 22)
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Random2,60,7);
            vtechmode = Random2;
        }

//--------------------------------------------------------------- Start RF Nightmode Control -----------------------------------------------------------------------------
       else if (hour()>=22 || hour()<8) // Defining "Nightmode" hours for VorTech = between 10 PM and 8 AM
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Night,10,0);
            vtechmode = Night;
        }
        else
        {
            ReefAngel.RF.SetMode(Feeding_Stop,0,0); //Temp fix for coming out of Night mode
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Smart_NTM,80,7);
            vtechmode = Smart_NTM;
            ReefAngel.RF.SetMode(vtechmode, InternalMemory.RFSpeed_read(), InternalMemory.RFDuration_read());
        } 
    }
Also, just a minor bug too on the screen checking...
You will go out of bound if you use ScreenID=NumScreens.

Code: Select all

    if (ScreenID<0) ScreenID=NumScreens-1;
Roberto.
User avatar
JNieuwenhuizen
Posts: 96
Joined: Thu Feb 16, 2012 12:39 am
Location: South Africa

Re: VortechMenu

Post by JNieuwenhuizen »

Thank you Roberto.

We are getting somewhere

It changes modes on the screen now, not on the RF module
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: VortechMenu

Post by rimai »

Try this one:

Code: Select all

    if (!fOverrideRF)
    {
        if (hour() >8 && hour() < 14)
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Smart_NTM,80,7);
            vtechmode = Smart_NTM;
        }
       else if (hour() >14 && hour() < 22)
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Random2,60,7);
            vtechmode = Random2;
        }

//--------------------------------------------------------------- Start RF Nightmode Control -----------------------------------------------------------------------------
       else if (hour()>=22 || hour()<8) // Defining "Nightmode" hours for VorTech = between 10 PM and 8 AM
        {
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Night,10,0);
            vtechmode = Night;
        }
        else
        {
            ReefAngel.RF.SetMode(Feeding_Stop,0,0); //Temp fix for coming out of Night mode
            ReefAngel.RF.UseMemory=false;
            ReefAngel.RF.SetMode(Smart_NTM,80,7);
            vtechmode = Smart_NTM;
            ReefAngel.RF.SetMode(vtechmode, InternalMemory.RFSpeed_read(), InternalMemory.RFDuration_read());
        } 
    }
    else
    {
          ReefAngel.RF.UseMemory=false;
          ReefAngel.RF.SetMode(vtechmode, InternalMemory.RFSpeed_read(), InternalMemory.RFDuration_read());
    }
Roberto.
Post Reply