FRDM-KL46Z board sLCD demo code

Dependencies:   SLCD mbed

Fork of FRDM-KL46Z LCD rtc Demo by Paul Staron

main.cpp

Committer:
salemtang
Date:
2014-10-01
Revision:
8:18e86eb228ca
Parent:
7:33a8bfcbe3be
Child:
11:f1721a70b14e

File content as of revision 8:18e86eb228ca:

/**
 * @file   main.cpp
 * @brief  Abstract
 * @copyright (c) Salem TANG
 */
// -----------------------------------------------------------------------------
//  note
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
//  include files
// -----------------------------------------------------------------------------
#include "main.h"
#if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST)
#include "mbed.h"
#endif  // RTC_CLOCK_TEST || LED_BLINK_TEST
#if (defined RTC_CLOCK_TEST) || (defined SLCD_BLINKING_TEST)
#include "SLCD.h"
#endif  // RTC_CLOCK_TEST || SLCD_BLINKING_TEST
#ifdef SLCD_BLINKING_TEST
#include "MAG3110.h"
#include "MMA8451Q.h"
#include "TSISensor.h"
#endif  // SLCD_BLINKING_TEST

// -----------------------------------------------------------------------------
//  general define
// -----------------------------------------------------------------------------
#ifdef SLCD_BLINKING_TEST
#define LED_ON  0
#define LED_OFF 1
#define PRESS_ON  0
#define PRESS_OFF 1
#define MMA8451_I2C_ADDRESS (0x1d<<1)
#endif  // SLCD_BLINKING_TEST

// -----------------------------------------------------------------------------
//  struct define
// -----------------------------------------------------------------------------
#ifdef SLCD_BLINKING_TEST
struct KL46_SENSOR_DATA {
    int   sw1State;
    int   sw3State;
    float accValX;
    float accValY;
    float accValZ;
    float slider;
    float light;
    int   magValX;
    int   magValY;
    int   magValZ;
} sensorData;
#endif  // SLCD_BLINKING_TEST

// -----------------------------------------------------------------------------
//  external function
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
//  function prototype
// -----------------------------------------------------------------------------
#if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST) || (defined SLCD_BLINKING_TEST)
void initializeSetting (void);
#endif  // RTC_CLOCK_TEST || LED_BLINK_TEST || SLCD_BLINKING_TEST
#ifdef LED_BLINK_TEST
void ledBlink (float dutyfactor);
#endif  // LED_BLINK_TEST
#ifdef RTC_CLOCK_TEST
void rtcClock (void);
void scrollMessage (void);
void switchinput1_INTIRQ (void);
void switchinput3_INTIRQ (void);
#endif  // LED_BLINK_TEST
#ifdef SLCD_BLINKING_TEST
void SLCD_blinking_msg_wait (char *slcd_msg1, char *slcd_msg2);
#endif  // SLCD_BLINKING_TEST

// -----------------------------------------------------------------------------
//  external variable
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
//  global variable
// -----------------------------------------------------------------------------
#if (defined LED_BLINK_TEST) || (defined SLCD_BLINKING_TEST)
PwmOut greenled_PO(LED1);
PwmOut redled_PO(LED2);
DigitalIn switchinput1_DI(SW1);
DigitalIn switchinput3_DI(SW3);
float defaultdutyfactor = 0.0;
#endif  // LED_BLINK_TEST || SLCD_BLINKING_TEST
#if (defined RTC_CLOCK_TEST) || (defined SLCD_BLINKING_TEST)
DigitalOut greenled_DO(LED1);
DigitalOut redled_DO(LED2);
InterruptIn switchinput1_INT(SW1);
InterruptIn switchinput3_INT(SW3);
SLCD slcd;
Timer scroll;
struct tm t;
int i, j, k, lastscroll, display_timer, minute, hour, colon, dp;
char message[60];
char buffer[32];
#endif  // RTC_CLOCK_TEST || SLCD_BLINKING_TEST
#ifdef SLCD_BLINKING_TEST
AnalogIn  light(PTE22);  // analog-light input
TSISensor slider;  // Capacitive Touch Slider
MAG3110 mag(PTE25, PTE24);  // Magnetometer
MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
Serial usb_osda(USBTX, USBRX);  // OpenSDA Terminal
#endif  // SLCD_BLINKING_TEST

