Production Test Program (PTP) for the LPC4088 Experiment Base Board

Dependencies:   EALib I2S LM75B SDFileSystem mbed

Revision:
2:2f4b7535ceb3
Parent:
1:47680ec5d783
Child:
3:7ef908e84ae1
--- a/main.cpp	Wed Aug 27 14:24:59 2014 +0000
+++ b/main.cpp	Thu Aug 28 09:36:13 2014 +0000
@@ -3,625 +3,32 @@
  *****************************************************************************/
 #include "mbed.h"
 
-#include "MCIFileSystem.h"
-#include "SDFileSystem.h"
-#include "LM75B.h"
-#include "MMA7455.h"
-#include "WM8731.h"
-#include "TextLCD.h"
-#include "DmTftHX8353C.h"
-#include "BubbleDemo.h"
-#include "AR1021I2C.h"
-#include "Graphics.h"
-
-#include "LcdController.h"
-#include "EaLcdBoardGPIO.h"
-#include "sdram.h"
+#include "TestRGBLed.h"
+#include "TestFileSystemMCI.h"
+#include "TestFileSystemSPI.h"
+#include "TestAcc.h"
+#include "TestTemperature.h"
+#include "TestTrimpot.h"
+#include "TestJoystick.h"
+#include "TestAudio.h"
+#include "TestShiftreg.h"
+#include "TestDisplay.h"
 
 /******************************************************************************
  * Typedefs and defines
  *****************************************************************************/
 
-#define ACC_XMIN  (1<<0)  
-#define ACC_XMAX  (1<<1)  
-#define ACC_YMIN  (1<<2)  
-#define ACC_YMAX  (1<<3)  
-#define ACC_ZMIN  (1<<4)  
-#define ACC_ZMAX  (1<<5)  
-  
-#define ACC_MIN_LIMIT  (-50)
-#define ACC_MAX_LIMIT  ( 50)
-
-#define BUTTON_PRESSED   0
-#define BUTTON_RELEASED  1
-
-#define LED_ON   0
-#define LED_OFF  1
-
-#if 0
-    // Enters eternal loop
-    #define handleError(__a, __b) do { \
-        printf("Error " #__a ": %s\n", (__b)); \
-        resetLEDs(); \
-        ledRed = LED_ON; \
-        ledGreen = LED_OFF; \
-        ledBlue = LED_OFF; \
-        mbed_die(); \
-    } while(0)
-    
-    #define showTestResult() do {} while(0)   // Never used in this setup
-#else
-    bool allTestsPassed = true;
-    // Leaves error handling to the end of the program
-    #define handleError(__a, __b) do { \
-        printf("Error " #__a ": %s\n", (__b)); \
-        resetLEDs(); \
-        *ledRed = LED_ON; \
-        *ledGreen = LED_OFF; \
-        *ledBlue = LED_OFF; \
-        allTestsPassed = false; \
-        return; \
-    } while(0)
-    
-    #define showTestResult() do { \
-        resetLEDs(); \
-        *ledRed = LED_OFF; \
-        *ledGreen = LED_OFF; \
-        *ledBlue = LED_OFF; \
-        if (allTestsPassed) { \
-            printf("\n\nTest Result: PASSED\n\n"); \
-            *ledGreen = LED_ON; \
-        } else { \
-            printf("\n\nTest Result: FAILED\n\n"); \
-            *ledRed = LED_ON; \
-        } \
-    } while(0)
-#endif
-
-#define waitForButtonClick()  do {while(button.read() == BUTTON_RELEASED); while(button.read() == BUTTON_PRESSED);} while(false)
 
 /******************************************************************************
  * Local variables
  *****************************************************************************/
 
 DigitalOut myled(LED1);
-DigitalIn  button(p23);
-
-SPI shiftreg(p5, p6, p7);  // mosi, miso, sclk,
-DigitalOut shiftregCS(p30);
-
-DigitalOut* ledRed = NULL;
-DigitalOut* ledGreen = NULL;
-DigitalOut* ledBlue = NULL;
 
 /******************************************************************************
  * Local functions
  *****************************************************************************/
 
