ssd3341 test of capacitive slider routinesb HW 5.2

Dependencies:   SLCD TSI mbed

Fork of kl46z_slider_v1 by Stanley Cohen

main.cpp

Committer:
scohennm
Date:
2016-09-21
Revision:
1:c452326c2800
Parent:
0:04499bc54bee

File content as of revision 1:c452326c2800:

#include "mbed.h"
#include <math.h>  
#include "TSISensor.h"
#include "SLCD.h"
#define LBUT PTC12  // port addresses for buttons
#define RBUT PTC3
#define TSILIMIT 0.99
#define PRINTDELTA 0.01
#define LCDCHARLEN 10
#define DATAINTERVAL 0.1
#define BUTTONTIME 0.3
#define LCDTIME 0.250
#define NUMMESS 2
#define NUMBUTS 2
#define FLOATDISP 0
#define UINTDISP 1
#define BITS16 65536
#define SHIFT2NUMERALS 100 // divide for right shift -  modul
#define RETAIN3NUMERALS 1000 // modulo (%) 1000


#define LIGHTSENSORPORT PTE22
#define PROGNAME "kl46z_slider_lightsense\n\r"

SLCD slcd; //define LCD display
Serial pc(USBTX, USBRX);

// define I/O
PwmOut gled(LED_GREEN);
PwmOut rled(LED_RED);
TSISensor tsi;

DigitalIn buttons[NUMBUTS] = {RBUT, LBUT};
AnalogIn LightSensor(LIGHTSENSORPORT);
Timer ButtonTimer; // for reading button states
Timer LCDTimer;
Timer dataTimer;

// definie an enum for illustration purposes
    enum shiftstate_t {right, none, left};

int displayState = FLOATDISP;

unsigned int leftrigntStateMachine( shiftstate_t sState, unsigned int usenseData ){
    unsigned int dataReturn;
    
    // data shifter state machine
    
    switch(sState) { 
        case none: {
                dataReturn = usenseData;
                break;
                }
        case right: {
                dataReturn = usenseData / SHIFT2NUMERALS;
                break;
                }
        case left: {
                dataReturn = usenseData % RETAIN3NUMERALS;
                break;
                }
    } // end switch shiftstate 
    return (dataReturn);
}

void initialize_global_vars(){
    pc.printf(PROGNAME);
    // set up DAQ timer
    ButtonTimer.start();
    ButtonTimer.reset();
    dataTimer.start();
    dataTimer.reset(); 
    LCDTimer.start();
    LCDTimer.reset(); 
     
} 

void LCDMess(char *lMess){
        slcd.Home();
        slcd.clear();
        slcd.printf(lMess);
}

int main(void) {
    int i;
    unsigned int dataRemainder;

    char lcdData[LCDCHARLEN];
    float tempTouch;
    float lastTouch = 0.0;
    float tsidata = 0.0;
    float lightData;
    unsigned int ulightData;
    float shiftResult;
    
    shiftstate_t shiftstate = none;

    
    
    initialize_global_vars();

     while (true) {
        // read buttons
        if (ButtonTimer.read() > BUTTONTIME){
            for (i=0; i<NUMBUTS; i++){ // index will be 0 or 1 
                if(!buttons[i]) { 
                    displayState = i;
                } // if ! buttons
            }// for loop to look at buttons
            ButtonTimer.reset();
        }
        
        // Read touch sensor
        if(dataTimer.read() > DATAINTERVAL){
            tempTouch = tsi.readPercentage();
            dataTimer.reset();  
            shiftResult = tempTouch -lastTouch;
            if (tempTouch > TSILIMIT){
                gled.write(0.0);// turn them off
                rled.write(0.0);
            }else {
                if (fabs(shiftResult) < PRINTDELTA) {
                    shiftstate = none; 
                    
                } else if (shiftResult < 0.0 ) {
                        shiftstate = left;
                      
                } else {
                        shiftstate = right;                   
                }
                /*
                if (fabs(shiftResult)> PRINTDELTA){                
                    pc.printf("Position %0.4f\n\r", tsidata);
                }
                */
                tsidata= tempTouch;
                gled.write(tsidata);
                rled.write(1.0 - tsidata);
                lastTouch=tsidata;
            }  
        }
        if(LCDTimer.read() > LCDTIME){
            LCDTimer.reset();                               
            switch (displayState){
                case FLOATDISP: {
                    lightData = (1.0 - LightSensor.read()); // show as increasiing with increasing intensity  
                    sprintf(lcdData,"%4.3f",lightData); 
                    break;
                }
                case UINTDISP: {
                    ulightData = BITS16 - LightSensor. read_u16();  
                    dataRemainder = leftrigntStateMachine( shiftstate, ulightData);
                    sprintf(lcdData,"%4d",dataRemainder); 
                    break;
                }// end switch displaystate
            }                 
            LCDMess(lcdData); 
        } // end LCD timer.read
            
    }// end while(true)
}