// -----------------------------------------------------------------------------
//  function
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//! @brief  Main Function
//! @param  [in] nil
//! @retval int
// -----------------------------------------------------------------------------
int main (void)
{
#if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST) || (defined SLCD_BLINKING_TEST)
    initializeSetting();
#endif  // RTC_CLOCK_TEST || LED_BLINK_TEST || SLCD_BLINKING_TEST

    while (true) {
#ifdef RTC_CLOCK_TEST
        rtcClock();
#endif  // RTC_CLOCK_TEST

#ifdef LED_BLINK_TEST
        if (!switchinput1_DI) {
            ledBlink(0.5);
        } else if (!switchinput3_DI) {
            ledBlink(1.0);
        } else {
            ledBlink(2.0);
        }
#endif  // LED_BLINK_TEST

#ifdef SLCD_BLINKING_TEST
        // disable all SLCD DPs
        slcd.DP(0, false); slcd.DP(1, false); slcd.DP(2, false);

        // MAIN/Loop/Sensing and Storing data -----------------//
        sensorData.sw1State = switchinput1_DI; sensorData.sw3State = switchinput3_DI;
        sensorData.accValX = acc.getAccX();  // accX[-1..1]->mouse (Lab1)
        sensorData.accValY = acc.getAccY();  // accY[-1..1]->mouse (Lab1)
        sensorData.accValZ = acc.getAccZ();  // accZ[-1..1]->rLED
        sensorData.slider = slider.readPercentage() * 100;
        sensorData.light = light;
        sensorData.magValX = mag.readVal(MAG_OUT_X_MSB);
        sensorData.magValY = mag.readVal(MAG_OUT_Y_MSB);
        sensorData.magValZ = mag.readVal(MAG_OUT_Z_MSB);

        // MAIN/Loop/Processing and Actions -------------------//
        // sensor -> terminal
        if (sensorData.sw1State != PRESS_OFF) {
            greenled_DO = !greenled_DO; //blinking 
            usb_osda.printf(" \r\n");
            usb_osda.printf(" Switches. Light . Slider . Accelerometer       . Magnetometer      . Compass\r\n");
            usb_osda.printf("  SW1:SW2|  LUX  |  TSI   |  accX : accY : accZ |  magX: magY: maxZ | Heading\r\n");
            usb_osda.printf("  %d : %d  | %1.3f |  %2.0f %%  | %+1.3f:%+1.3f:%+1.3f| %5d:%5d:%5d |  Lab3 \r\n", 
                sensorData.sw1State, sensorData.sw3State, sensorData.light, sensorData.slider, 
                sensorData.accValX, sensorData.accValY, sensorData.accValZ, 
                (short)sensorData.magValX, (short)sensorData.magValY, (short)sensorData.magValZ);
        } greenled_DO = LED_OFF;

        // acc: z-axis 1g min-blinking//acc: z-axis 1g min-blinking
        redled_PO = abs(sensorData.accValZ);

        if (sensorData.slider) {
            slcd.printf(" %3.0f", sensorData.slider);  // night->light .. 1->0
        } else {
            slcd.printf("%1.3f", sensorData.light);  // left->right .. 0->100%
        }
        wait(0.05);  // wait 50ms
#endif  // SLCD_BLINKING_TEST
    }
}

// -----------------------------------------------------------------------------
//! @brief  Initialize Setting
//! @param  [in] nil
//! @retval nil
// -----------------------------------------------------------------------------
#if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST) || (defined SLCD_BLINKING_TEST)
void initializeSetting (void)
{
#if (defined LED_BLINK_TEST) || (defined SLCD_BLINKING_TEST)
    switchinput1_DI.mode(PullUp);
    switchinput3_DI.mode(PullUp);
#endif  // LED_BLINK_TEST || SLCD_BLINKING_TEST

#ifdef RTC_CLOCK_TEST
    time_t seconds = time(NULL);

    slcd.All_Segments(1);
    wait(2);
    slcd.All_Segments(0);
    wait(1);    

    greenled_DO = 1;
    redled_DO = 1;

    sprintf(message, "    rtc clock    sw3 sets the hours    sw1 sets the minutes");

    // scrolling message    
    scroll.start();
    while (i < 58) {
        while (i < 58) {
            scrollMessage();
         }
    }
    wait(1);
    
    switchinput1_INT.rise(switchinput1_INTIRQ);
    switchinput3_INT.rise(switchinput3_INTIRQ);
#endif  // RTC_CLOCK_TEST
    
#ifdef SLCD_BLINKING_TEST
    greenled_DO = LED_ON;  // Green LED ON to indicate running/writing
    redled_PO = LED_OFF;  // Red LED OFF
    redled_PO.period (150);
    
    //---- MAIN/Inits (Wait4SW1) -> Start! --------------------//  
    // wait for Press SW1 - e.g. for HID/CDC/MsensorData Windows install.
    SLCD_blinking_msg_wait("   o","PrES");  // Lab1=Hid; 2=cdc; 3=MsensorData

    //---- MAIN/Inits Interface -------------------------------//
    usb_osda.baud (115200);
    usb_osda.printf ("\n___________________________________\r\n");
    usb_osda.printf ("\nFRDM-KL46Z_Lab\r\n \r\n I am a CDC serial port @OpensensorDataA/mUSB. Baud=115200 \r\n");

    //---- MAIN/Inits Done! (Wait4SW1) -> MANI/Loop -----------//
    greenled_DO = LED_OFF;  // Inits are done
#endif  // SLCD_BLINKING_TEST
}
#endif  // RTC_CLOCK_TEST || LED_BLINK_TEST || SLCD_BLINKING_TEST

