Production Test Program (PTP) for the LPC4088 Experiment Base Board
Dependencies: EALib I2S LM75B SDFileSystem mbed
main.cpp@1:47680ec5d783, 2014-08-27 (annotated)
- Committer:
- embeddedartists
- Date:
- Wed Aug 27 14:24:59 2014 +0000
- Revision:
- 1:47680ec5d783
- Parent:
- 0:0d5190d379d3
- Child:
- 2:2f4b7535ceb3
Got the display and touch to work. Only audio tests missing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
embeddedartists | 0:0d5190d379d3 | 1 | /****************************************************************************** |
embeddedartists | 0:0d5190d379d3 | 2 | * Includes |
embeddedartists | 0:0d5190d379d3 | 3 | *****************************************************************************/ |
embeddedartists | 0:0d5190d379d3 | 4 | #include "mbed.h" |
embeddedartists | 0:0d5190d379d3 | 5 | |
embeddedartists | 0:0d5190d379d3 | 6 | #include "MCIFileSystem.h" |
embeddedartists | 0:0d5190d379d3 | 7 | #include "SDFileSystem.h" |
embeddedartists | 0:0d5190d379d3 | 8 | #include "LM75B.h" |
embeddedartists | 0:0d5190d379d3 | 9 | #include "MMA7455.h" |
embeddedartists | 0:0d5190d379d3 | 10 | #include "WM8731.h" |
embeddedartists | 0:0d5190d379d3 | 11 | #include "TextLCD.h" |
embeddedartists | 0:0d5190d379d3 | 12 | #include "DmTftHX8353C.h" |
embeddedartists | 0:0d5190d379d3 | 13 | #include "BubbleDemo.h" |
embeddedartists | 1:47680ec5d783 | 14 | #include "AR1021I2C.h" |
embeddedartists | 1:47680ec5d783 | 15 | #include "Graphics.h" |
embeddedartists | 1:47680ec5d783 | 16 | |
embeddedartists | 1:47680ec5d783 | 17 | #include "LcdController.h" |
embeddedartists | 1:47680ec5d783 | 18 | #include "EaLcdBoardGPIO.h" |
embeddedartists | 1:47680ec5d783 | 19 | #include "sdram.h" |
embeddedartists | 0:0d5190d379d3 | 20 | |
embeddedartists | 0:0d5190d379d3 | 21 | /****************************************************************************** |
embeddedartists | 0:0d5190d379d3 | 22 | * Typedefs and defines |
embeddedartists | 0:0d5190d379d3 | 23 | *****************************************************************************/ |
embeddedartists | 0:0d5190d379d3 | 24 | |
embeddedartists | 1:47680ec5d783 | 25 | #define ACC_XMIN (1<<0) |
embeddedartists | 1:47680ec5d783 | 26 | #define ACC_XMAX (1<<1) |
embeddedartists | 1:47680ec5d783 | 27 | #define ACC_YMIN (1<<2) |
embeddedartists | 1:47680ec5d783 | 28 | #define ACC_YMAX (1<<3) |
embeddedartists | 1:47680ec5d783 | 29 | #define ACC_ZMIN (1<<4) |
embeddedartists | 1:47680ec5d783 | 30 | #define ACC_ZMAX (1<<5) |
embeddedartists | 1:47680ec5d783 | 31 | |
embeddedartists | 1:47680ec5d783 | 32 | #define ACC_MIN_LIMIT (-50) |
embeddedartists | 1:47680ec5d783 | 33 | #define ACC_MAX_LIMIT ( 50) |
embeddedartists | 1:47680ec5d783 | 34 | |
embeddedartists | 0:0d5190d379d3 | 35 | #define BUTTON_PRESSED 0 |
embeddedartists | 0:0d5190d379d3 | 36 | #define BUTTON_RELEASED 1 |
embeddedartists | 0:0d5190d379d3 | 37 | |
embeddedartists | 0:0d5190d379d3 | 38 | #define LED_ON 0 |
embeddedartists | 0:0d5190d379d3 | 39 | #define LED_OFF 1 |
embeddedartists | 0:0d5190d379d3 | 40 | |
embeddedartists | 1:47680ec5d783 | 41 | #if 0 |
embeddedartists | 1:47680ec5d783 | 42 | // Enters eternal loop |
embeddedartists | 1:47680ec5d783 | 43 | #define handleError(__a, __b) do { \ |
embeddedartists | 1:47680ec5d783 | 44 | printf("Error " #__a ": %s\n", (__b)); \ |
embeddedartists | 1:47680ec5d783 | 45 | resetLEDs(); \ |
embeddedartists | 1:47680ec5d783 | 46 | ledRed = LED_ON; \ |
embeddedartists | 1:47680ec5d783 | 47 | ledGreen = LED_OFF; \ |
embeddedartists | 1:47680ec5d783 | 48 | ledBlue = LED_OFF; \ |
embeddedartists | 1:47680ec5d783 | 49 | mbed_die(); \ |
embeddedartists | 1:47680ec5d783 | 50 | } while(0) |
embeddedartists | 1:47680ec5d783 | 51 | |
embeddedartists | 1:47680ec5d783 | 52 | #define showTestResult() do {} while(0) // Never used in this setup |
embeddedartists | 1:47680ec5d783 | 53 | #else |
embeddedartists | 1:47680ec5d783 | 54 | bool allTestsPassed = true; |
embeddedartists | 1:47680ec5d783 | 55 | // Leaves error handling to the end of the program |
embeddedartists | 1:47680ec5d783 | 56 | #define handleError(__a, __b) do { \ |
embeddedartists | 1:47680ec5d783 | 57 | printf("Error " #__a ": %s\n", (__b)); \ |
embeddedartists | 1:47680ec5d783 | 58 | resetLEDs(); \ |
embeddedartists | 1:47680ec5d783 | 59 | *ledRed = LED_ON; \ |
embeddedartists | 1:47680ec5d783 | 60 | *ledGreen = LED_OFF; \ |
embeddedartists | 1:47680ec5d783 | 61 | *ledBlue = LED_OFF; \ |
embeddedartists | 1:47680ec5d783 | 62 | allTestsPassed = false; \ |
embeddedartists | 1:47680ec5d783 | 63 | return; \ |
embeddedartists | 1:47680ec5d783 | 64 | } while(0) |
embeddedartists | 1:47680ec5d783 | 65 | |
embeddedartists | 1:47680ec5d783 | 66 | #define showTestResult() do { \ |
embeddedartists | 1:47680ec5d783 | 67 | resetLEDs(); \ |
embeddedartists | 1:47680ec5d783 | 68 | *ledRed = LED_OFF; \ |
embeddedartists | 1:47680ec5d783 | 69 | *ledGreen = LED_OFF; \ |
embeddedartists | 1:47680ec5d783 | 70 | *ledBlue = LED_OFF; \ |
embeddedartists | 1:47680ec5d783 | 71 | if (allTestsPassed) { \ |
embeddedartists | 1:47680ec5d783 | 72 | printf("\n\nTest Result: PASSED\n\n"); \ |
embeddedartists | 1:47680ec5d783 | 73 | *ledGreen = LED_ON; \ |
embeddedartists | 1:47680ec5d783 | 74 | } else { \ |
embeddedartists | 1:47680ec5d783 | 75 | printf("\n\nTest Result: FAILED\n\n"); \ |
embeddedartists | 1:47680ec5d783 | 76 | *ledRed = LED_ON; \ |
embeddedartists | 1:47680ec5d783 | 77 | } \ |
embeddedartists | 1:47680ec5d783 | 78 | } while(0) |
embeddedartists | 1:47680ec5d783 | 79 | #endif |
embeddedartists | 0:0d5190d379d3 | 80 | |
embeddedartists | 0:0d5190d379d3 | 81 | #define waitForButtonClick() do {while(button.read() == BUTTON_RELEASED); while(button.read() == BUTTON_PRESSED);} while(false) |
embeddedartists | 0:0d5190d379d3 | 82 | |
embeddedartists | 0:0d5190d379d3 | 83 | /****************************************************************************** |
embeddedartists | 0:0d5190d379d3 | 84 | * Local variables |
embeddedartists | 0:0d5190d379d3 | 85 | *****************************************************************************/ |
embeddedartists | 0:0d5190d379d3 | 86 | |
embeddedartists | 0:0d5190d379d3 | 87 | DigitalOut myled(LED1); |
embeddedartists | 0:0d5190d379d3 | 88 | DigitalIn button(p23); |
embeddedartists | 0:0d5190d379d3 | 89 | |
embeddedartists | 0:0d5190d379d3 | 90 | SPI shiftreg(p5, p6, p7); // mosi, miso, sclk, |
embeddedartists | 0:0d5190d379d3 | 91 | DigitalOut shiftregCS(p30); |
embeddedartists | 0:0d5190d379d3 | 92 | |
embeddedartists | 1:47680ec5d783 | 93 | DigitalOut* ledRed = NULL; |
embeddedartists | 1:47680ec5d783 | 94 | DigitalOut* ledGreen = NULL; |
embeddedartists | 1:47680ec5d783 | 95 | DigitalOut* ledBlue = NULL; |
embeddedartists | 0:0d5190d379d3 | 96 | |
embeddedartists | 0:0d5190d379d3 | 97 | /****************************************************************************** |
embeddedartists | 0:0d5190d379d3 | 98 | * Local functions |
embeddedartists | 0:0d5190d379d3 | 99 | *****************************************************************************/ |
embeddedartists | 0:0d5190d379d3 | 100 | |
embeddedartists | 1:47680ec5d783 | 101 | static void resetLEDs() |
embeddedartists | 1:47680ec5d783 | 102 | { |
embeddedartists | 1:47680ec5d783 | 103 | // Some peripherals may interfer with the RGB LED and as a result it |
embeddedartists | 1:47680ec5d783 | 104 | // may be needed to reinitialize them so that PIN is again an GPIO. |
embeddedartists | 1:47680ec5d783 | 105 | if (ledRed != NULL) { |
embeddedartists | 1:47680ec5d783 | 106 | delete ledRed; |
embeddedartists | 1:47680ec5d783 | 107 | } |
embeddedartists | 1:47680ec5d783 | 108 | if (ledGreen != NULL) { |
embeddedartists | 1:47680ec5d783 | 109 | delete ledGreen; |
embeddedartists | 1:47680ec5d783 | 110 | } |
embeddedartists | 1:47680ec5d783 | 111 | if (ledBlue != NULL) { |
embeddedartists | 1:47680ec5d783 | 112 | delete ledBlue; |
embeddedartists | 1:47680ec5d783 | 113 | } |
embeddedartists | 1:47680ec5d783 | 114 | ledRed = new DigitalOut(p25); |
embeddedartists | 1:47680ec5d783 | 115 | ledGreen = new DigitalOut(p28); |
embeddedartists | 1:47680ec5d783 | 116 | ledBlue = new DigitalOut(p26); |
embeddedartists | 1:47680ec5d783 | 117 | |
embeddedartists | 1:47680ec5d783 | 118 | *ledRed = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 119 | *ledGreen = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 120 | *ledBlue = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 121 | } |
embeddedartists | 1:47680ec5d783 | 122 | |
embeddedartists | 0:0d5190d379d3 | 123 | static void test_micro_sd_card_mci() |
embeddedartists | 0:0d5190d379d3 | 124 | { |
embeddedartists | 1:47680ec5d783 | 125 | // The LPC4088 Experiment Base Board does not have the CardDetect signal |
embeddedartists | 1:47680ec5d783 | 126 | // available so it must be set to NC here to work. |
embeddedartists | 1:47680ec5d783 | 127 | MCIFileSystem mcifs("mci", NC); |
embeddedartists | 0:0d5190d379d3 | 128 | FILE* fp = fopen("/mci/message.txt", "r"); |
embeddedartists | 0:0d5190d379d3 | 129 | if (fp != NULL) { |
embeddedartists | 0:0d5190d379d3 | 130 | char buf[20]; |
embeddedartists | 0:0d5190d379d3 | 131 | int num = fread(buf, 1, sizeof(buf), fp); |
embeddedartists | 0:0d5190d379d3 | 132 | if (num >= 10) { |
embeddedartists | 0:0d5190d379d3 | 133 | buf[10] = '\0'; |
embeddedartists | 0:0d5190d379d3 | 134 | if (strcmp(buf, "eatest2014") == 0) { |
embeddedartists | 0:0d5190d379d3 | 135 | printf("MCI SD Card works!\n"); |
embeddedartists | 0:0d5190d379d3 | 136 | fclose(fp); |
embeddedartists | 0:0d5190d379d3 | 137 | return; |
embeddedartists | 0:0d5190d379d3 | 138 | } |
embeddedartists | 0:0d5190d379d3 | 139 | handleError(STATE_ERR_MCIFS, "Invalid data read from /mci/message.txt\n"); |
embeddedartists | 0:0d5190d379d3 | 140 | } |
embeddedartists | 0:0d5190d379d3 | 141 | handleError(STATE_ERR_MCIFS, "Failed to read >= 10 bytes from /mci/message.txt\n"); |
embeddedartists | 0:0d5190d379d3 | 142 | } |
embeddedartists | 0:0d5190d379d3 | 143 | handleError(STATE_ERR_MCIFS, "Failed to open /mci/message.txt\n"); |
embeddedartists | 0:0d5190d379d3 | 144 | } |
embeddedartists | 0:0d5190d379d3 | 145 | |
embeddedartists | 0:0d5190d379d3 | 146 | static void test_micro_sd_card_spi() |
embeddedartists | 0:0d5190d379d3 | 147 | { |
embeddedartists | 1:47680ec5d783 | 148 | SDFileSystem spifs(p5, p6, p7, p8, "spi"); // mosi, miso, sclk, cs |
embeddedartists | 0:0d5190d379d3 | 149 | FILE* fp = fopen("/spi/message.txt", "r"); |
embeddedartists | 0:0d5190d379d3 | 150 | if (fp != NULL) { |
embeddedartists | 0:0d5190d379d3 | 151 | char buf[20]; |
embeddedartists | 0:0d5190d379d3 | 152 | int num = fread(buf, 1, sizeof(buf), fp); |
embeddedartists | 0:0d5190d379d3 | 153 | if (num >= 10) { |
embeddedartists | 0:0d5190d379d3 | 154 | buf[10] = '\0'; |
embeddedartists | 0:0d5190d379d3 | 155 | if (strcmp(buf, "eatest2014") == 0) { |
embeddedartists | 0:0d5190d379d3 | 156 | printf("SPI SD Card works!\n"); |
embeddedartists | 0:0d5190d379d3 | 157 | fclose(fp); |
embeddedartists | 0:0d5190d379d3 | 158 | return; |
embeddedartists | 0:0d5190d379d3 | 159 | } |
embeddedartists | 0:0d5190d379d3 | 160 | handleError(STATE_ERR_SPIFS, "Invalid data read from /spi/message.txt\n"); |
embeddedartists | 0:0d5190d379d3 | 161 | } |
embeddedartists | 0:0d5190d379d3 | 162 | handleError(STATE_ERR_SPIFS, "Failed to read >= 10 bytes from /spi/message.txt\n"); |
embeddedartists | 0:0d5190d379d3 | 163 | } |
embeddedartists | 0:0d5190d379d3 | 164 | handleError(STATE_ERR_SPIFS, "Failed to open /spi/message.txt\n"); |
embeddedartists | 0:0d5190d379d3 | 165 | } |
embeddedartists | 0:0d5190d379d3 | 166 | |
embeddedartists | 0:0d5190d379d3 | 167 | static void test_acc() |
embeddedartists | 0:0d5190d379d3 | 168 | { |
embeddedartists | 1:47680ec5d783 | 169 | #if 1 |
embeddedartists | 1:47680ec5d783 | 170 | MMA7455 sensor(P0_27, P0_28); |
embeddedartists | 1:47680ec5d783 | 171 | |
embeddedartists | 1:47680ec5d783 | 172 | //Try to initialize the accelerometer |
embeddedartists | 1:47680ec5d783 | 173 | if (!sensor.setMode(MMA7455::ModeMeasurement)) { |
embeddedartists | 1:47680ec5d783 | 174 | handleError(STATE_ERR_ACC, "Unable to set mode for MMA7455!\n"); |
embeddedartists | 1:47680ec5d783 | 175 | } |
embeddedartists | 1:47680ec5d783 | 176 | |
embeddedartists | 1:47680ec5d783 | 177 | if (!sensor.calibrate()) { |
embeddedartists | 1:47680ec5d783 | 178 | handleError(STATE_ERR_ACC, "Failed to calibrate MMA7455!\n"); |
embeddedartists | 1:47680ec5d783 | 179 | } |
embeddedartists | 1:47680ec5d783 | 180 | |
embeddedartists | 1:47680ec5d783 | 181 | int val[3] = { 0, 0, 0}; |
embeddedartists | 1:47680ec5d783 | 182 | int max[3] = {-1000,-1000,-1000}; |
embeddedartists | 1:47680ec5d783 | 183 | int min[3] = { 1000, 1000, 1000}; |
embeddedartists | 1:47680ec5d783 | 184 | int i; |
embeddedartists | 1:47680ec5d783 | 185 | Timer t; |
embeddedartists | 1:47680ec5d783 | 186 | t.start(); |
embeddedartists | 1:47680ec5d783 | 187 | while (t.read() < 5) { |
embeddedartists | 1:47680ec5d783 | 188 | if (!sensor.read(val[0], val[1], val[2])) { |
embeddedartists | 1:47680ec5d783 | 189 | handleError(STATE_ERR_ACC, "Failed to read accelerometer data!\n"); |
embeddedartists | 1:47680ec5d783 | 190 | } |
embeddedartists | 1:47680ec5d783 | 191 | printf("ACC: x,y,z = {%5d, %5d, %5d}\n", val[0], val[1], val[2]); |
embeddedartists | 1:47680ec5d783 | 192 | for (i = 0; i < 3; i++) { |
embeddedartists | 1:47680ec5d783 | 193 | if (val[i] < min[i]) { |
embeddedartists | 1:47680ec5d783 | 194 | min[i] = val[i]; |
embeddedartists | 1:47680ec5d783 | 195 | } |
embeddedartists | 1:47680ec5d783 | 196 | if (val[i] > max[i]) { |
embeddedartists | 1:47680ec5d783 | 197 | max[i] = val[i]; |
embeddedartists | 1:47680ec5d783 | 198 | } |
embeddedartists | 1:47680ec5d783 | 199 | } |
embeddedartists | 1:47680ec5d783 | 200 | for (i = 0; i < 3; i++) { |
embeddedartists | 1:47680ec5d783 | 201 | if ((max[i] - min[i]) < 2) { |
embeddedartists | 1:47680ec5d783 | 202 | break; |
embeddedartists | 1:47680ec5d783 | 203 | } |
embeddedartists | 1:47680ec5d783 | 204 | if (i == 2) { |
embeddedartists | 1:47680ec5d783 | 205 | printf("All three axis work\n"); |
embeddedartists | 1:47680ec5d783 | 206 | return; |
embeddedartists | 1:47680ec5d783 | 207 | } |
embeddedartists | 1:47680ec5d783 | 208 | } |
embeddedartists | 1:47680ec5d783 | 209 | wait(0.1); |
embeddedartists | 1:47680ec5d783 | 210 | } |
embeddedartists | 1:47680ec5d783 | 211 | printf("Not enough variation X {%d..%d}, Y {%d..%d}, Z {%d..%d}!\n", |
embeddedartists | 1:47680ec5d783 | 212 | min[0], max[0], min[1], max[1], min[2], max[2]); |
embeddedartists | 1:47680ec5d783 | 213 | handleError(STATE_ERR_ACC, "Accelerometer data invalid\n"); |
embeddedartists | 1:47680ec5d783 | 214 | #else |
embeddedartists | 0:0d5190d379d3 | 215 | MMA7455 sensor(P0_27, P0_28); |
embeddedartists | 0:0d5190d379d3 | 216 | |
embeddedartists | 0:0d5190d379d3 | 217 | //Try to initialize the accelerometer |
embeddedartists | 0:0d5190d379d3 | 218 | if (!sensor.setMode(MMA7455::ModeMeasurement)) { |
embeddedartists | 0:0d5190d379d3 | 219 | handleError(STATE_ERR_ACC, "Unable to set mode for MMA7455!\n"); |
embeddedartists | 0:0d5190d379d3 | 220 | } |
embeddedartists | 0:0d5190d379d3 | 221 | |
embeddedartists | 0:0d5190d379d3 | 222 | printf("Put on flat surface and press button to calibrate!\n"); |
embeddedartists | 0:0d5190d379d3 | 223 | while (button.read() != BUTTON_PRESSED) {} |
embeddedartists | 0:0d5190d379d3 | 224 | while (button.read() == BUTTON_PRESSED) {} |
embeddedartists | 0:0d5190d379d3 | 225 | |
embeddedartists | 0:0d5190d379d3 | 226 | if (!sensor.calibrate()) { |
embeddedartists | 0:0d5190d379d3 | 227 | handleError(STATE_ERR_ACC, "Failed to calibrate MMA7455!\n"); |
embeddedartists | 0:0d5190d379d3 | 228 | } |
embeddedartists | 0:0d5190d379d3 | 229 | |
embeddedartists | 1:47680ec5d783 | 230 | printf("Now tilt the board in all directions (max 10 seconds)...\n"); |
embeddedartists | 0:0d5190d379d3 | 231 | int x=0, y=0, z=0; |
embeddedartists | 1:47680ec5d783 | 232 | uint8_t done = 0; |
embeddedartists | 1:47680ec5d783 | 233 | char msg[30] = {0}; |
embeddedartists | 0:0d5190d379d3 | 234 | |
embeddedartists | 0:0d5190d379d3 | 235 | Timer t; |
embeddedartists | 0:0d5190d379d3 | 236 | t.start(); |
embeddedartists | 1:47680ec5d783 | 237 | while ((t.read() < 10) && (done != 0x3f)) { |
embeddedartists | 0:0d5190d379d3 | 238 | if (!sensor.read(x, y, z)) { |
embeddedartists | 0:0d5190d379d3 | 239 | handleError(STATE_ERR_ACC, "Failed to read accelerometer data!\n"); |
embeddedartists | 0:0d5190d379d3 | 240 | } |
embeddedartists | 1:47680ec5d783 | 241 | printf("ACC: x,y,z = {%5d, %5d, %5d} %s\n", x, y, z, msg); |
embeddedartists | 1:47680ec5d783 | 242 | if ((x < ACC_MIN_LIMIT) && !(done & ACC_XMIN)) { |
embeddedartists | 1:47680ec5d783 | 243 | done |= ACC_XMIN; |
embeddedartists | 1:47680ec5d783 | 244 | printf("Tilted XMIN\n"); |
embeddedartists | 1:47680ec5d783 | 245 | } else if ((x > ACC_MAX_LIMIT) && !(done & ACC_XMAX)) { |
embeddedartists | 1:47680ec5d783 | 246 | done |= ACC_XMAX; |
embeddedartists | 1:47680ec5d783 | 247 | printf("Tilted XMAX\n"); |
embeddedartists | 1:47680ec5d783 | 248 | } |
embeddedartists | 1:47680ec5d783 | 249 | if ((y < ACC_MIN_LIMIT) && !(done & ACC_YMIN)) { |
embeddedartists | 1:47680ec5d783 | 250 | done |= ACC_YMIN; |
embeddedartists | 1:47680ec5d783 | 251 | printf("Tilted YMIN\n"); |
embeddedartists | 1:47680ec5d783 | 252 | } else if ((y > ACC_MAX_LIMIT) && !(done & ACC_YMAX)) { |
embeddedartists | 1:47680ec5d783 | 253 | done |= ACC_YMAX; |
embeddedartists | 1:47680ec5d783 | 254 | printf("Tilted XMAX\n"); |
embeddedartists | 1:47680ec5d783 | 255 | } |
embeddedartists | 1:47680ec5d783 | 256 | if ((z < ACC_MIN_LIMIT) && !(done & ACC_ZMIN)) { |
embeddedartists | 1:47680ec5d783 | 257 | done |= ACC_ZMIN; |
embeddedartists | 1:47680ec5d783 | 258 | printf("Tilted ZMIN\n"); |
embeddedartists | 1:47680ec5d783 | 259 | } else if ((z > ACC_MAX_LIMIT) && !(done & ACC_ZMAX)) { |
embeddedartists | 1:47680ec5d783 | 260 | done |= ACC_ZMAX; |
embeddedartists | 1:47680ec5d783 | 261 | printf("Tilted ZMAX\n"); |
embeddedartists | 1:47680ec5d783 | 262 | } |
embeddedartists | 1:47680ec5d783 | 263 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 264 | } |
embeddedartists | 0:0d5190d379d3 | 265 | printf("Done with ACC tests!\n"); |
embeddedartists | 1:47680ec5d783 | 266 | #endif |
embeddedartists | 0:0d5190d379d3 | 267 | } |
embeddedartists | 0:0d5190d379d3 | 268 | |
embeddedartists | 0:0d5190d379d3 | 269 | static void test_lm75() |
embeddedartists | 0:0d5190d379d3 | 270 | { |
embeddedartists | 0:0d5190d379d3 | 271 | //Create an LM75B object at 0x92/0x93 (ADDRESS_1) |
embeddedartists | 0:0d5190d379d3 | 272 | LM75B sensor(P0_27, P0_28, LM75B::ADDRESS_1); |
embeddedartists | 1:47680ec5d783 | 273 | |
embeddedartists | 1:47680ec5d783 | 274 | printf("Testing LM75 temperature sensor...\n"); |
embeddedartists | 1:47680ec5d783 | 275 | |
embeddedartists | 0:0d5190d379d3 | 276 | //Try to open the LM75B |
embeddedartists | 0:0d5190d379d3 | 277 | if (sensor.open()) { |
embeddedartists | 0:0d5190d379d3 | 278 | printf("LM75 Device detected!\n"); |
embeddedartists | 0:0d5190d379d3 | 279 | |
embeddedartists | 0:0d5190d379d3 | 280 | int i = 10; |
embeddedartists | 0:0d5190d379d3 | 281 | while (i--) { |
embeddedartists | 1:47680ec5d783 | 282 | float f = (float)sensor; |
embeddedartists | 0:0d5190d379d3 | 283 | //Print the current temperature |
embeddedartists | 1:47680ec5d783 | 284 | printf("Temp = %.3f\n", f); |
embeddedartists | 0:0d5190d379d3 | 285 | |
embeddedartists | 1:47680ec5d783 | 286 | if ((f >= 15) && (f <= 45)) { |
embeddedartists | 1:47680ec5d783 | 287 | printf("Temp in 15..45 range - test passed\n"); |
embeddedartists | 1:47680ec5d783 | 288 | break; |
embeddedartists | 1:47680ec5d783 | 289 | } |
embeddedartists | 1:47680ec5d783 | 290 | |
embeddedartists | 0:0d5190d379d3 | 291 | //Sleep for 0.5 seconds |
embeddedartists | 0:0d5190d379d3 | 292 | wait(0.5); |
embeddedartists | 0:0d5190d379d3 | 293 | } |
embeddedartists | 1:47680ec5d783 | 294 | if (i == 0) { |
embeddedartists | 1:47680ec5d783 | 295 | handleError(STATE_ERR_LM75, "LM75 No temp in range 15..45!\n"); |
embeddedartists | 1:47680ec5d783 | 296 | } |
embeddedartists | 0:0d5190d379d3 | 297 | } else { |
embeddedartists | 0:0d5190d379d3 | 298 | handleError(STATE_ERR_LM75, "LM75 Device not detected!\n"); |
embeddedartists | 0:0d5190d379d3 | 299 | } |
embeddedartists | 0:0d5190d379d3 | 300 | } |
embeddedartists | 0:0d5190d379d3 | 301 | |
embeddedartists | 0:0d5190d379d3 | 302 | static void test_trimpot() |
embeddedartists | 0:0d5190d379d3 | 303 | { |
embeddedartists | 0:0d5190d379d3 | 304 | AnalogIn trimpot(p15); |
embeddedartists | 1:47680ec5d783 | 305 | bool min = false; |
embeddedartists | 1:47680ec5d783 | 306 | bool max = false; |
embeddedartists | 0:0d5190d379d3 | 307 | |
embeddedartists | 0:0d5190d379d3 | 308 | printf("Reading trimpot for 5 seconds...\n"); |
embeddedartists | 0:0d5190d379d3 | 309 | |
embeddedartists | 0:0d5190d379d3 | 310 | for (int i = 0; i < 50; i++) { |
embeddedartists | 1:47680ec5d783 | 311 | float f = trimpot.read(); |
embeddedartists | 1:47680ec5d783 | 312 | printf("Trimpot = %.3f\n", f); |
embeddedartists | 1:47680ec5d783 | 313 | if (f < 0.01f) { |
embeddedartists | 1:47680ec5d783 | 314 | min = true; |
embeddedartists | 1:47680ec5d783 | 315 | } else if (f > 0.99f) { |
embeddedartists | 1:47680ec5d783 | 316 | max = true; |
embeddedartists | 1:47680ec5d783 | 317 | } |
embeddedartists | 1:47680ec5d783 | 318 | if (min && max) { |
embeddedartists | 1:47680ec5d783 | 319 | printf("Test passed\n"); |
embeddedartists | 1:47680ec5d783 | 320 | return; |
embeddedartists | 1:47680ec5d783 | 321 | } |
embeddedartists | 1:47680ec5d783 | 322 | |
embeddedartists | 0:0d5190d379d3 | 323 | wait(0.1); |
embeddedartists | 1:47680ec5d783 | 324 | } |
embeddedartists | 1:47680ec5d783 | 325 | handleError(STATE_ERR_TRIMPOT, "Trimpot does not reach limits (0.01 - 0.99)!\n"); |
embeddedartists | 0:0d5190d379d3 | 326 | } |
embeddedartists | 0:0d5190d379d3 | 327 | |
embeddedartists | 0:0d5190d379d3 | 328 | static void outputShiftReg(uint8_t val) |
embeddedartists | 0:0d5190d379d3 | 329 | { |
embeddedartists | 0:0d5190d379d3 | 330 | shiftregCS = 0; |
embeddedartists | 0:0d5190d379d3 | 331 | shiftreg.write(val); |
embeddedartists | 0:0d5190d379d3 | 332 | shiftregCS = 1; |
embeddedartists | 0:0d5190d379d3 | 333 | } |
embeddedartists | 0:0d5190d379d3 | 334 | static void test_shiftreg() |
embeddedartists | 0:0d5190d379d3 | 335 | { |
embeddedartists | 0:0d5190d379d3 | 336 | outputShiftReg(0x1); |
embeddedartists | 0:0d5190d379d3 | 337 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 338 | outputShiftReg(0x2); |
embeddedartists | 0:0d5190d379d3 | 339 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 340 | outputShiftReg(0x4); |
embeddedartists | 0:0d5190d379d3 | 341 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 342 | outputShiftReg(0x8); |
embeddedartists | 0:0d5190d379d3 | 343 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 344 | outputShiftReg(0x10); |
embeddedartists | 0:0d5190d379d3 | 345 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 346 | outputShiftReg(0x20); |
embeddedartists | 0:0d5190d379d3 | 347 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 348 | outputShiftReg(0x40); |
embeddedartists | 0:0d5190d379d3 | 349 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 350 | outputShiftReg(0x80); |
embeddedartists | 0:0d5190d379d3 | 351 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 352 | outputShiftReg(0x40); |
embeddedartists | 0:0d5190d379d3 | 353 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 354 | outputShiftReg(0x20); |
embeddedartists | 0:0d5190d379d3 | 355 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 356 | outputShiftReg(0x10); |
embeddedartists | 0:0d5190d379d3 | 357 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 358 | outputShiftReg(0x8); |
embeddedartists | 0:0d5190d379d3 | 359 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 360 | outputShiftReg(0x4); |
embeddedartists | 0:0d5190d379d3 | 361 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 362 | outputShiftReg(0x2); |
embeddedartists | 0:0d5190d379d3 | 363 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 364 | outputShiftReg(0x1); |
embeddedartists | 0:0d5190d379d3 | 365 | wait(0.1); |
embeddedartists | 0:0d5190d379d3 | 366 | outputShiftReg(0x0); |
embeddedartists | 0:0d5190d379d3 | 367 | } |
embeddedartists | 0:0d5190d379d3 | 368 | |
embeddedartists | 0:0d5190d379d3 | 369 | |
embeddedartists | 0:0d5190d379d3 | 370 | static void test_joystick() |
embeddedartists | 0:0d5190d379d3 | 371 | { |
embeddedartists | 0:0d5190d379d3 | 372 | DigitalIn up(p32);//p39); |
embeddedartists | 0:0d5190d379d3 | 373 | DigitalIn down(p38);//p32); |
embeddedartists | 0:0d5190d379d3 | 374 | DigitalIn left(p39);//p38); |
embeddedartists | 0:0d5190d379d3 | 375 | DigitalIn right(p37); |
embeddedartists | 0:0d5190d379d3 | 376 | DigitalIn center(p31); |
embeddedartists | 0:0d5190d379d3 | 377 | |
embeddedartists | 0:0d5190d379d3 | 378 | printf("Reading joystick for 10 seconds or all directions...\n"); |
embeddedartists | 0:0d5190d379d3 | 379 | uint16_t mask = 0; |
embeddedartists | 0:0d5190d379d3 | 380 | |
embeddedartists | 0:0d5190d379d3 | 381 | for (int i = 0; i < 100; i++) { |
embeddedartists | 0:0d5190d379d3 | 382 | bool line = false; |
embeddedartists | 0:0d5190d379d3 | 383 | if (up.read() == 0) { printf("UP "); line = true; mask |= 0x01; } |
embeddedartists | 0:0d5190d379d3 | 384 | if (down.read() == 0) { printf("DOWN "); line = true; mask |= 0x02; } |
embeddedartists | 0:0d5190d379d3 | 385 | if (left.read() == 0) { printf("LEFT "); line = true; mask |= 0x04; } |
embeddedartists | 0:0d5190d379d3 | 386 | if (right.read() == 0) { printf("RIGHT "); line = true; mask |= 0x08; } |
embeddedartists | 0:0d5190d379d3 | 387 | if (center.read() == 0) { printf("CENTER ");line = true; mask |= 0x10; } |
embeddedartists | 0:0d5190d379d3 | 388 | if (line) { |
embeddedartists | 0:0d5190d379d3 | 389 | printf("\n"); |
embeddedartists | 0:0d5190d379d3 | 390 | } |
embeddedartists | 0:0d5190d379d3 | 391 | if (mask == 0x1F) { |
embeddedartists | 0:0d5190d379d3 | 392 | printf("All directions tested. Done!\n"); |
embeddedartists | 1:47680ec5d783 | 393 | return; |
embeddedartists | 0:0d5190d379d3 | 394 | } |
embeddedartists | 0:0d5190d379d3 | 395 | wait(0.1); |
embeddedartists | 1:47680ec5d783 | 396 | if (i%10 == 0) { |
embeddedartists | 1:47680ec5d783 | 397 | printf("%ds\n", (100-i)/10); |
embeddedartists | 1:47680ec5d783 | 398 | } |
embeddedartists | 1:47680ec5d783 | 399 | } |
embeddedartists | 1:47680ec5d783 | 400 | handleError(STATE_ERR_JOYSTICK, "Failed to detect all joystick directions\n"); |
embeddedartists | 0:0d5190d379d3 | 401 | } |
embeddedartists | 0:0d5190d379d3 | 402 | |
embeddedartists | 0:0d5190d379d3 | 403 | static void test_rgb() |
embeddedartists | 0:0d5190d379d3 | 404 | { |
embeddedartists | 1:47680ec5d783 | 405 | printf("LED Tests: All off. Press button to continue\n"); |
embeddedartists | 1:47680ec5d783 | 406 | *ledRed = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 407 | *ledGreen = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 408 | *ledBlue = LED_OFF; |
embeddedartists | 0:0d5190d379d3 | 409 | waitForButtonClick(); |
embeddedartists | 0:0d5190d379d3 | 410 | |
embeddedartists | 1:47680ec5d783 | 411 | printf("LED Tests: RED on. Press button to continue\n"); |
embeddedartists | 1:47680ec5d783 | 412 | *ledRed = LED_ON; |
embeddedartists | 1:47680ec5d783 | 413 | *ledGreen = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 414 | *ledBlue = LED_OFF; |
embeddedartists | 0:0d5190d379d3 | 415 | waitForButtonClick(); |
embeddedartists | 0:0d5190d379d3 | 416 | |
embeddedartists | 1:47680ec5d783 | 417 | printf("LED Tests: GREEN on. Press button to continue\n"); |
embeddedartists | 1:47680ec5d783 | 418 | *ledRed = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 419 | *ledGreen = LED_ON; |
embeddedartists | 1:47680ec5d783 | 420 | *ledBlue = LED_OFF; |
embeddedartists | 0:0d5190d379d3 | 421 | waitForButtonClick(); |
embeddedartists | 0:0d5190d379d3 | 422 | |
embeddedartists | 1:47680ec5d783 | 423 | printf("LED Tests: BLUE on. Press button to continue\n"); |
embeddedartists | 1:47680ec5d783 | 424 | *ledRed = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 425 | *ledGreen = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 426 | *ledBlue = LED_ON; |
embeddedartists | 0:0d5190d379d3 | 427 | waitForButtonClick(); |
embeddedartists | 0:0d5190d379d3 | 428 | |
embeddedartists | 1:47680ec5d783 | 429 | printf("LED Tests: All on. Press button to continue\n"); |
embeddedartists | 1:47680ec5d783 | 430 | *ledRed = LED_ON; |
embeddedartists | 1:47680ec5d783 | 431 | *ledGreen = LED_ON; |
embeddedartists | 1:47680ec5d783 | 432 | *ledBlue = LED_ON; |
embeddedartists | 0:0d5190d379d3 | 433 | waitForButtonClick(); |
embeddedartists | 1:47680ec5d783 | 434 | |
embeddedartists | 1:47680ec5d783 | 435 | // Turn them off again |
embeddedartists | 1:47680ec5d783 | 436 | *ledRed = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 437 | *ledGreen = LED_OFF; |
embeddedartists | 1:47680ec5d783 | 438 | *ledBlue = LED_OFF; |
embeddedartists | 0:0d5190d379d3 | 439 | } |
embeddedartists | 0:0d5190d379d3 | 440 | |
embeddedartists | 0:0d5190d379d3 | 441 | static void test_audio() |
embeddedartists | 0:0d5190d379d3 | 442 | { |
embeddedartists | 1:47680ec5d783 | 443 | printf("Testing audio...\n"); |
embeddedartists | 0:0d5190d379d3 | 444 | WM8731 audio(P0_27, P0_28); |
embeddedartists | 0:0d5190d379d3 | 445 | if (!audio.writeCmd(WM8731::REG_R15_RESET, 0x0000)) { |
embeddedartists | 0:0d5190d379d3 | 446 | handleError(STATE_ERR_AUDIO, "Failed to send command to audio codec\n"); |
embeddedartists | 0:0d5190d379d3 | 447 | } |
embeddedartists | 0:0d5190d379d3 | 448 | } |
embeddedartists | 0:0d5190d379d3 | 449 | |
embeddedartists | 0:0d5190d379d3 | 450 | static void test_TextLCD() |
embeddedartists | 0:0d5190d379d3 | 451 | { |
embeddedartists | 0:0d5190d379d3 | 452 | SPI spi_lcd(p5, p6, p7); // MOSI, MISO, SCLK |
embeddedartists | 0:0d5190d379d3 | 453 | TextLCD_SPI lcd(&spi_lcd, p30, TextLCD::LCD16x2); // SPI bus, CS pin, LCD Type ok |
embeddedartists | 0:0d5190d379d3 | 454 | |
embeddedartists | 0:0d5190d379d3 | 455 | lcd.cls(); |
embeddedartists | 0:0d5190d379d3 | 456 | lcd.locate(0, 0); |
embeddedartists | 0:0d5190d379d3 | 457 | lcd.putc('E'); |
embeddedartists | 0:0d5190d379d3 | 458 | lcd.putc('m'); |
embeddedartists | 0:0d5190d379d3 | 459 | lcd.putc('b'); |
embeddedartists | 0:0d5190d379d3 | 460 | lcd.putc('e'); |
embeddedartists | 0:0d5190d379d3 | 461 | lcd.putc('d'); |
embeddedartists | 0:0d5190d379d3 | 462 | lcd.putc('d'); |
embeddedartists | 0:0d5190d379d3 | 463 | lcd.putc('e'); |
embeddedartists | 0:0d5190d379d3 | 464 | lcd.putc('d'); |
embeddedartists | 0:0d5190d379d3 | 465 | lcd.putc(' '); |
embeddedartists | 0:0d5190d379d3 | 466 | lcd.putc('A'); |
embeddedartists | 0:0d5190d379d3 | 467 | lcd.putc('r'); |
embeddedartists | 0:0d5190d379d3 | 468 | lcd.putc('t'); |
embeddedartists | 0:0d5190d379d3 | 469 | lcd.putc('i'); |
embeddedartists | 0:0d5190d379d3 | 470 | lcd.putc('s'); |
embeddedartists | 0:0d5190d379d3 | 471 | lcd.putc('t'); |
embeddedartists | 0:0d5190d379d3 | 472 | lcd.putc('s'); |
embeddedartists | 0:0d5190d379d3 | 473 | lcd.putc('!'); |
embeddedartists | 0:0d5190d379d3 | 474 | lcd.setCursor(TextLCD::CurOff_BlkOn); |
embeddedartists | 0:0d5190d379d3 | 475 | } |
embeddedartists | 0:0d5190d379d3 | 476 | |
embeddedartists | 0:0d5190d379d3 | 477 | static void test_DisplayModule() |
embeddedartists | 0:0d5190d379d3 | 478 | { |
embeddedartists | 0:0d5190d379d3 | 479 | // Test of DM-TFT18-101 display (http://www.displaymodule.com/collections/featured-modules/products/dm-tft18-101) |
embeddedartists | 0:0d5190d379d3 | 480 | DmTftHX8353C tft(p5, p7, p30, p17, p16); // mosi, clk, cs, dc, rst |
embeddedartists | 0:0d5190d379d3 | 481 | tft.init(); |
embeddedartists | 0:0d5190d379d3 | 482 | |
embeddedartists | 0:0d5190d379d3 | 483 | BubbleDemo bubbleDemo(&tft, tft.width(), tft.height()); |
embeddedartists | 0:0d5190d379d3 | 484 | bubbleDemo.run(750, 20); |
embeddedartists | 0:0d5190d379d3 | 485 | } |
embeddedartists | 0:0d5190d379d3 | 486 | |
embeddedartists | 1:47680ec5d783 | 487 | static void drawBars(int w, int h, uint32_t frameBuf) |
embeddedartists | 1:47680ec5d783 | 488 | { |
embeddedartists | 1:47680ec5d783 | 489 | uint16_t* p = (uint16_t*)frameBuf; |
embeddedartists | 1:47680ec5d783 | 490 | int third = w/3; |
embeddedartists | 1:47680ec5d783 | 491 | for (int y = 0; y < h; y++) { |
embeddedartists | 1:47680ec5d783 | 492 | int x; |
embeddedartists | 1:47680ec5d783 | 493 | for (x = 0; x < third; x++) { |
embeddedartists | 1:47680ec5d783 | 494 | *p = 0xf800; |
embeddedartists | 1:47680ec5d783 | 495 | p++; |
embeddedartists | 1:47680ec5d783 | 496 | } |
embeddedartists | 1:47680ec5d783 | 497 | for (; x < 2*third; x++) { |
embeddedartists | 1:47680ec5d783 | 498 | *p = 0x07e0; |
embeddedartists | 1:47680ec5d783 | 499 | p++; |
embeddedartists | 1:47680ec5d783 | 500 | } |
embeddedartists | 1:47680ec5d783 | 501 | for (; x < w; x++) { |
embeddedartists | 1:47680ec5d783 | 502 | *p = 0x001f; |
embeddedartists | 1:47680ec5d783 | 503 | p++; |
embeddedartists | 1:47680ec5d783 | 504 | } |
embeddedartists | 1:47680ec5d783 | 505 | } |
embeddedartists | 1:47680ec5d783 | 506 | } |
embeddedartists | 1:47680ec5d783 | 507 | |
embeddedartists | 1:47680ec5d783 | 508 | static void calibrate_drawMarker(Graphics &g, uint16_t x, uint16_t y, bool erase) |
embeddedartists | 1:47680ec5d783 | 509 | { |
embeddedartists | 1:47680ec5d783 | 510 | uint16_t color = (erase ? 0x0000 : 0xffff); |
embeddedartists | 1:47680ec5d783 | 511 | g.put_line(x-15, y, x+15, y, color); |
embeddedartists | 1:47680ec5d783 | 512 | g.put_line(x, y-15, x, y+15, color); |
embeddedartists | 1:47680ec5d783 | 513 | g.put_circle(x, y, color, 10, false); |
embeddedartists | 1:47680ec5d783 | 514 | } |
embeddedartists | 1:47680ec5d783 | 515 | |
embeddedartists | 1:47680ec5d783 | 516 | static void calibrate_display(TouchPanel* tp, uint32_t framebuffer, LcdController::Config &lcd) |
embeddedartists | 1:47680ec5d783 | 517 | { |
embeddedartists | 1:47680ec5d783 | 518 | bool morePoints = true; |
embeddedartists | 1:47680ec5d783 | 519 | uint16_t x, y; |
embeddedartists | 1:47680ec5d783 | 520 | int point = 0; |
embeddedartists | 1:47680ec5d783 | 521 | Graphics g((uint16_t*)framebuffer, lcd.width, lcd.height); |
embeddedartists | 1:47680ec5d783 | 522 | if (!tp->init(lcd.width, lcd.height)) { |
embeddedartists | 1:47680ec5d783 | 523 | handleError(STATE_ERR_TOUCH, "Failed to initialize touch controller\n"); |
embeddedartists | 1:47680ec5d783 | 524 | } |
embeddedartists | 1:47680ec5d783 | 525 | if (!tp->calibrateStart()) { |
embeddedartists | 1:47680ec5d783 | 526 | handleError(STATE_ERR_TOUCH, "Failed to start calibration\n"); |
embeddedartists | 1:47680ec5d783 | 527 | } |
embeddedartists | 1:47680ec5d783 | 528 | while (morePoints) { |
embeddedartists | 1:47680ec5d783 | 529 | if (point++ > 0) { |
embeddedartists | 1:47680ec5d783 | 530 | // erase old location |
embeddedartists | 1:47680ec5d783 | 531 | calibrate_drawMarker(g, x, y, true); |
embeddedartists | 1:47680ec5d783 | 532 | } |
embeddedartists | 1:47680ec5d783 | 533 | if (!tp->getNextCalibratePoint(&x, &y)) { |
embeddedartists | 1:47680ec5d783 | 534 | handleError(STATE_ERR_TOUCH, "Failed to get calibration point\n"); |
embeddedartists | 1:47680ec5d783 | 535 | } |
embeddedartists | 1:47680ec5d783 | 536 | calibrate_drawMarker(g, x, y, false); |
embeddedartists | 1:47680ec5d783 | 537 | if (!tp->waitForCalibratePoint(&morePoints, 0)) { |
embeddedartists | 1:47680ec5d783 | 538 | handleError(STATE_ERR_TOUCH, "Failed to get user click\n"); |
embeddedartists | 1:47680ec5d783 | 539 | } |
embeddedartists | 1:47680ec5d783 | 540 | } |
embeddedartists | 1:47680ec5d783 | 541 | |
embeddedartists | 1:47680ec5d783 | 542 | // erase old location |
embeddedartists | 1:47680ec5d783 | 543 | calibrate_drawMarker(g, x, y, true); |
embeddedartists | 1:47680ec5d783 | 544 | |
embeddedartists | 1:47680ec5d783 | 545 | // allow user to draw for 5 seconds |
embeddedartists | 1:47680ec5d783 | 546 | Timer t; |
embeddedartists | 1:47680ec5d783 | 547 | t.start(); |
embeddedartists | 1:47680ec5d783 | 548 | TouchPanel::touchCoordinate_t tc; |
embeddedartists | 1:47680ec5d783 | 549 | while(t.read() < 6) { |
embeddedartists | 1:47680ec5d783 | 550 | if (tp->read(tc)) { |
embeddedartists | 1:47680ec5d783 | 551 | //printf("TC: x,y,z = {%5d, %5d, %5d}\n", tc.x, tc.y, tc.z); |
embeddedartists | 1:47680ec5d783 | 552 | if (tc.z) { |
embeddedartists | 1:47680ec5d783 | 553 | g.put_dot(tc.x, tc.y, 0xffff); |
embeddedartists | 1:47680ec5d783 | 554 | } |
embeddedartists | 1:47680ec5d783 | 555 | } |
embeddedartists | 1:47680ec5d783 | 556 | } |
embeddedartists | 1:47680ec5d783 | 557 | } |
embeddedartists | 1:47680ec5d783 | 558 | |
embeddedartists | 1:47680ec5d783 | 559 | static void test_Display() |
embeddedartists | 1:47680ec5d783 | 560 | { |
embeddedartists | 1:47680ec5d783 | 561 | if (sdram_init() == 1) { |
embeddedartists | 1:47680ec5d783 | 562 | handleError(STATE_ERR_MEM, "Failed to initialize SDRAM\n"); |
embeddedartists | 1:47680ec5d783 | 563 | } |
embeddedartists | 1:47680ec5d783 | 564 | |
embeddedartists | 1:47680ec5d783 | 565 | // Test of display attached with FPC connector, 0.5mm pitch |
embeddedartists | 1:47680ec5d783 | 566 | EaLcdBoard::Result result; |
embeddedartists | 1:47680ec5d783 | 567 | LcdController::Config lcdCfg(40, 5, 2, 480, 8, 8, 2, 272, false, false, true, true, 1, LcdController::Bpp_16_565, 9000000, LcdController::Tft, false); |
embeddedartists | 1:47680ec5d783 | 568 | char* initStr = "v1,cd0,c50,cc0,c30,d100,c31,d100,cd1,d10,o,c51,cc100"; |
embeddedartists | 1:47680ec5d783 | 569 | EaLcdBoardGPIO lcdBoard(P0_27, P0_28); |
embeddedartists | 1:47680ec5d783 | 570 | int num = lcdCfg.width * lcdCfg.height * 2; |
embeddedartists | 1:47680ec5d783 | 571 | |
embeddedartists | 1:47680ec5d783 | 572 | uint32_t frameBuf = (uint32_t) malloc(num); |
embeddedartists | 1:47680ec5d783 | 573 | if (frameBuf == 0) { |
embeddedartists | 1:47680ec5d783 | 574 | handleError(STATE_ERR_MEM, "Failed to allocate memory for framebuffer\n"); |
embeddedartists | 1:47680ec5d783 | 575 | } |
embeddedartists | 1:47680ec5d783 | 576 | drawBars(lcdCfg.width, lcdCfg.height, frameBuf); |
embeddedartists | 1:47680ec5d783 | 577 | |
embeddedartists | 1:47680ec5d783 | 578 | result = lcdBoard.open(&lcdCfg, initStr); |
embeddedartists | 1:47680ec5d783 | 579 | if (result != EaLcdBoard::Ok) { |
embeddedartists | 1:47680ec5d783 | 580 | printf("Error Code: %d\n", result); |
embeddedartists | 1:47680ec5d783 | 581 | handleError(STATE_ERR_MEM, "Failed to open display\n"); |
embeddedartists | 1:47680ec5d783 | 582 | } |
embeddedartists | 1:47680ec5d783 | 583 | |
embeddedartists | 1:47680ec5d783 | 584 | result = lcdBoard.setFrameBuffer(frameBuf); |
embeddedartists | 1:47680ec5d783 | 585 | if (result != EaLcdBoard::Ok) { |
embeddedartists | 1:47680ec5d783 | 586 | printf("Error Code: %d\n", result); |
embeddedartists | 1:47680ec5d783 | 587 | handleError(STATE_ERR_MEM, "Failed to set framebuffer\n"); |
embeddedartists | 1:47680ec5d783 | 588 | } |
embeddedartists | 1:47680ec5d783 | 589 | |
embeddedartists | 1:47680ec5d783 | 590 | printf("Initialized. Control contrast with right trimpot (8 seconds)\n"); |
embeddedartists | 1:47680ec5d783 | 591 | AnalogIn trimpot(p15); |
embeddedartists | 1:47680ec5d783 | 592 | Timer t; |
embeddedartists | 1:47680ec5d783 | 593 | t.start(); |
embeddedartists | 1:47680ec5d783 | 594 | int delays = 0; |
embeddedartists | 1:47680ec5d783 | 595 | float last = -0.365; |
embeddedartists | 1:47680ec5d783 | 596 | while (t.read() < 8) { |
embeddedartists | 1:47680ec5d783 | 597 | float f = trimpot.read(); |
embeddedartists | 1:47680ec5d783 | 598 | if (f != last) { |
embeddedartists | 1:47680ec5d783 | 599 | last = f; |
embeddedartists | 1:47680ec5d783 | 600 | lcdBoard.setBC(100*f); |
embeddedartists | 1:47680ec5d783 | 601 | } |
embeddedartists | 1:47680ec5d783 | 602 | wait(0.1); |
embeddedartists | 1:47680ec5d783 | 603 | if (delays%10 == 0) { |
embeddedartists | 1:47680ec5d783 | 604 | printf("%ds\n", (80-delays)/10); |
embeddedartists | 1:47680ec5d783 | 605 | } |
embeddedartists | 1:47680ec5d783 | 606 | delays++; |
embeddedartists | 1:47680ec5d783 | 607 | } |
embeddedartists | 1:47680ec5d783 | 608 | |
embeddedartists | 1:47680ec5d783 | 609 | AR1021I2C touch(P0_27, P0_28, P2_25); |
embeddedartists | 1:47680ec5d783 | 610 | int vh,vl,r,ty; |
embeddedartists | 1:47680ec5d783 | 611 | if (touch.info(&vh,&vl,&r,&ty)) { |
embeddedartists | 1:47680ec5d783 | 612 | printf("Touch info: v%d.%d, %d-bit resolution, type 0x%x\n", vh, vl, r, ty); |
embeddedartists | 1:47680ec5d783 | 613 | } else { |
embeddedartists | 1:47680ec5d783 | 614 | printf("Failed to read touch information\n"); |
embeddedartists | 1:47680ec5d783 | 615 | } |
embeddedartists | 1:47680ec5d783 | 616 | |
embeddedartists | 1:47680ec5d783 | 617 | printf("Calibrate display\n"); |
embeddedartists | 1:47680ec5d783 | 618 | calibrate_display(&touch, frameBuf, lcdCfg); |
embeddedartists | 1:47680ec5d783 | 619 | if (allTestsPassed) { |
embeddedartists | 1:47680ec5d783 | 620 | memset((uint8_t*)frameBuf, 0x03, num); // GREEN |
embeddedartists | 1:47680ec5d783 | 621 | } else { |
embeddedartists | 1:47680ec5d783 | 622 | memset((uint8_t*)frameBuf, 0xe0, num); // RED |
embeddedartists | 1:47680ec5d783 | 623 | } |
embeddedartists | 1:47680ec5d783 | 624 | } |
embeddedartists | 1:47680ec5d783 | 625 | |
embeddedartists | 1:47680ec5d783 | 626 | static void setupSerial(int baudrate) |
embeddedartists | 1:47680ec5d783 | 627 | { |
embeddedartists | 1:47680ec5d783 | 628 | // This works because both the default serial (used by printf) and the s instance |
embeddedartists | 1:47680ec5d783 | 629 | // (used by s.printf) would use the same underlying UART code so setting the baudrate |
embeddedartists | 1:47680ec5d783 | 630 | // in one affects the other. |
embeddedartists | 1:47680ec5d783 | 631 | Serial s(USBTX, USBRX); |
embeddedartists | 1:47680ec5d783 | 632 | s.baud(baudrate); |
embeddedartists | 1:47680ec5d783 | 633 | } |
embeddedartists | 1:47680ec5d783 | 634 | |
embeddedartists | 0:0d5190d379d3 | 635 | int main() { |
embeddedartists | 1:47680ec5d783 | 636 | setupSerial(115200); |
embeddedartists | 1:47680ec5d783 | 637 | printf("\n" |
embeddedartists | 1:47680ec5d783 | 638 | "---\n" |
embeddedartists | 1:47680ec5d783 | 639 | "Production Test Program: LPC4088 Experiment Base Board\n" |
embeddedartists | 1:47680ec5d783 | 640 | "Build Date: " __DATE__ " at " __TIME__ "\n" |
embeddedartists | 1:47680ec5d783 | 641 | "\n"); |
embeddedartists | 0:0d5190d379d3 | 642 | |
embeddedartists | 0:0d5190d379d3 | 643 | shiftregCS = 1; |
embeddedartists | 0:0d5190d379d3 | 644 | button.mode(PullUp); |
embeddedartists | 0:0d5190d379d3 | 645 | |
embeddedartists | 1:47680ec5d783 | 646 | resetLEDs(); |
embeddedartists | 0:0d5190d379d3 | 647 | |
embeddedartists | 0:0d5190d379d3 | 648 | outputShiftReg(0x0); |
embeddedartists | 0:0d5190d379d3 | 649 | |
embeddedartists | 0:0d5190d379d3 | 650 | //startup flash behaviour |
embeddedartists | 0:0d5190d379d3 | 651 | for(int i=0; i<10; i++) |
embeddedartists | 0:0d5190d379d3 | 652 | { |
embeddedartists | 1:47680ec5d783 | 653 | *ledRed = LED_ON; |
embeddedartists | 0:0d5190d379d3 | 654 | wait(0.05); |
embeddedartists | 1:47680ec5d783 | 655 | *ledRed = LED_OFF; |
embeddedartists | 0:0d5190d379d3 | 656 | wait(0.05); |
embeddedartists | 0:0d5190d379d3 | 657 | } |
embeddedartists | 0:0d5190d379d3 | 658 | wait(1.0); |
embeddedartists | 0:0d5190d379d3 | 659 | for(int i=0; i<10; i++) |
embeddedartists | 0:0d5190d379d3 | 660 | { |
embeddedartists | 1:47680ec5d783 | 661 | *ledGreen = LED_ON; |
embeddedartists | 0:0d5190d379d3 | 662 | wait(0.05); |
embeddedartists | 1:47680ec5d783 | 663 | *ledGreen = LED_OFF; |
embeddedartists | 0:0d5190d379d3 | 664 | wait(0.05); |
embeddedartists | 0:0d5190d379d3 | 665 | } |
embeddedartists | 0:0d5190d379d3 | 666 | wait(1.0); |
embeddedartists | 0:0d5190d379d3 | 667 | for(int i=0; i<10; i++) |
embeddedartists | 0:0d5190d379d3 | 668 | { |
embeddedartists | 1:47680ec5d783 | 669 | *ledBlue = LED_ON; |
embeddedartists | 0:0d5190d379d3 | 670 | wait(0.05); |
embeddedartists | 1:47680ec5d783 | 671 | *ledBlue = LED_OFF; |
embeddedartists | 0:0d5190d379d3 | 672 | wait(0.05); |
embeddedartists | 0:0d5190d379d3 | 673 | } |
embeddedartists | 0:0d5190d379d3 | 674 | wait(1.0); |
embeddedartists | 0:0d5190d379d3 | 675 | |
embeddedartists | 1:47680ec5d783 | 676 | test_micro_sd_card_mci(); |
embeddedartists | 1:47680ec5d783 | 677 | resetLEDs(); // MCI interface disables the RGB LED |
embeddedartists | 0:0d5190d379d3 | 678 | // test_micro_sd_card_spi(); |
embeddedartists | 0:0d5190d379d3 | 679 | test_acc(); |
embeddedartists | 0:0d5190d379d3 | 680 | test_lm75(); |
embeddedartists | 0:0d5190d379d3 | 681 | test_trimpot(); |
embeddedartists | 0:0d5190d379d3 | 682 | test_joystick(); |
embeddedartists | 0:0d5190d379d3 | 683 | test_rgb(); |
embeddedartists | 0:0d5190d379d3 | 684 | test_audio(); |
embeddedartists | 0:0d5190d379d3 | 685 | //test_TextLCD(); |
embeddedartists | 0:0d5190d379d3 | 686 | //test_DisplayModule(); |
embeddedartists | 1:47680ec5d783 | 687 | |
embeddedartists | 1:47680ec5d783 | 688 | test_Display(); |
embeddedartists | 1:47680ec5d783 | 689 | |
embeddedartists | 1:47680ec5d783 | 690 | showTestResult(); |
embeddedartists | 1:47680ec5d783 | 691 | |
embeddedartists | 1:47680ec5d783 | 692 | //waitForButtonClick(); |
embeddedartists | 0:0d5190d379d3 | 693 | |
embeddedartists | 0:0d5190d379d3 | 694 | while(1) { |
embeddedartists | 0:0d5190d379d3 | 695 | test_shiftreg(); |
embeddedartists | 0:0d5190d379d3 | 696 | myled = 1; |
embeddedartists | 0:0d5190d379d3 | 697 | wait(0.2); |
embeddedartists | 0:0d5190d379d3 | 698 | myled = 0; |
embeddedartists | 0:0d5190d379d3 | 699 | wait(0.2); |
embeddedartists | 0:0d5190d379d3 | 700 | } |
embeddedartists | 0:0d5190d379d3 | 701 | } |