-static void resetLEDs()
-{
-    // Some peripherals may interfer with the RGB LED and as a result it
-    // may be needed to reinitialize them so that PIN is again an GPIO.
-    if (ledRed != NULL) {
-        delete ledRed;
-    }
-    if (ledGreen != NULL) {
-        delete ledGreen;
-    }
-    if (ledBlue != NULL) {
-        delete ledBlue;
-    }
-    ledRed = new DigitalOut(p25);
-    ledGreen = new DigitalOut(p28);
-    ledBlue = new DigitalOut(p26);
-
-    *ledRed = LED_OFF;
-    *ledGreen = LED_OFF;
-    *ledBlue = LED_OFF;
-}
-
-static void test_micro_sd_card_mci()
-{
-  // The LPC4088 Experiment Base Board does not have the CardDetect signal
-  // available so it must be set to NC here to work.
-  MCIFileSystem mcifs("mci", NC);
-  FILE* fp = fopen("/mci/message.txt", "r");
-  if (fp != NULL) {
-    char buf[20];
-    int num = fread(buf, 1, sizeof(buf), fp);
-    if (num >= 10) {
-      buf[10] = '\0';
-      if (strcmp(buf, "eatest2014") == 0) {
-        printf("MCI SD Card works!\n");
-        fclose(fp);
-        return;
-      }
-      handleError(STATE_ERR_MCIFS, "Invalid data read from /mci/message.txt\n");
-    }
-    handleError(STATE_ERR_MCIFS, "Failed to read >= 10 bytes from /mci/message.txt\n");
-  }
-  handleError(STATE_ERR_MCIFS, "Failed to open /mci/message.txt\n");
-}  
-
-static void test_micro_sd_card_spi()
-{
-  SDFileSystem spifs(p5, p6, p7, p8, "spi"); // mosi, miso, sclk, cs
-  FILE* fp = fopen("/spi/message.txt", "r");
-  if (fp != NULL) {
-    char buf[20];
-    int num = fread(buf, 1, sizeof(buf), fp);
-    if (num >= 10) {
-      buf[10] = '\0';
-      if (strcmp(buf, "eatest2014") == 0) {
-        printf("SPI SD Card works!\n");
-        fclose(fp);
-        return;
-      }
-      handleError(STATE_ERR_SPIFS, "Invalid data read from /spi/message.txt\n");
-    }
-    handleError(STATE_ERR_SPIFS, "Failed to read >= 10 bytes from /spi/message.txt\n");
-  }
-  handleError(STATE_ERR_SPIFS, "Failed to open /spi/message.txt\n");
-}  
-
-static void test_acc()
-{
-#if 1
-  MMA7455 sensor(P0_27, P0_28);
-  
-  //Try to initialize the accelerometer
-  if (!sensor.setMode(MMA7455::ModeMeasurement)) {
-     handleError(STATE_ERR_ACC, "Unable to set mode for MMA7455!\n");
-  }
-  
-  if (!sensor.calibrate()) {
-     handleError(STATE_ERR_ACC, "Failed to calibrate MMA7455!\n");
-  }
-
-  int val[3] = {    0,    0,    0};
-  int max[3] = {-1000,-1000,-1000};
-  int min[3] = { 1000, 1000, 1000};
-  int i;
-  Timer t;
-  t.start();
-  while (t.read() < 5) {
-    if (!sensor.read(val[0], val[1], val[2])) {
-      handleError(STATE_ERR_ACC, "Failed to read accelerometer data!\n");
-    }
-    printf("ACC: x,y,z = {%5d, %5d, %5d}\n", val[0], val[1], val[2]);
-    for (i = 0; i < 3; i++) {
-      if (val[i] < min[i]) {
-        min[i] = val[i];
-      }
-      if (val[i] > max[i]) {
-        max[i] = val[i];
-      }
-    }
-    for (i = 0; i < 3; i++) {
-      if ((max[i] - min[i]) < 2) {
-        break;
-      }
-      if (i == 2) {
-        printf("All three axis work\n");
-        return;
-      }
-    }
-    wait(0.1);
-  }
-  printf("Not enough variation X {%d..%d}, Y {%d..%d}, Z {%d..%d}!\n",
-              min[0], max[0], min[1], max[1], min[2], max[2]);
-  handleError(STATE_ERR_ACC, "Accelerometer data invalid\n");
-#else
-  MMA7455 sensor(P0_27, P0_28);
-  
-  //Try to initialize the accelerometer
-  if (!sensor.setMode(MMA7455::ModeMeasurement)) {
-     handleError(STATE_ERR_ACC, "Unable to set mode for MMA7455!\n");
-  }
-  
-  printf("Put on flat surface and press button to calibrate!\n");
-  while (button.read() != BUTTON_PRESSED) {}
-  while (button.read() == BUTTON_PRESSED) {}
-    
-  if (!sensor.calibrate()) {
-     handleError(STATE_ERR_ACC, "Failed to calibrate MMA7455!\n");
-  }
-  
-  printf("Now tilt the board in all directions (max 10 seconds)...\n");
-  int x=0, y=0, z=0;
-  uint8_t done = 0;
-  char msg[30] = {0};
-  
-  Timer t;
-  t.start();
-  while ((t.read() < 10) && (done != 0x3f)) {
-    if (!sensor.read(x, y, z)) {
-      handleError(STATE_ERR_ACC, "Failed to read accelerometer data!\n");
-    }
-    printf("ACC: x,y,z = {%5d, %5d, %5d} %s\n", x, y, z, msg);
-    if ((x < ACC_MIN_LIMIT) && !(done & ACC_XMIN)) {
-        done |= ACC_XMIN;
-        printf("Tilted XMIN\n");
-    } else if ((x > ACC_MAX_LIMIT) && !(done & ACC_XMAX)) {
-        done |= ACC_XMAX;
-        printf("Tilted XMAX\n");
-    }
-    if ((y < ACC_MIN_LIMIT) && !(done & ACC_YMIN)) {
-        done |= ACC_YMIN;
-        printf("Tilted YMIN\n");
-    } else if ((y > ACC_MAX_LIMIT) && !(done & ACC_YMAX)) {
-        done |= ACC_YMAX;
-        printf("Tilted XMAX\n");
-    }
-    if ((z < ACC_MIN_LIMIT) && !(done & ACC_ZMIN)) {
-        done |= ACC_ZMIN;
-        printf("Tilted ZMIN\n");
-    } else if ((z > ACC_MAX_LIMIT) && !(done & ACC_ZMAX)) {
-        done |= ACC_ZMAX;
-        printf("Tilted ZMAX\n");
-    }
-    wait(0.1);
-  }
-  printf("Done with ACC tests!\n");
-#endif
-}
-
-static void test_lm75()
-{
-  //Create an LM75B object at 0x92/0x93 (ADDRESS_1)
-  LM75B sensor(P0_27, P0_28, LM75B::ADDRESS_1);
-
-  printf("Testing LM75 temperature sensor...\n");
-    
-    //Try to open the LM75B
-    if (sensor.open()) {
-        printf("LM75 Device detected!\n");
- 
-        int i = 10;
-        while (i--) {
-            float f = (float)sensor;
-            //Print the current temperature
-            printf("Temp = %.3f\n", f);
- 
-            if ((f >= 15) && (f <= 45)) {
-                printf("Temp in 15..45 range - test passed\n");
-                break;
-            }
-            
-            //Sleep for 0.5 seconds
-            wait(0.5);
-        }
-        if (i == 0) {
-            handleError(STATE_ERR_LM75, "LM75 No temp in range 15..45!\n");
-        }
-    } else {
-        handleError(STATE_ERR_LM75, "LM75 Device not detected!\n");
-    }  
-}
-
-static void test_trimpot()
-{
-  AnalogIn trimpot(p15);
-  bool min = false;
-  bool max = false;
-
-  printf("Reading trimpot for 5 seconds...\n");  
-
-  for (int i = 0; i < 50; i++) {
-    float f = trimpot.read();
-    printf("Trimpot = %.3f\n", f);
-    if (f < 0.01f) {
-        min = true;
-    } else if (f > 0.99f) {
-        max = true;
-    }
-    if (min && max) {
-        printf("Test passed\n");
-        return;
-    }
-    
-    wait(0.1);
-  }
-  handleError(STATE_ERR_TRIMPOT, "Trimpot does not reach limits (0.01 - 0.99)!\n");
-}
-
-static void outputShiftReg(uint8_t val)
-{
-    shiftregCS = 0;  
-    shiftreg.write(val);
-    shiftregCS = 1;
-}
-static void test_shiftreg()
-{
-   outputShiftReg(0x1);
-   wait(0.1);
-   outputShiftReg(0x2);
-   wait(0.1);
-   outputShiftReg(0x4);
-   wait(0.1);
-   outputShiftReg(0x8);
-   wait(0.1);
-   outputShiftReg(0x10);
-   wait(0.1);
-   outputShiftReg(0x20);
-   wait(0.1);
-   outputShiftReg(0x40);
-   wait(0.1);
-   outputShiftReg(0x80);
-   wait(0.1);
-   outputShiftReg(0x40);
-   wait(0.1);
-   outputShiftReg(0x20);
-   wait(0.1);
-   outputShiftReg(0x10);
-   wait(0.1);
-   outputShiftReg(0x8);
-   wait(0.1);
-   outputShiftReg(0x4);
-   wait(0.1);
-   outputShiftReg(0x2);
-   wait(0.1);
-   outputShiftReg(0x1);
-   wait(0.1);
-   outputShiftReg(0x0);
-}
-    
-
-static void test_joystick()
-{
-  DigitalIn up(p32);//p39);
-  DigitalIn down(p38);//p32);
-  DigitalIn left(p39);//p38);
-  DigitalIn right(p37);
-  DigitalIn center(p31);
-
-  printf("Reading joystick for 10 seconds or all directions...\n");  
-  uint16_t mask = 0;
-
-  for (int i = 0; i < 100; i++) {
-    bool line = false;
-    if (up.read() == 0) { printf("UP ");        line = true; mask |= 0x01; }
-    if (down.read() == 0) { printf("DOWN ");    line = true; mask |= 0x02; }
-    if (left.read() == 0) { printf("LEFT ");    line = true; mask |= 0x04; }
-    if (right.read() == 0) { printf("RIGHT ");  line = true; mask |= 0x08; }
-    if (center.read() == 0) { printf("CENTER ");line = true; mask |= 0x10; }
-    if (line) {
-      printf("\n");
-    }
-    if (mask == 0x1F) {
-        printf("All directions tested. Done!\n");
-        return;
-    }
-    wait(0.1);
-    if (i%10 == 0) {
-      printf("%ds\n", (100-i)/10);
-    }
-  }
-  handleError(STATE_ERR_JOYSTICK, "Failed to detect all joystick directions\n");
-}
-
-static void test_rgb()
-{
-  printf("LED Tests: All off. Press button to continue\n");
-  *ledRed = LED_OFF;
-  *ledGreen = LED_OFF;
-  *ledBlue = LED_OFF;
-  waitForButtonClick();
-
-  printf("LED Tests: RED on. Press button to continue\n");
-  *ledRed = LED_ON;
-  *ledGreen = LED_OFF;
-  *ledBlue = LED_OFF;
-  waitForButtonClick();
-  
-  printf("LED Tests: GREEN on. Press button to continue\n");
-  *ledRed = LED_OFF;
-  *ledGreen = LED_ON;
-  *ledBlue = LED_OFF;
-  waitForButtonClick();
-  
-  printf("LED Tests: BLUE on. Press button to continue\n");
-  *ledRed = LED_OFF;
-  *ledGreen = LED_OFF;
-  *ledBlue = LED_ON;
-  waitForButtonClick();
-  
-  printf("LED Tests: All on. Press button to continue\n");
-  *ledRed = LED_ON;
-  *ledGreen = LED_ON;
-  *ledBlue = LED_ON;
-  waitForButtonClick();
-
-  // Turn them off again
-  *ledRed = LED_OFF;
-  *ledGreen = LED_OFF;
-  *ledBlue = LED_OFF;
-}
-
-static void test_audio()
-{
-    printf("Testing audio...\n");
-    WM8731 audio(P0_27, P0_28);
-    if (!audio.writeCmd(WM8731::REG_R15_RESET, 0x0000)) {
-        handleError(STATE_ERR_AUDIO, "Failed to send command to audio codec\n");
-    }
-}
-
-static void test_TextLCD()
-{
-    SPI spi_lcd(p5, p6, p7); // MOSI, MISO, SCLK
-    TextLCD_SPI lcd(&spi_lcd, p30, TextLCD::LCD16x2); // SPI bus, CS pin, LCD Type ok
-    
-    lcd.cls();
-    lcd.locate(0, 0);
-    lcd.putc('E');
-    lcd.putc('m');
-    lcd.putc('b');
-    lcd.putc('e');
-    lcd.putc('d');
-    lcd.putc('d');
-    lcd.putc('e');
-    lcd.putc('d');
-    lcd.putc(' ');
-    lcd.putc('A');
-    lcd.putc('r');
-    lcd.putc('t');
-    lcd.putc('i');
-    lcd.putc('s');
-    lcd.putc('t');
-    lcd.putc('s');
-    lcd.putc('!');
-    lcd.setCursor(TextLCD::CurOff_BlkOn);
-}
-
-static void test_DisplayModule()
-{
-    // Test of DM-TFT18-101 display (http://www.displaymodule.com/collections/featured-modules/products/dm-tft18-101)
-    DmTftHX8353C tft(p5, p7, p30, p17, p16); // mosi, clk, cs, dc, rst
-    tft.init();
-    
-    BubbleDemo bubbleDemo(&tft, tft.width(), tft.height());
-    bubbleDemo.run(750, 20);
-}
-
-static void drawBars(int w, int h, uint32_t frameBuf)
-{
-    uint16_t* p = (uint16_t*)frameBuf;
-    int third = w/3;
-    for (int y = 0; y < h; y++) {
-        int x;
-        for (x = 0; x < third; x++) {
-            *p = 0xf800;
-            p++;
-        }
-        for (; x < 2*third; x++) {
-            *p = 0x07e0;
-            p++;
-        }
-        for (; x < w; x++) {
-            *p = 0x001f;
-            p++;
-        }
-    }
-}
-
-static void calibrate_drawMarker(Graphics &g, uint16_t x, uint16_t y, bool erase)
-{
-  uint16_t color = (erase ? 0x0000 : 0xffff);
-  g.put_line(x-15, y, x+15, y, color);
-  g.put_line(x, y-15, x, y+15, color);
-  g.put_circle(x, y, color, 10, false);
-}
-
-static void calibrate_display(TouchPanel* tp, uint32_t framebuffer, LcdController::Config &lcd)
-{
-  bool morePoints = true;
-  uint16_t x, y;
-  int point = 0;
-  Graphics g((uint16_t*)framebuffer, lcd.width, lcd.height);
-  if (!tp->init(lcd.width, lcd.height)) {
-    handleError(STATE_ERR_TOUCH, "Failed to initialize touch controller\n");
-  }
-  if (!tp->calibrateStart()) {
-    handleError(STATE_ERR_TOUCH, "Failed to start calibration\n");
-  }  
-  while (morePoints) {
-    if (point++ > 0) {
-      // erase old location
-      calibrate_drawMarker(g, x, y, true);
-    }
-    if (!tp->getNextCalibratePoint(&x, &y)) {
-      handleError(STATE_ERR_TOUCH, "Failed to get calibration point\n");
-    }
-      calibrate_drawMarker(g, x, y, false);
-    if (!tp->waitForCalibratePoint(&morePoints, 0)) {
-      handleError(STATE_ERR_TOUCH, "Failed to get user click\n");
-    }
-  }
-  
-  // erase old location
-  calibrate_drawMarker(g, x, y, true);
-  
-  // allow user to draw for 5 seconds
-  Timer t;
-  t.start();
-  TouchPanel::touchCoordinate_t tc;
-  while(t.read() < 6) {
-    if (tp->read(tc)) {
-      //printf("TC: x,y,z = {%5d, %5d, %5d}\n", tc.x, tc.y, tc.z);
-      if (tc.z) {
-        g.put_dot(tc.x, tc.y, 0xffff);
-      }
-    }
-  }
-}
-
-static void test_Display()
-{
-    if (sdram_init() == 1) {
-        handleError(STATE_ERR_MEM, "Failed to initialize SDRAM\n");
-    }
-    
-    // Test of display attached with FPC connector, 0.5mm pitch
-    EaLcdBoard::Result result;
-    LcdController::Config lcdCfg(40, 5, 2, 480, 8, 8, 2, 272, false, false, true, true, 1, LcdController::Bpp_16_565, 9000000, LcdController::Tft, false);
-    char* initStr = "v1,cd0,c50,cc0,c30,d100,c31,d100,cd1,d10,o,c51,cc100";
-    EaLcdBoardGPIO lcdBoard(P0_27, P0_28);
-    int num = lcdCfg.width * lcdCfg.height * 2;
-    
-    uint32_t frameBuf = (uint32_t) malloc(num);
-    if (frameBuf == 0) {
-        handleError(STATE_ERR_MEM, "Failed to allocate memory for framebuffer\n");
-    }
-    drawBars(lcdCfg.width, lcdCfg.height, frameBuf);
-
-    result = lcdBoard.open(&lcdCfg, initStr);
-    if (result != EaLcdBoard::Ok) {
-        printf("Error Code: %d\n", result);
-        handleError(STATE_ERR_MEM, "Failed to open display\n");
-    }
-
-    result = lcdBoard.setFrameBuffer(frameBuf);
-    if (result != EaLcdBoard::Ok) {
-        printf("Error Code: %d\n", result);
-        handleError(STATE_ERR_MEM, "Failed to set framebuffer\n");
-    }
-        
-    printf("Initialized. Control contrast with right trimpot (8 seconds)\n");
-    AnalogIn trimpot(p15);
-    Timer t;
-    t.start();
-    int delays = 0;
-    float last = -0.365;
-    while (t.read() < 8) {
-        float f = trimpot.read();
-        if (f != last) {
-            last = f;
-            lcdBoard.setBC(100*f);
-        }
-        wait(0.1);
-        if (delays%10 == 0) {
-            printf("%ds\n", (80-delays)/10);
-        }
-        delays++;
-    }
-    
-    AR1021I2C touch(P0_27, P0_28, P2_25);
-    int vh,vl,r,ty;
-    if (touch.info(&vh,&vl,&r,&ty)) {
-        printf("Touch info: v%d.%d, %d-bit resolution, type 0x%x\n", vh, vl, r, ty);
-    } else {
-        printf("Failed to read touch information\n");
-    }
-
-    printf("Calibrate display\n");
-    calibrate_display(&touch, frameBuf, lcdCfg);
-    if (allTestsPassed) {
-        memset((uint8_t*)frameBuf, 0x03, num); // GREEN
-    } else {
-        memset((uint8_t*)frameBuf, 0xe0, num); // RED
-    }
-}
 
 static void setupSerial(int baudrate)
 {
@@ -640,59 +47,71 @@
            "Build Date: " __DATE__ " at " __TIME__ "\n"
            "\n");
     
