ftf connect lab1

Dependencies:   PCAL955x ST7567 SoftPWM

main.cpp

Committer:
uLipe
Date:
2016-11-04
Revision:
0:b69f739ab07a

File content as of revision 0:b69f739ab07a:

/**
 *  @brief NXP FTF LAB1 - measure analog input, control LEDS an prints on GLCD
 */


#include "mbed.h"
#include "ST7567.h"
#include "AnalogIn.h"
#include "PwmOut.h"
#include "PCAL9555.h"
#include "SoftPWM.h"

/* LCD screen dimensions */
#define LCD_HEIGHT          64
#define LCD_WIDTH           128

/* LCD font dimensions */
#define FONT_HEIGHT         10
#define FONT_WIDTH          5

/* Joystick keys mask */
#define JOY_UP_MASK         0x10
#define JOY_DO_MASK         0x01
#define JOY_EN_MASK         0x02


/** Instance a on board GLCD object */
 ST7567 glcd(D11, D13, D12, D9, D10);

/** Instance a Io expander class */
PCAL9555 joy_input(SDA, SCL);
GpioBusIn joy_bus(joy_input,X0_0, X0_1, X0_2, X0_3, X0_4);


/** Instance three PWM Objects */
SoftPWM led_red(LED1);
SoftPWM led_grn(LED2);
SoftPWM led_blu(LED3);

/** Instance a Analog Input */
AnalogIn potentiometer(A3);

/* screen messages */
const char msg[] = {"Welcome to NXP FTF !\0"};
const char led_r_msg[] = {"Led red value:\0"};
const char led_b_msg[] = {"Led blu value:\0"};
const char led_g_msg[] = {"Led grn value:\0"};



/**
 * @brief main application loop
 */
int main(void) 
{   
    int current_cursor = 0, prev_cursor =0;
    bool enter_pressed = false;    

    /* setup our on-board glcd */
    glcd.set_contrast(0x35);
    glcd.cls();
    
    /* Center the LCD cursor based on message size*/
    glcd.locate(LCD_WIDTH - (sizeof(msg) * FONT_WIDTH), 
                    (LCD_HEIGHT - FONT_HEIGHT) / 2);
    
    /* prints a welcome message */
    glcd.printf(msg);
    Thread::wait(2000);
    glcd.cls();
    
    /* prints the initial screen */
    glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 2);
    glcd.printf(led_r_msg);
    glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 3);
    glcd.printf(led_g_msg);
    glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 4);
    glcd.printf(led_b_msg);


    /* put all pwms to a known value at 1KHz period  */

    led_red.period_ms(1);
    led_red.pulsewidth_us(1000);
    led_grn.period_ms(1);
    led_grn.pulsewidth_us(1000);
    led_blu.period_ms(1);
    led_blu.pulsewidth_us(1000);

   
    /* run the main loop at 200ms period */
    for(;;Thread::wait(200)) {
        
        /* read the joystick status */                
        int keys = joy_bus.read();
        if((keys & JOY_DO_MASK) == 0) {
            /* navigate downward */
            current_cursor = (current_cursor + 1) % 3;
        } else if ((keys & JOY_UP_MASK) == 0) {
            /* navigate upward */
            current_cursor--;
            if(current_cursor < 0) current_cursor = 2;
        } else if ((keys & JOY_EN_MASK) == 0) {
        
            /* catch the enter pressed */
            enter_pressed = true;
        } 
        
        if(current_cursor != prev_cursor) {
            /* joystick action ocurred */

            /* erase previous selection */            
            glcd.locate(0, FONT_HEIGHT * (2+prev_cursor));
            glcd.printf("  ");
            
            /* update for next action */
            prev_cursor = current_cursor;
            enter_pressed = false;                                    
        } 
        
        
        /* move the arrow between options */              
        glcd.locate(0, FONT_HEIGHT * (2+current_cursor));
        glcd.printf("->");
        
        if(enter_pressed != false) {
            /* enter pressed, allow editing the field */
            glcd.locate((sizeof(led_r_msg) + 3) * FONT_WIDTH, 
                            FONT_HEIGHT * (2+current_cursor));
            glcd.printf("%5d", potentiometer.read_u16()); 
            
            switch(current_cursor) {
            case 0:{
                    /* update the led duty cicle */
                    int duty = (potentiometer.read_u16() * 1000)/65535;
                    led_red.pulsewidth_us(1000 - duty);
                }
            break;
            
            case 1:{
                    /* update the led duty cicle */
                    int duty = (potentiometer.read_u16() * 1000)/65535;
                    led_blu.pulsewidth_us(1000 - duty);
                }
            break;
            
            case 2:{
                    /* update the led duty cicle */
                    int duty = (potentiometer.read_u16() * 1000)/65535;
                    led_grn.pulsewidth_us(1000 - duty);
                }
            break;
            }  
        }
               
    }  
}