:)

Dependencies:   MbedJSONValue DebounceIn TextLCD USBDevice mbed WebSocketClient cc3000_hostdriver_mbedsocket Adafruit_LEDBackpack_2

main.cpp

Committer:
fil
Date:
2014-11-25
Revision:
6:d0a1eba7f943
Parent:
5:03d75ad40d5e
Child:
7:7fbe8dc5e4fa

File content as of revision 6:d0a1eba7f943:

#include "mbed.h"
#include <string>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "TextLCD.h"
#include "DebounceIn.h"
#include "USBKeyboard.h"
#include "cc3000.h"
#include "Websocket.h"
#include "MbedJSONValue.h"

//LED stuff
I2C i2c(D7,D6);
Adafruit_24bargraph ledbar_left=Adafruit_24bargraph(&i2c);

I2C i2c(D7,D6);
Adafruit_24bargraph ledbar_right=Adafruit_24bargraph(&i2c);

DebounceIn upbutton(D9);
DebounceIn downbutton(D8);
DebounceIn leftbutton( );
DebounceIn rightbutton( );

//Scanner stuff

DebounceIn scanbutton(D10);

DigitalOut A_in(D0);
DigitalOut B_in(D1);
DigitalOut C_in(D2);
DigitalOut D_in(D3);
DigitalOut E_in(D4);
DigitalOut F_in(D5);

DigitalOut A_out(PTC7);
DigitalOut B_out(PTC0);
DigitalOut C_out(PTC3);

AnalogOut dac(PTE30);
AnalogIn  adc(PTB0);

//USBKeyboard keyboard;


//LCD stuff
TextLCD lcd(D13,D12,PTA17,PTA16,PTC17,PTC16,TextLCD::LCD20x4);

// cc3000 KL25Z wifi connection
// we need to define connection pins for:
// - IRQ      => (pin D3)
// - Enable   => (pin D5)
// - SPI CS   => (pin D10)
// - SPI MOSI => (pin D11)
// - SPI MISO => (pin D12)
// - SPI CLK  => (pin D13)
// plus wifi network SSID, password, security level and smart-configuration flag.

mbed_cc3000::cc3000 wifi(D3, D5, D10, SPI(D11, D12, D13),
                         "SSID", "PASSWORD", WPA2, false);
Websocket ws("ws://sockets.mbed.org/ws/toastboard/rw");

int main()
{

    //Scan init

    float test_val = .001;
    float row_volt = 0;
    int con_mat[24][2] = {};
    int a1,b1,c1,a2,b2,c2;
    float volt_mat[24][2] = {};
    //dac = test_val;


    //LED init
    int redcount = 0, greencount = 0, rowselect = 0, rowselect_old = 0, moved = 1, colselect = 0;
    ledbar_left.begin(0x70);
    ledbar_left.clear();
    ledbar_left.writeDisplay();

    ledbar_right.begin(0x70);
    ledbar_right.clear();
    ledbar_right.writeDisplay();

    //LCD init
    lcd.cls();
    string programname = "Dan's UI Test";

    lcd.printf("%s",programname.c_str());

    while(1) {

        //Display

        if (colselect == 0) {
            ledbar_left.clear();
            ledbar_right.clear();
            ledbar_left.setBar(rowselect,LED_GREEN);
            ledbar_left.writeDisplay();
            ledbar_right.writeDisplay();
        } else
        ledbar_left.clear();
        ledbar_right.clear();
        ledbar_right.setBar(rowselect,LED_GREEN);
        ledbar_right.writeDisplay();
        ledbar_left.writeDisplay();

        //Moving the selected row
        if (upbutton.read() == 0) {
            rowselect_old = rowselect;
            rowselect = rowselect-1;
            moved = 1;
            wait(0.75);
        }

        if (downbutton.read() == 0) {
            rowselect_old = rowselect;
            rowselect = rowselect+1;
            moved = 1;
            wait(0.75);
        }

        if (leftbutton.read() == 0) {
            colselect = 0;
            ledbar_right.clear();
            moved =1;
            wait(0.75);
            
        }

        if (rightbutton.read() == 0) {
            colselect = 1;
            ledbar_left.clear();
            moved =1;
            wait(0.75);
            
      
        }

        //Boundary checking
        if (rowselect > 23) {
            rowselect = 23;
        }
        if (rowselect < 0) {
            rowselect = 0;
        }

        //Implementing scanning

        if (scanbutton.read() == 0) {
            
            // Old mega-scan code. More refined version below
            /*
            for (int x = 0; x < 8; x++) {
                for (int y = 0; y < 8; y++) {
                    // Stupid logic to convert count value to binary...
                    A_in = x%2;
                    a1 = x%2;
                    B_in = (x/2)%2;
                    b1 = (x/2)%2;
                    C_in = (x/4)%2;
                    c1 = (x/4)%2;

                    A_out = y%2;
                    int a2 = y%2;
                    B_out = (y/2)%2;
                    b2 = (y/2)%2;
                    C_out = (y/4)%2;
                    c2 = (y/4)%2;

                    // Now we do the scan test, results are stored in con_mat
                    //wait(0.01);
                    dac = test_val;
                    float in_val = adc.read();

                    if ((in_val > .0010) && (in_val < .0025))
                        con_mat[x][y] = 1;
                    else
                        con_mat[x][y] = 0;

                    //keyboard.printf("%f %f \n",dac.read(),in_val);
                    //keyboard.printf("%d %d %d\n",a2,b2,c2);
                }
            }
            
            for (int x=0;x<8;x++) {
            for (int y=0;y<8;y++) {
                keyboard.printf("%d ",con_mat[x][y]);
                }}
            */
            //Displaying all connected rows as red light!
            ledbar.clear();
            for (int i=0; i<8; i++) {
                if (con_mat[rowselect][i] == 1) {
                    ledbar.setBar(i,LED_RED);
                }
            }
            ledbar.writeDisplay();

            float vddmeasure = 3.14259;
            float vrowmeasure = 1.1234;
            lcd.cls();
            lcd.locate(0,1);
            lcd.printf("Vdd: %1.1f V",vddmeasure);
            lcd.locate(0,0);
            lcd.printf("Row: %1.1f V",vrowmeasure);

            wait(2.5);
            ledbar.clear();
            ledbar.writeDisplay();
            lcd.cls();
            string programname = "Dan's UI Test";
            lcd.printf("%s",programname.c_str());

        }
    }




}


