Kyle Goins / Mbed 2 deprecated LED_CUBE

Dependencies:   mbed mbed-rtos MCP23S17

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "adc.h"
00003 #include "MCP23S17.h"
00004 #include "rtos.h"
00005 #define MN 256 
00006 #define SAMPLE_RATE   48000
00007 
00008 // Create SPI bus
00009 SPI spi(p5, p6, p7);
00010 
00011 DigitalOut layer0(p24);
00012 DigitalOut layer1(p23);
00013 DigitalOut layer2(p22);
00014 DigitalOut layer3(p21);
00015 AnalogIn ain(p18);
00016 
00017 char Opcode = 0x40;
00018 MCP23S17 chip = MCP23S17(spi, p20, Opcode);
00019 Timer timer;
00020 Ticker ticker;
00021 
00022 int Counter = 0;
00023 int led_control = 1;
00024 int16_t Buffer[5000];
00025 unsigned char PowerInt[MN/2];
00026 ADC adc(SAMPLE_RATE, 1);
00027 float g;
00028 
00029 void sample_ADC(int chan, uint32_t value) {
00030     float s;
00031     s = adc.read(p19);
00032     Counter += 1;
00033     g = abs(s-2048);
00034     g = g/2048;   
00035 }
00036 
00037 void LED_Thread(void const *args) {
00038     chip.write(PORT_A, 0x00);
00039     chip.write(PORT_B, 0x00);
00040     layer0 = 1;
00041     layer1 = 0;
00042     layer2 = 0;
00043     layer3 = 0;
00044 //  Set all 8 Port A bits to output direction
00045     chip.direction(PORT_A, 0x00);
00046 //  Set all 8 Port B bits to output direction
00047     chip.direction(PORT_B, 0x00);
00048     unsigned char c[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
00049     while(1){
00050         switch(led_control){
00051             case 0: //Standard Mode
00052                 chip.write(PORT_A, 0xFF);
00053                 chip.write(PORT_B, 0xFF);
00054                 if(g > 0 && g < .25){
00055                     layer3 = 1;
00056                 }else{
00057                     layer3 = 0;   
00058                 }    
00059                 if(g > .25 && g < .5){
00060                     layer2 = 1;
00061                 }else{
00062                     layer2 = 0;   
00063                 }    
00064                 if(g > .5 && g < .75){
00065                     layer1 = 1;
00066                 }else{
00067                     layer1 = 0;   
00068                 }    
00069                 if(g > .75 && g < 1){
00070                     layer0 = 1;
00071                 }else{
00072                     layer0 = 0;   
00073                 } 
00074                 break;
00075             case 1: //Standard + Screensaver
00076                 char c_rand[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
00077                 if(g > 0 && g < .25){
00078                     layer3 = 1;
00079                 }else{
00080                     layer3 = 0;   
00081                 }    
00082                 if(g > .25 && g < .5){
00083                     layer2 = 1;
00084                 }else{
00085                     layer2 = 0;   
00086                 }    
00087                 if(g > .5 && g < .75){
00088                     layer1 = 1;
00089                 }else{
00090                     layer1 = 0;   
00091                 }    
00092                 if(g > .75 && g < 1){
00093                     layer0 = 1;
00094                 }else{
00095                     layer0 = 0;   
00096                 } 
00097                 for( int i = 0; i <=7; i++){chip.write(PORT_A, c[i]); //A loop
00098                 Thread::wait(10);}
00099                 chip.write(PORT_A, 0x00);
00100                 for( int i = 0; i <=7; i++){chip.write(PORT_B, c[i]); //A loop
00101                 Thread::wait(10);}
00102                 chip.write(PORT_B, 0x00); //CLEAR
00103                 break;
00104             case 2: //Standard + Screensaver {{RANDOM}}
00105                 char c_rand[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
00106                 if(g > 0 && g < .25){
00107                     layer3 = 1;
00108                 }else{
00109                     layer3 = 0;   
00110                 }    
00111                 if(g > .25 && g < .5){
00112                     layer2 = 1;
00113                 }else{
00114                     layer2 = 0;   
00115                 }    
00116                 if(g > .5 && g < .75){
00117                     layer1 = 1;
00118                 }else{
00119                     layer1 = 0;   
00120                 }    
00121                 if(g > .75 && g < 1){
00122                     layer0 = 1;
00123                 }else{
00124                     layer0 = 0;   
00125                 } 
00126                 for (int i=0; i<7; i++) {
00127                     int r = rand() % 7;  // generate a random position
00128                     int temp = c_rand[i]; c_rand[i] = c_rand[r]; c_rand[r] = temp;
00129                 }
00130                 for( int i = 0; i <=7; i++){chip.write(PORT_A, c_rand[i]); //A loop
00131                 Thread::wait(10);}
00132                 chip.write(PORT_A, 0x00);
00133                 for( int i = 0; i <=7; i++){chip.write(PORT_B, c_rand[i]); //A loop
00134                 Thread::wait(10);}
00135                 chip.write(PORT_B, 0x00); //CLEAR
00136                 break;
00137             case 3: //Screensaver
00138                 for(int n = 0; n<= 3; n++){
00139                     switch(n){
00140                         case 1: layer0 = 0; layer1 = 1; layer2 = 0; layer3 = 0;
00141                             break;
00142                         case 2: layer0 = 0; layer1 = 0; layer2 = 1; layer3 = 0;
00143                             break;
00144                         case 3: layer0 = 0; layer1 = 0; layer2 = 0; layer3 = 1;
00145                             break;
00146                         default: layer0 = 1; layer1 = 0; layer2 = 0; layer3 = 0;
00147                             break;
00148                     }
00149                 for( int i = 0; i <=7; i++){chip.write(PORT_A, c[i]); //A loop
00150                 Thread::wait(100);}
00151                 chip.write(PORT_A, 0x00);
00152                 for( int i = 0; i <=7; i++){chip.write(PORT_B, c[i]); //A loop
00153                 Thread::wait(100);}
00154                 chip.write(PORT_B, 0x00); //CLEAR
00155                 }
00156                 break;
00157         }
00158     Thread::wait(25);    
00159     }
00160 }    
00161 
00162 int main() {
00163     Thread t1(LED_Thread);
00164     while (1) {
00165         //Prepare for burst mode on all ADC pins and set up interrupt handler
00166         adc.append(sample_ADC);
00167         adc.startmode(0,0);
00168         adc.burst(1);
00169         adc.setup(p19,1);
00170         wait(.4);
00171         adc.interrupt_state(p19,1);
00172         wait(0.1);
00173         adc.interrupt_state(p19,0);
00174         adc.setup(p19,0);
00175         int actual_rate = adc.actual_sample_rate();
00176     }
00177 }
00178 
00179 
00180 
00181 
00182