-    shiftregCS = 1;    
-    button.mode(PullUp);
+    // run all tests
+    int failed = 0;
     
-    resetLEDs();
-      
-    outputShiftReg(0x0);
+    TestRGBLed rgb;
+    TestFileSystemMCI mcifs;
+    TestAcc acc;
+//    TestFileSystemSPI spifs;
+    TestTemperature temp;
+    TestTrimpot trim;
+    TestJoystick joy;
+    TestAudio audio;
+    TestShiftreg shift;
+    TestDisplay display;
+    
+    //startup flash behaviour
+    rgb.showStartupPattern();
+    
+    if (!mcifs.runTest()) {
+        failed++;
+    }
+
+//    if (!spifs.runTest()) {
+//        failed++;
+//    }
     
-     //startup flash behaviour
-     for(int i=0; i<10; i++)
-     {
-       *ledRed = LED_ON;
-       wait(0.05);
-       *ledRed = LED_OFF;
-       wait(0.05);
-     }
-     wait(1.0);
-     for(int i=0; i<10; i++)
-     {
-       *ledGreen = LED_ON;
-       wait(0.05);
-       *ledGreen = LED_OFF;
-       wait(0.05);
-     }
-     wait(1.0);
-     for(int i=0; i<10; i++)
-     {
-       *ledBlue = LED_ON;
-       wait(0.05);
-       *ledBlue = LED_OFF;
-       wait(0.05);
-     }
-     wait(1.0);    
+    if (!acc.runTest()) {
+        failed++;
+    }
+
+    if (!temp.runTest()) {
+        failed++;
+    }
+    
+    if (!trim.runTest()) {
+        failed++;
+    }
 
-    test_micro_sd_card_mci();
-    resetLEDs(); // MCI interface disables the RGB LED
-//    test_micro_sd_card_spi();
-    test_acc();
-    test_lm75();
-    test_trimpot();
-    test_joystick();
-    test_rgb();
-    test_audio();
-    //test_TextLCD();
-    //test_DisplayModule();
+    if (!joy.runTest()) {
+        failed++;
+    }
+    
+    if (!rgb.runTest()) {
+        failed++;
+    }
+
+    if (!audio.runTest()) {
+        failed++;
+    }
 
-    test_Display();
-     
-    showTestResult();
-     
-    //waitForButtonClick();
+    if (!display.runTest()) {
+        failed++;
+    }
+    
+    if (failed == 0) {
+        printf("\n\n---\nTest PASSED\n\n");
+        printf("NOTE: The display as well as the shift register LEDs\n"
+               "      must be manually checked as well\n\n");
+    } else {
+        printf("\n\n---\nTest FAILED  (%d failed parts)\n\n", failed);
+    }
+    rgb.showStatus(failed == 0);
+    display.showStatus(failed == 0);
 
     while(1) {
-        test_shiftreg();
+        shift.runTest();
         myled = 1;
         wait(0.2);
         myled = 0;