ftf connect lab1

Dependencies:   PCAL955x ST7567 SoftPWM

Revision:
0:b69f739ab07a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Nov 04 23:59:00 2016 +0000
@@ -0,0 +1,157 @@
+/**
+ *  @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;
+            }  
+        }
+               
+    }  
+}