Year Two Project ELEC 2645: Embedded Systems Project Portable Weather Station

Dependencies:   BMP180 ConfigFile N5110 PowerControl beep mbed

ListController.h

Committer:
OHstin
Date:
2015-05-11
Revision:
0:da2b8c7a1ec1

File content as of revision 0:da2b8c7a1ec1:

/**
@file ListController.h

*/

#ifndef LISTCONTROLLER_H
#define LISTCONTROLLER_H

#include "mbed.h"
#include "Outputs.h"

/**
@brief Manages the display of upto 4 possible options on LCD that the user can select.\n
@brief also has a scrolling feature that allows user to browse the options\n
@author Augustine Kizito K
@date April 2015
*/
class ListController
{
private:
    char title[32]; // title of the list
    char option1[32]; // option 1 on the list
    char option2[32]; // option 2 on the list
    char option3[32]; // option 3 on the list
    char option4[32]; // option 4 on the list
    int numberOfOptions; // available number of options
    int currentOption; // tracks position of current cell

    void invertPixels(int option); // inverts pixels in a given bank i.e highlighting an option

protected:
    /**
    Creates a List Controller instance
    
    @param t - string title of list
    @param op1 - option 1 on the list
    @param op2 - option 2 on the list
    @param op3 - option 3 on the list
    @param op4 - option 4 on the list
    @param nOO 0 - available number of options
    
    */
    ListController( char t[], char op1[], char op2[], char op3[], char op4[], int nOO); 
    
    /**
    Populates the LCD screen with the a list of browse-able and selectable options
    
    */
    void showInfo(); // populate the screen with controller data
    
    /**
    Scrolls to the previous option
    
    */
    void scrollUp(); 
    
    /**
    Scrolls to the next option
    
    */
    void scrollDown();
    
    /**
    Gets the current/highlighted option and returns is to the calling function
    
    @returns the currentt option 0 - 3
    */
    int getCurrentOption(); // returns the highlighted Option 0-3

};







ListController::ListController( char t[], char op1[], char op2[], char op3[], char op4[],int nOO)
{
    // initialisations
    strcpy(title,t);
    strcpy(option1,op1);
    strcpy(option2,op2);
    strcpy(option3,op3);
    strcpy(option4,op4);
    numberOfOptions = nOO;
    currentOption = 0;  

}

void ListController::showInfo()
{
    lcd.printString(title,15,1); //  print title
    lcd.printString(option1,0,2);  // print option1
    lcd.printString(option2,0,3);  // print option2
    lcd.printString(option3,0,4); // print option3
    lcd.printString(option4,0,5); // print option4
    
    invertPixels(currentOption); // highlight the current option
}

void ListController::scrollUp()
{
    playSound(); // buzzer makes sound
    invertPixels(currentOption); // UN invert/highlight current option
    currentOption--;  // current position is less by 1

    if (currentOption < 0) { // prevents from inverting a non existent option

        currentOption = 0;
        invertPixels(currentOption); // invert all pixels in current bank

    } else {
        invertPixels(currentOption); // invert all pixels in current bank
    }


}

void ListController::scrollDown()
{
    playSound(); // buzzer makes sound
    invertPixels(currentOption); // UN-invert/highlight the current option
    currentOption++; // current option is more by 1

    if (currentOption > numberOfOptions-1) { // prevents from inverting a non existant option

        currentOption = numberOfOptions-1;
        invertPixels(currentOption); // invert all pixels in current option
    } else {
        invertPixels(currentOption); // invert all pixels in current option
    }
}


int ListController::getCurrentOption()
{ 
    return currentOption;

}

void ListController::invertPixels(int option)
{


    int onset; // x coordinate where inversion starts
   
   // first bank consists of status bar showing time and battery icon
   // second bank consists of the title
   
     if (option == 0) { // invert third bank
        onset = 15;
    } else if ( option == 1) { // invert fourth bank
        onset = 23;
    } else if ( option == 2) { // invert fifth bank
        onset = 31;
    } else {
        onset = 39;  // invert sixth bank
    }

    int termination = onset + 9; // bank's length height is 9 pixels

    for ( int m = onset; m < termination; m++) {

        for ( int n = 0; n < 84; n++) {

            if((lcd.getPixel(n,m)) == 0) { // if the pixel is clear
                lcd.setPixel(n,m);  // set the pixel
            } else {
                lcd.clearPixel(n,m); // else clear the pixel
            }

        }
    }

    lcd.refresh(); // refresh the lcd screen

}

#endif