ftf connect lab1
Dependencies: PCAL955x ST7567 SoftPWM
main.cpp@0:b69f739ab07a, 2016-11-04 (annotated)
- Committer:
- uLipe
- Date:
- Fri Nov 04 23:59:00 2016 +0000
- Revision:
- 0:b69f739ab07a
first working version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uLipe | 0:b69f739ab07a | 1 | /** |
uLipe | 0:b69f739ab07a | 2 | * @brief NXP FTF LAB1 - measure analog input, control LEDS an prints on GLCD |
uLipe | 0:b69f739ab07a | 3 | */ |
uLipe | 0:b69f739ab07a | 4 | |
uLipe | 0:b69f739ab07a | 5 | |
uLipe | 0:b69f739ab07a | 6 | #include "mbed.h" |
uLipe | 0:b69f739ab07a | 7 | #include "ST7567.h" |
uLipe | 0:b69f739ab07a | 8 | #include "AnalogIn.h" |
uLipe | 0:b69f739ab07a | 9 | #include "PwmOut.h" |
uLipe | 0:b69f739ab07a | 10 | #include "PCAL9555.h" |
uLipe | 0:b69f739ab07a | 11 | #include "SoftPWM.h" |
uLipe | 0:b69f739ab07a | 12 | |
uLipe | 0:b69f739ab07a | 13 | /* LCD screen dimensions */ |
uLipe | 0:b69f739ab07a | 14 | #define LCD_HEIGHT 64 |
uLipe | 0:b69f739ab07a | 15 | #define LCD_WIDTH 128 |
uLipe | 0:b69f739ab07a | 16 | |
uLipe | 0:b69f739ab07a | 17 | /* LCD font dimensions */ |
uLipe | 0:b69f739ab07a | 18 | #define FONT_HEIGHT 10 |
uLipe | 0:b69f739ab07a | 19 | #define FONT_WIDTH 5 |
uLipe | 0:b69f739ab07a | 20 | |
uLipe | 0:b69f739ab07a | 21 | /* Joystick keys mask */ |
uLipe | 0:b69f739ab07a | 22 | #define JOY_UP_MASK 0x10 |
uLipe | 0:b69f739ab07a | 23 | #define JOY_DO_MASK 0x01 |
uLipe | 0:b69f739ab07a | 24 | #define JOY_EN_MASK 0x02 |
uLipe | 0:b69f739ab07a | 25 | |
uLipe | 0:b69f739ab07a | 26 | |
uLipe | 0:b69f739ab07a | 27 | /** Instance a on board GLCD object */ |
uLipe | 0:b69f739ab07a | 28 | ST7567 glcd(D11, D13, D12, D9, D10); |
uLipe | 0:b69f739ab07a | 29 | |
uLipe | 0:b69f739ab07a | 30 | /** Instance a Io expander class */ |
uLipe | 0:b69f739ab07a | 31 | PCAL9555 joy_input(SDA, SCL); |
uLipe | 0:b69f739ab07a | 32 | GpioBusIn joy_bus(joy_input,X0_0, X0_1, X0_2, X0_3, X0_4); |
uLipe | 0:b69f739ab07a | 33 | |
uLipe | 0:b69f739ab07a | 34 | |
uLipe | 0:b69f739ab07a | 35 | /** Instance three PWM Objects */ |
uLipe | 0:b69f739ab07a | 36 | SoftPWM led_red(LED1); |
uLipe | 0:b69f739ab07a | 37 | SoftPWM led_grn(LED2); |
uLipe | 0:b69f739ab07a | 38 | SoftPWM led_blu(LED3); |
uLipe | 0:b69f739ab07a | 39 | |
uLipe | 0:b69f739ab07a | 40 | /** Instance a Analog Input */ |
uLipe | 0:b69f739ab07a | 41 | AnalogIn potentiometer(A3); |
uLipe | 0:b69f739ab07a | 42 | |
uLipe | 0:b69f739ab07a | 43 | /* screen messages */ |
uLipe | 0:b69f739ab07a | 44 | const char msg[] = {"Welcome to NXP FTF !\0"}; |
uLipe | 0:b69f739ab07a | 45 | const char led_r_msg[] = {"Led red value:\0"}; |
uLipe | 0:b69f739ab07a | 46 | const char led_b_msg[] = {"Led blu value:\0"}; |
uLipe | 0:b69f739ab07a | 47 | const char led_g_msg[] = {"Led grn value:\0"}; |
uLipe | 0:b69f739ab07a | 48 | |
uLipe | 0:b69f739ab07a | 49 | |
uLipe | 0:b69f739ab07a | 50 | |
uLipe | 0:b69f739ab07a | 51 | /** |
uLipe | 0:b69f739ab07a | 52 | * @brief main application loop |
uLipe | 0:b69f739ab07a | 53 | */ |
uLipe | 0:b69f739ab07a | 54 | int main(void) |
uLipe | 0:b69f739ab07a | 55 | { |
uLipe | 0:b69f739ab07a | 56 | int current_cursor = 0, prev_cursor =0; |
uLipe | 0:b69f739ab07a | 57 | bool enter_pressed = false; |
uLipe | 0:b69f739ab07a | 58 | |
uLipe | 0:b69f739ab07a | 59 | /* setup our on-board glcd */ |
uLipe | 0:b69f739ab07a | 60 | glcd.set_contrast(0x35); |
uLipe | 0:b69f739ab07a | 61 | glcd.cls(); |
uLipe | 0:b69f739ab07a | 62 | |
uLipe | 0:b69f739ab07a | 63 | /* Center the LCD cursor based on message size*/ |
uLipe | 0:b69f739ab07a | 64 | glcd.locate(LCD_WIDTH - (sizeof(msg) * FONT_WIDTH), |
uLipe | 0:b69f739ab07a | 65 | (LCD_HEIGHT - FONT_HEIGHT) / 2); |
uLipe | 0:b69f739ab07a | 66 | |
uLipe | 0:b69f739ab07a | 67 | /* prints a welcome message */ |
uLipe | 0:b69f739ab07a | 68 | glcd.printf(msg); |
uLipe | 0:b69f739ab07a | 69 | Thread::wait(2000); |
uLipe | 0:b69f739ab07a | 70 | glcd.cls(); |
uLipe | 0:b69f739ab07a | 71 | |
uLipe | 0:b69f739ab07a | 72 | /* prints the initial screen */ |
uLipe | 0:b69f739ab07a | 73 | glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 2); |
uLipe | 0:b69f739ab07a | 74 | glcd.printf(led_r_msg); |
uLipe | 0:b69f739ab07a | 75 | glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 3); |
uLipe | 0:b69f739ab07a | 76 | glcd.printf(led_g_msg); |
uLipe | 0:b69f739ab07a | 77 | glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 4); |
uLipe | 0:b69f739ab07a | 78 | glcd.printf(led_b_msg); |
uLipe | 0:b69f739ab07a | 79 | |
uLipe | 0:b69f739ab07a | 80 | |
uLipe | 0:b69f739ab07a | 81 | /* put all pwms to a known value at 1KHz period */ |
uLipe | 0:b69f739ab07a | 82 | |
uLipe | 0:b69f739ab07a | 83 | led_red.period_ms(1); |
uLipe | 0:b69f739ab07a | 84 | led_red.pulsewidth_us(1000); |
uLipe | 0:b69f739ab07a | 85 | led_grn.period_ms(1); |
uLipe | 0:b69f739ab07a | 86 | led_grn.pulsewidth_us(1000); |
uLipe | 0:b69f739ab07a | 87 | led_blu.period_ms(1); |
uLipe | 0:b69f739ab07a | 88 | led_blu.pulsewidth_us(1000); |
uLipe | 0:b69f739ab07a | 89 | |
uLipe | 0:b69f739ab07a | 90 | |
uLipe | 0:b69f739ab07a | 91 | /* run the main loop at 200ms period */ |
uLipe | 0:b69f739ab07a | 92 | for(;;Thread::wait(200)) { |
uLipe | 0:b69f739ab07a | 93 | |
uLipe | 0:b69f739ab07a | 94 | /* read the joystick status */ |
uLipe | 0:b69f739ab07a | 95 | int keys = joy_bus.read(); |
uLipe | 0:b69f739ab07a | 96 | if((keys & JOY_DO_MASK) == 0) { |
uLipe | 0:b69f739ab07a | 97 | /* navigate downward */ |
uLipe | 0:b69f739ab07a | 98 | current_cursor = (current_cursor + 1) % 3; |
uLipe | 0:b69f739ab07a | 99 | } else if ((keys & JOY_UP_MASK) == 0) { |
uLipe | 0:b69f739ab07a | 100 | /* navigate upward */ |
uLipe | 0:b69f739ab07a | 101 | current_cursor--; |
uLipe | 0:b69f739ab07a | 102 | if(current_cursor < 0) current_cursor = 2; |
uLipe | 0:b69f739ab07a | 103 | } else if ((keys & JOY_EN_MASK) == 0) { |
uLipe | 0:b69f739ab07a | 104 | |
uLipe | 0:b69f739ab07a | 105 | /* catch the enter pressed */ |
uLipe | 0:b69f739ab07a | 106 | enter_pressed = true; |
uLipe | 0:b69f739ab07a | 107 | } |
uLipe | 0:b69f739ab07a | 108 | |
uLipe | 0:b69f739ab07a | 109 | if(current_cursor != prev_cursor) { |
uLipe | 0:b69f739ab07a | 110 | /* joystick action ocurred */ |
uLipe | 0:b69f739ab07a | 111 | |
uLipe | 0:b69f739ab07a | 112 | /* erase previous selection */ |
uLipe | 0:b69f739ab07a | 113 | glcd.locate(0, FONT_HEIGHT * (2+prev_cursor)); |
uLipe | 0:b69f739ab07a | 114 | glcd.printf(" "); |
uLipe | 0:b69f739ab07a | 115 | |
uLipe | 0:b69f739ab07a | 116 | /* update for next action */ |
uLipe | 0:b69f739ab07a | 117 | prev_cursor = current_cursor; |
uLipe | 0:b69f739ab07a | 118 | enter_pressed = false; |
uLipe | 0:b69f739ab07a | 119 | } |
uLipe | 0:b69f739ab07a | 120 | |
uLipe | 0:b69f739ab07a | 121 | |
uLipe | 0:b69f739ab07a | 122 | /* move the arrow between options */ |
uLipe | 0:b69f739ab07a | 123 | glcd.locate(0, FONT_HEIGHT * (2+current_cursor)); |
uLipe | 0:b69f739ab07a | 124 | glcd.printf("->"); |
uLipe | 0:b69f739ab07a | 125 | |
uLipe | 0:b69f739ab07a | 126 | if(enter_pressed != false) { |
uLipe | 0:b69f739ab07a | 127 | /* enter pressed, allow editing the field */ |
uLipe | 0:b69f739ab07a | 128 | glcd.locate((sizeof(led_r_msg) + 3) * FONT_WIDTH, |
uLipe | 0:b69f739ab07a | 129 | FONT_HEIGHT * (2+current_cursor)); |
uLipe | 0:b69f739ab07a | 130 | glcd.printf("%5d", potentiometer.read_u16()); |
uLipe | 0:b69f739ab07a | 131 | |
uLipe | 0:b69f739ab07a | 132 | switch(current_cursor) { |
uLipe | 0:b69f739ab07a | 133 | case 0:{ |
uLipe | 0:b69f739ab07a | 134 | /* update the led duty cicle */ |
uLipe | 0:b69f739ab07a | 135 | int duty = (potentiometer.read_u16() * 1000)/65535; |
uLipe | 0:b69f739ab07a | 136 | led_red.pulsewidth_us(1000 - duty); |
uLipe | 0:b69f739ab07a | 137 | } |
uLipe | 0:b69f739ab07a | 138 | break; |
uLipe | 0:b69f739ab07a | 139 | |
uLipe | 0:b69f739ab07a | 140 | case 1:{ |
uLipe | 0:b69f739ab07a | 141 | /* update the led duty cicle */ |
uLipe | 0:b69f739ab07a | 142 | int duty = (potentiometer.read_u16() * 1000)/65535; |
uLipe | 0:b69f739ab07a | 143 | led_blu.pulsewidth_us(1000 - duty); |
uLipe | 0:b69f739ab07a | 144 | } |
uLipe | 0:b69f739ab07a | 145 | break; |
uLipe | 0:b69f739ab07a | 146 | |
uLipe | 0:b69f739ab07a | 147 | case 2:{ |
uLipe | 0:b69f739ab07a | 148 | /* update the led duty cicle */ |
uLipe | 0:b69f739ab07a | 149 | int duty = (potentiometer.read_u16() * 1000)/65535; |
uLipe | 0:b69f739ab07a | 150 | led_grn.pulsewidth_us(1000 - duty); |
uLipe | 0:b69f739ab07a | 151 | } |
uLipe | 0:b69f739ab07a | 152 | break; |
uLipe | 0:b69f739ab07a | 153 | } |
uLipe | 0:b69f739ab07a | 154 | } |
uLipe | 0:b69f739ab07a | 155 | |
uLipe | 0:b69f739ab07a | 156 | } |
uLipe | 0:b69f739ab07a | 157 | } |