This class encapsulates all the algorithms required for the displaying strings and time dependent patterns on the lcd.

Dependents:   200943412_QuickClick

Display.cpp

Committer:
domkay97
Date:
2017-05-02
Revision:
17:1c52ff51c028
Parent:
16:8d158d39d438

File content as of revision 17:1c52ff51c028:

#include "Display.h"
#include "N5110.h"
#include "Controller.h"
#include <math.h>

Display::Display()
{
     _h = 0;
     _w = 0.2;
     _a = 0; 
     _x = 0;
    _y = 0; 
    _x0 = 0;
    _y0 = 0;
}

Display::~Display()
{

}
void Display::init()
{

     _h = 0;
     _w = 0.2;
     _a = 0;
     _x = 0; 
     _y = 0; 
     _x0 = 0;
    _y0 = 0; 
}

void Display::drawCircle(Controller &pad, N5110 &lcd)
{  
    _arc_selector(pad, lcd);  
    //printf("Prev Wait:- %3.2f\n",_w);
    _calculateWait();  
    _h++;  
    //printf("Score:- %d\n",_h);
    lcd.clear(); 
    lcd.refresh();
    } 

void Display::_calculateWait() 
{  
   _w = 0.2*exp(-0.0231*_h);  //this equation models how much time the user has 
                            //to complete action with larger amounts of iterations. 
} 


void Display::put_wait(float w) 
{  
   _w = w;
    
} 

float Display::get_wait() 
{  
   return _w;
    
} 
   
void Display::display_instruction(N5110 &lcd, int ran) {   //printing a random instruction on the screen
    lcd.clear();
    if (ran == 1){
        lcd.printString("PRESS",28,2);
        lcd.printChar('A',40,3); } 
    else if (ran == 2){ 
        lcd.printString("PRESS",28,2);
        lcd.printChar('B',40,3); }  
    else if (ran == 3){ 
        lcd.printString("PRESS",28,2);
        lcd.printChar('X',40,3); }  
    else if (ran == 4){ 
        lcd.printString("PRESS",28,2);
        lcd.printChar('Y',40,3); } 
    else if (ran == 5){ 
        lcd.printString("FLICK",28,2);
        lcd.printChar('L',40,3); }  
    else if (ran == 6){ 
        lcd.printString("FLICK",28,2);
        lcd.printChar('R',40,3); }     
    else {
        lcd.printString("PRESS",28,2);
        lcd.printString("STICK",28,3); }  
    //printf("Random Instruction int:- %d\n", ran);
    lcd.refresh(); 
    } 
       
// function to draw circle
void Display::_arc_selector(Controller &ctrl ,N5110 &lcd)
{
  for (int _a = 0; _a < 8; ++_a)
        {
    //printf("for loop (a):- %d\n",a);
    _drawArc(lcd, _a); //run through _drawArc function drawing octant specific to a value
    lcd.refresh();
    float Brightness = ctrl.pot_value(); //set brightness to petentiometer value
    lcd.setBrightness(0.0);         
    //printf("Brightness:- %3.2f\n",Brightness);
    //printf("Wait used:- %3.2f\n",_w);
    wait(_w); 
    lcd.setBrightness(Brightness); //Variable brightness will change with petentiometer value
    wait(_w); //changes after every circle is drawn to make the game more exciting.
         }
 
   }   
    
void Display::_drawArc(N5110 &lcd, int _a) { 
    _x = 20;
    _y = 0;
    
    int a1;
    int b1;
    _radiusMod = 1-_x; 
    _x0 = 42; 
    _y0 = 24;

//the algorithm below is a modified version of the midpoint circle algorithm from: 
//https://en.wikipedia.org/wiki/Midpoint_circle_algorithm    
    
    while(_x >= _y) { 
    
    switch(_a) { 
    
        case 0 : {a1 = _y;           //each case statement draws a single octant by setting a1 and b1 accordingly
                  b1 = _x * -1;
                  break;
                }            
        case 1 : {a1 = _x;
                  b1 = _y * -1;
                  break;
                }           
        case 2 : {a1 = _x;
                  b1 = _y;
                  break;
                }                       
        case 3 : {a1 = _y;
                  b1 = _x;
                  break;
                }   
        case 4 : {a1 = _y * -1;
                  b1 = _x;
                  break;
                } 
        case 5 : {a1 = _x * -1;
                  b1 = _y;
                  break;
                }
        case 6 : {a1 = _x * -1;
                  b1 = _y * -1;
                  break;
                }                
        case 7 : {a1 = _y * -1;
                  b1 = _x * -1;
                  break;
                }               
        default : { a1 = _x;
                b1 = _y * -1;
                break;
                } 
        }
                                  
                              
            lcd.setPixel( a1 + _x0,  b1 + _y0); //draws octant depending on a1 and b1
        
        _y++;   

   
        if (_radiusMod<0) {
            _radiusMod += 2*_y+1;
        } else {
            _x--;
            _radiusMod += 2*(_y-_x)+1;
        }
        //printf("_a1:- %d\n", _a1); 
        //printf("_b1:- %d\n", _b1); 
        //printf("_x:- %d\n", _x); 
        //printf("_y:- %d\n", _y);
        //printf("_radiusMod:- %d\n",_radiusMod);
    }
}