Dependencies:   mbed

Revision:
0:87b78725a6dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Mar 05 06:00:16 2012 +0000
@@ -0,0 +1,278 @@
+// Display Test
+//#include "mbed.h"
+#include "KS0108.h"
+#include "calsolimage.h"
+#include "numbers.h"
+#include "Arial12.h"
+#include "Arial14.h"
+#include "arial_bold_14.h"
+#include "ArialB40.h"
+#include "SystemFont5x7.h"
+#include "HelveticaB35.h"
+#include "CourierNew_B70.h"
+
+// Declare each of the things you're going to use
+// The display
+KS0108 display(p23,p21,p22,p20,p24,p25,p17,p18,p19,p30,p29,p28,p27,p26);
+// The button on the breadboard
+DigitalIn topButton(p13);
+// For printing things to the computer
+Serial pc(USBTX,USBRX);
+// Timers
+Timer timer1;
+Timer timer2;
+Timer testTimer;
+
+// Declare methods, the actual body is down there.
+// You have to do this for C
+void rules (unsigned char *);
+void random (unsigned char *);
+
+// This is where your programs starts running
+int main() {
+  // Initialize variables
+  int dist = 20;
+  int demo = 0;
+  int i = 0;
+  topButton.mode(PullUp);
+  // Display CalSol logo
+  display.FullScreenBMP(pic);
+  wait(0.2);
+
+  timer1.start();  // For button stuff
+  timer2.start();
+  
+  int percentage = 0; //integer value from 0 to 100 (battery)
+  int speed = 150;          //integer value from 0 to 999
+  double current = 15.2;    //double  value from 0 to 99.9
+  
+  while(1) {
+    if(!topButton) {
+      if(timer1.read_ms() > 200) {
+        demo++;
+        display.ClearScreen();
+        if(demo > 3) {
+          demo = 0;
+        }
+        timer1.reset();
+      }
+    }
+    switch(demo) {
+    case 0:
+      if(timer2.read_ms() > 500) {
+        rules(pic);
+        display.FullScreenBMP(pic);
+        timer2.reset();
+      }
+      break;
+      
+    case 1:
+   
+    //GRID:
+        //speed:   70x64, ( 0,  0)
+        //current: 57x23, (71,  0)
+        //battery: 57x40, (71, 23)
+    display.HLineShort(71, 64-24, 57, BLACK);
+    display.VLineShort(71, 0, 64, BLACK);
+ 
+ 
+ /*
+    /*
+     //CURRENT
+     display.SelectFont(Arial_Bold_14, WHITE, ReadData);
+     display.GotoXY(78, 8);
+     display.PrintNumber(current); // this doesn't work with doubles
+     display.SelectFont(System5x7, WHITE, ReadData);
+     display.GotoXY(110, 8);
+     display.PrintString("Amp");
+     */
+     
+    
+    //BATTERY
+    display.RoundRectangle(82, 2, 40, 24, 4, BLACK); //body: 40x24
+    display.EmptyRectangle(78, 10, 78+4, 10+8, BLACK);//head:  4x8
+    display.SelectFont(System5x7, WHITE, ReadData);
+    display.GotoXY(108, 24+8);
+    display.PrintString("%");   
+    
+    
+    //PERCENTAGE (reasonable update rate: testTimer.read_ms()/700)
+    /*
+    int INITIAL_PERCENTAGE = 100;
+    int percentage = INITIAL_PERCENTAGE; // values 0-100
+    int newPercentage = percentage; // values 0-100
+    int barPosition = 86+(int)(((double)(100-percentage)/100.0)*32);
+    int newBarPosition = 86+(int)(((double)(100-newPercentage)/100.0)*32); //x-coordinates
+    
+    display.SelectFont(System5x7, BLACK, ReadData);
+    
+    //draw initial box
+    display.FullRectangle(barPosition, 2+4, 86+32, 2+24-4, BLACK); //inside: 32x16
+    int y = 32; //y coordinate for percenage. for testing/fixing font
+    
+    testTimer.start();
+   
+    while (newPercentage <= 100 && newPercentage >= 0) //testing update rate/centering
+    {
+        if (testTimer.read_ms()%700 == 0)
+        {
+            //account for number of digits
+            
+            if (newPercentage > 99)
+                display.GotoXY(88, y);
+            else if (newPercentage >= 10)
+            {
+                if (percentage > 99)
+                    display.FullRectangle(88, y, 88+5, y+7, WHITE);
+                display.GotoXY(94, y);
+            }
+            else
+            {
+                if (percentage >= 10)
+                    display.FullRectangle(88, y, 88+5*2+1, y+7, WHITE);
+                display.GotoXY(100,y);
+            }
+            
+            
+            display.PrintNumber(newPercentage);
+            
+            
+            
+            barPosition = 86+(int)(((double)(100-percentage)/100.0)*32);
+            newBarPosition = 86+(int)(((double)(100-newPercentage)/100.0)*32);
+            
+            //draw increase or decrease in percentage
+            if (newBarPosition < barPosition) //percentage increase
+                display.FullRectangle(newBarPosition, 2+4, barPosition, 2+24-4, BLACK);
+            else if (newBarPosition > barPosition) //percentage decrease
+                display.FullRectangle(barPosition, 2+4, newBarPosition, 2+24-4, WHITE);
+                
+                
+            //update percentages
+            percentage = newPercentage;
+            //newPercentage = testTimer.read_ms()/700; //slow increase
+            newPercentage = INITIAL_PERCENTAGE-(testTimer.read_ms()/700); //rapid decrease
+            
+        }
+   }*/
+   
+   //SPEED
+   
+   display.SelectFont(System5x7, WHITE, ReadData);
+   display.GotoXY(26, 48);
+   display.PrintString("MPH");
+   testTimer.start();
+     
+    display.SelectFont(CourierNew_B70, WHITE, ReadData); 
+    /* while (true){
+         if (testTimer.read_ms()%700 == 1)
+         {*/  // for testing
+             //speed = testTimer.read_ms()/1000;
+             speed += (int)((rand()%3)-2);
+             
+             //display.FullRectangle(0, 16, 70, 44, WHITE); //clears space too slowly. find alternative
+             
+             if (speed > 99)       // 3digits
+                display.GotoXY(1, 16);
+             else if (speed >= 10) // 2digits
+                display.GotoXY(3+10, 16);
+             else                  //1digit
+                display.GotoXY(3+10*2, 16);
+             
+             display.PrintNumber(speed); 
+         /*}
+     }*/
+   */
+      break;
+    case 2:
+      // This block does the bar graph stuff.
+      if(timer2.read_ms() > 100) {
+        // display.PutString(3,2,"I can has mbed too");
+       //  display.PrintFloat(123.23,4,5);
+         display.VLine(6+i,47,56,BLACK);
+         if (i < 10){dist = 30;}
+         else if (i < 100){dist = 25;}
+         else {dist = 20;}         
+         display.PrintInteger(i,6,dist);
+         i++;
+         if(i > 100) {
+           i = 0;
+           display.ClearScreen();
+         }
+         timer2.reset();
+      }
+      break;
+    case 3:
+      if(timer2.read_ms() > 500) {
+        rules(pic);
+        display.FullScreenBMP(pic);
+        timer2.reset();
+      }
+      default:
+      break;
+    }
+  }
+}
+
+//For Conway's Game of Life
+void rules (unsigned char * array) {
+  char neighborArray[128][64];
+  // Get number of neighbors
+  for (int x = 0; x < 128; x++) {
+    for (int y = 0;y < 64; y++) {
+      neighborArray[x][y] = 0;
+    }
+  }
+  for (int y = 0;y < 64; y++) {
+    for (int x = 0; x < 128; x++) {
+      if (array[x + (y/8*8)*16] & (1<<(y%8))) {
+        if (x != 0) {
+          neighborArray[x-1][y] += 1;
+          if (y != 0) {
+            neighborArray[x-1][y-1] += 1;
+          }
+          if (y != 127) {
+            neighborArray[x-1][y+1] += 1;
+          }
+        }
+        if (x != 127) {
+          neighborArray[x+1][y] += 1;
+          if (y != 0) {
+            neighborArray[x+1][y-1] += 1;
+          }
+          if (y != 127) {
+            neighborArray[x+1][y+1] += 1;
+          }
+        }
+        if (y != 0) {
+          neighborArray[x][y-1] += 1;
+        }
+        if (y != 63){
+          neighborArray[x][y+1] += 1;
+        }
+      }
+    }
+  }
+  int arrayIndex;
+  for (int y = 0;y < 64; y++) {
+    for (int x = 0; x < 128; x++) {
+      arrayIndex = x + (y/8*8)*16;
+      if (neighborArray[x][y] == 3) {
+        array[arrayIndex] |= (1<<(y%8));
+      } else if (neighborArray[x][y] == 2) {
+        continue;
+      } else {
+        array[arrayIndex] &= ~(1<<(y%8));
+      }
+    }
+  }
+}
+
+//Is this used anywhere?
+void random (unsigned char * array) {
+  for (int y = 0;y < 64; y += 8) {
+    for (int x = 0; x < 128; x++) {
+      array[x + y*16] = (unsigned char) rand();
+    }
+  }
+}
\ No newline at end of file