// -----------------------------------------------------------------------------
//! @brief  LED Blink
//! @param  [in] dutyfactor Duty Factor Integer
//! @retval nil
// -----------------------------------------------------------------------------
#ifdef LED_BLINK_TEST
void ledBlink (float dutyfactor)
{
        redled_PO.write(defaultdutyfactor);
        greenled_PO.write(dutyfactor - defaultdutyfactor);
        defaultdutyfactor += 0.01;
        if (defaultdutyfactor >= dutyfactor) defaultdutyfactor = 0.0;
        wait(0.5);
}
#endif

// -----------------------------------------------------------------------------
//! @brief  RTC Clock
//! @param  [in] nil
//! @retval nil
// -----------------------------------------------------------------------------
#ifdef RTC_CLOCK_TEST
void rtcClock (void)
{
    time_t seconds = time(NULL);

    if (display_timer > 6) {
        // display Hours,Minutes for 2 seconds
        strftime(buffer, 4, "%H%M", localtime(&seconds));
        slcd.Colon(1);
        redled_DO = 0;
        slcd.DP2(0);
        greenled_DO = 1;
    } else {
        // display Minutes,Seconds for 8 seconds
        strftime(buffer, 4, "%M%S", localtime(&seconds));
        slcd.Colon(0);
        redled_DO = 1;
        slcd.DP2(1);
        greenled_DO = 0;
    }

    slcd.printf(buffer);
    wait(0.5);
    slcd.DP2(0);
    greenled_DO = 1;
    display_timer++;
    if (display_timer > 9) display_timer = 0;
    wait(0.5);
}
#endif  // RTC_CLOCK_TEST

// -----------------------------------------------------------------------------
//! @brief  Scroll Message
//! @param  [in] nil
//! @retval nil
// -----------------------------------------------------------------------------
#ifdef RTC_CLOCK_TEST
void scrollMessage (void)
{
    if (scroll.read_ms() > lastscroll + 350) {
        scroll.reset();
        if (i > 58) {
            i = 0;
        }
        int j, k = i;
        for (j = 0; j < 4; j++) {
            if (message[k+j]) {
                slcd.putc(message[k+j]);
            } else {
                slcd.putc(' ');
                k--;
            }
        }
        i++;
        lastscroll = scroll.read_ms();
    }
}
#endif  // RTC_CLOCK_TEST

// -----------------------------------------------------------------------------
//! @brief  Set Minutes ISR
//! @param  [in] nil
//! @retval nil
// -----------------------------------------------------------------------------
#ifdef RTC_CLOCK_TEST
void switchinput1_INTIRQ (void)
{
    display_timer = 7;
    time_t seconds = time(NULL);
    char buffer[2];
    strftime(buffer, 2,"%H", localtime(&seconds));
    hour = atoi(buffer);  // get Hour integer
    strftime(buffer, 2,"%M", localtime(&seconds));
    minute = atoi(buffer);  // get Minutes integer
    minute++;
    if (minute > 59) minute = 0;
    t.tm_sec = 0;  // Seconds reset to zero
    t.tm_min = minute;
    t.tm_hour = hour;
    t.tm_mday = 1;
    t.tm_mon = 2;
    t.tm_year = 114;
    set_time(mktime(&t));
}
#endif  // RTC_CLOCK_TEST

// -----------------------------------------------------------------------------
//! @brief  Set Hours ISR
//! @param  [in] nil
//! @retval nil
// -----------------------------------------------------------------------------
#ifdef RTC_CLOCK_TEST
void switchinput3_INTIRQ (void)
{
    display_timer = 7;
    time_t seconds = time(NULL);
    char buffer[2];
    strftime(buffer, 2,"%H", localtime(&seconds));
    hour = atoi(buffer);  // get Hour integer
    strftime(buffer, 2,"%M", localtime(&seconds));
    minute = atoi(buffer);  // get Minutes integer
    hour++;
    if (hour > 23) hour = 0;
    t.tm_sec = 0;  // Seconds reset to zero
    t.tm_min = minute;
    t.tm_hour = hour;
    t.tm_mday = 1;
    t.tm_mon = 2;
    t.tm_year = 114;
    set_time(mktime(&t));
}
#endif  //RTC_CLOCK_TEST

// -----------------------------------------------------------------------------
//! @brief  SLCD Blinking Massage
//! @param  [in] *slcd_msg1 Massage 1
//! @param  [in] *slcd_msg2 Massage 2
//! @retval nil
// -----------------------------------------------------------------------------
#ifdef SLCD_BLINKING_TEST
void SLCD_blinking_msg_wait (char *slcd_msg1, char *slcd_msg2)
{
    char wait4sw1 = 0;  // 500ms blinking
    slcd.CharPosition = 0;
    // wait for Press SW1 - to start mag calibration
    while (switchinput1_DI == PRESS_ON);  // wait for release
    while (switchinput1_DI == PRESS_OFF) {  // wait for press
        if (++wait4sw1 < 150) {  // 300ms
            slcd.printf(slcd_msg1);
        } else {  //200ms
            slcd.printf (slcd_msg2);
            wait (0.002);
            slcd.CharPosition = 0;
        }
    }
    while (switchinput1_DI == PRESS_ON);  // wait for release
}
#endif  // SLCD_BLINKING_TEST