/*

///// PUT ALL BELOW IN SCAN BUTTON IF ////////
//Scans rows connected to vdd and ground. Vdd = 2 in con mat, Ground = 3. Rows connected to selected row = 1.

//SET MULTIPLEXER TO READ VDD
            for (int i=0; i++; i<2) {
                for (int j=0; j++; i<24) {
                    
                    float test_val = adc.read();
                    if (test_val == 0.0) {
                        // this node is ground...
                    }
                    else if ((test_val > vdd_samp-0.01) && (test_val < vdd_samp+0.01)) {
                        // this node is VDD
                    }
                    else if ((test_val > select_val-0.01) && (test_val < select_val+0.01)) {
                        // this node is connected to the selected node
                    }
                    else {
                        // this node is floating?
                    }
                }
            }
            
A_in,B_in,C_in,D_in,E_in,F_in = 1;
float vddval = adc.read();

//SET MULTIPLEXER TO READ SELECTED ROW
// Sample the 'selected' node
int sn = 0;
int sn = (colselect + 1)*(rowselect + 1);
A_in = (sn-1)&2; B_in = ((sn-1)/2)%2; C_in = ((sn-1)/4)%2; D_in = ((sn-1)/8)%2; E_in = ((sn-1)/16)%2; F_in = ((sn-1)/32)%2;
float rowval = adc.read();

ledbar_left.clear();
ledbar_right.clear();

for (int x = 0; x < 2; x++) {
        for (int y = 0; y < 24; y++) {
            int sn = (colselect+1)*(rowselect+1);
            A_in = (sn-1)&2; B_in = ((sn-1)/2)%2; C_in = ((sn-1)/4)%2; D_in = ((sn-1)/8)%2; E_in = ((sn-1)/16)%2; F_in = ((sn-1)/32)%2;

            float in_val = adc.read();
            volt_mat[x][y] = in_val;

            if (in_val == vddval){
                con_mat[x][y] = 2;
                if (x == 0){
                    ledbar_left.setBar(y,LED_RED);
                }
                else {
                    ledbar_right.setBar(y,LED_RED);
                }
            }
            if (in_val == 0){
                con_mat[x][y] = 3;
                if (x == 0){
                    ledbar_left.setBar(y,LED_YELLOW);
                }
                else {
                    ledbar_right.setBar(y,LED_YELLOW);
                }
            }
            if (in_val == rowval){
                con_mat[x][y] = 1;
                if (x == 0){
                    ledbar_left.setBar(y,LED_GREEN);
                }
                else {
                    ledbar_right.setBar(y,LED_GREEN);
                }
            }
            else {
                con_mat[x][y] = 0;
            }
        }
        
moved = 0;

//// PUT ALL ABOVE IN SCAN BUTTON IF /////



if (moved==0)  {
ledbar_left.writeDisplay();
ledbar_right.writeDisplay();
lcd.cls();
lcd.locate(0,1);
lcd.printf("Vdd: %1.1f V",vddval);
lcd.locate(0,0);
lcd.printf("Row: %1.1f V",rowval);
}
else {
        lcd.cls();
        string programname = "Dan's UI Test";
        string instructions = "Select a row and scan it";
        lcd.locate(0,0);
        lcd.printf("%s",programname.c_str());
        lcd.locate(0,1);
        lcd.printf("%s",instructions.c_str());
}





//Q: Do we need to do the same test for ground or can 0.00 be assumed?
//Q: What is the most efficient way to compare all the "volt_mat" elements?
//Q: Do we need to add a "confidence interval" around the rowval and vdd tests?





*/