SimpleLib_03272011

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mbedgc.cpp Source File

mbedgc.cpp

00001 #include "mbed.h"
00002 #include "mbedGC/mbedgc.h"
00003 #include "Snake.h"
00004 #include "sprites.h"
00005 #include <string>
00006 #include "EthernetNetIf.h"
00007 #include "HTTPClient.h"
00008 
00009 EthernetNetIf eth; 
00010 
00011 void apples(int);
00012 void startGame();
00013 void endGame();
00014 int networking();
00015 
00016 void drawNumbers(int, int, unsigned char, int);
00017 void drawStrings(int, int, unsigned char, string);
00018 Snake snake;
00019 int snake_x = 60;
00020 int snake_y = 10;
00021 int snake_direction = 0;
00022 int snake_length = 10;
00023 int snake_apples_eaten = 0;
00024 float logic_percent = 0;
00025 int score = 0;
00026 unsigned char snake_color = 192;
00027 
00028 bool game_paused = false;
00029 bool faster = false;
00030 
00031 const int num_apples = 10;
00032 
00033 
00034 int main() {
00035 
00036 //    networking();
00037  
00038     blankFB(); 
00039     soundNoteHalf = 0;
00040    
00041     NVIC_SetPriority(TIMER0_IRQn, 0);
00042 
00043     COLOR_INIT();
00044     TIMER0_INIT();
00045     TIMER0_SETPCLK(CCLK4);
00046     TIMER0_SETPRESCALE(3000); // 3000 : 134
00047     TIMER0_SETMATCH(0, 132);
00048     TIMER0_SETMATCHCONTROL(0, MATCH_RESET | MATCH_INTERRUPT); // Reset and Interrupt each 100ms
00049     TIMER0_ENABLE_INTERRUPT();
00050     TIMER0_START();
00051 
00052     setup();
00053     
00054     while (1){
00055         loop();
00056         
00057         if (hsync_count > 0xFFFFF)
00058             hsync_count = 0x80000;
00059      
00060          logic_count++;
00061         
00062        if (logic_count > 0xFFFFFF)
00063             logic_count = 0;
00064     }
00065     
00066 }
00067 
00068 void drawRectangle(int x, int y, int width, int height, unsigned char color) 
00069 {
00070         
00071         if (x < 0 || y < 0)
00072             return; 
00073             
00074         for (int i = 0; i < height; i++) 
00075         {
00076 
00077                for (int j = 0; j < width; j++) 
00078                {
00079                                                                 
00080                     framebuffer[ (y + i) % fbH ][ (x + j) % fbW ] = color;
00081                     
00082                }
00083         }
00084 }
00085 
00086 void drawCharacter(int x, int y, unsigned char color, char ch) {
00087    
00088     if (ch <= 'z' && ch >= 'a')
00089         ch = ch - 'a' + 10;
00090     else if (ch <= 'Z' && ch >= 'A')
00091         ch = ch - 'A' + 10;   
00092     else if (ch <= '9' && ch >= '0')
00093             ch = ch - '0';
00094     else if (ch == ' ')
00095         ch = 36;
00096     else if (ch == '.')
00097         ch = 37;
00098         
00099     for (int i = 0; i < 5; i++) {
00100 
00101         unsigned char buf = alphabet[ch][i];
00102         
00103   //      buf = numbers[ch][i] << 3;
00104         
00105         for (int j = 4; j >= 0; j--) {
00106             
00107             framebuffer[(y + i) % fbH ][ (x + j) % fbW ] = (buf % 2) * color;
00108             buf = ( buf >> 1 );
00109         }
00110             
00111         y %= fbH;
00112         
00113     }
00114 }
00115 
00116 
00117 void fill(unsigned char val) 
00118 {
00119 
00120     for (int i = 0; i < fbH; i++) 
00121     {
00122  
00123         for (int j = 0; j < fbW; j++) 
00124         {
00125             framebuffer[i][j] = val;
00126         }
00127     }
00128 
00129 }
00130 
00131 void blankFB() 
00132 {
00133 
00134     for (int i = 0; i < fbH; i++) 
00135     {
00136         for (int j = 0; j < fbW; j++) 
00137         {
00138             framebuffer[i][j] = 0;
00139         }
00140     }
00141 
00142 }
00143 
00144 TIMER0_INTERRUPT_HANDLER(void)
00145 {
00146     TIMER0_CLEAR_INTERRUPT(MR0_INT);
00147     
00148     vSync = 1;
00149     for( int i = 0; i < fbH * 2; i++ )
00150     {
00151         COLOR_SET(0);
00152         hSync = 0;
00153         
00154         for (int tmp = 0; tmp < 90; tmp++) { // 206
00155             __nop();
00156         }
00157       
00158         hSync = 1;
00159         
00160         for (int tmp = 0; tmp < 110; tmp++) { // 206
00161             __nop();
00162         } 
00163         
00164         for( int j = 0; j < fbW; j++ )
00165         {
00166             unsigned char bp = framebuffer[ i / 2 ][ j ];
00167             COLOR_SET(bp);
00168             
00169             soundPin = (hsync_count % soundNote < soundNoteHalf) ? 1 : 0;
00170             
00171             hsync_count++;
00172             
00173             __nop();
00174             __nop();
00175             __nop();    
00176             __nop();
00177             __nop();    
00178             __nop();
00179             __nop();
00180         } 
00181     }
00182     COLOR_SET(0);  
00183     
00184     __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  __nop();  //__nop();
00185 //    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
00186     
00187     vSync = 0;
00188 
00189 }
00190 
00191 int getButton(WiiClassicControllerReader* const ctrlr)
00192 {
00193     //int bufSize = 0;
00194     //char* bufPtr = NULL;
00195     ctrlr->RequestRead();
00196         
00197     bool up = !ctrlr->getButtonDU();
00198     if (up)   return 2;
00199     
00200     bool down = !ctrlr->getButtonDD();
00201     if (down) return 0;
00202     
00203     bool left = !ctrlr->getButtonDL();
00204     if (left) return 3;
00205     
00206     bool right = !ctrlr->getButtonDR(); 
00207     if (right) return 1;
00208     
00209     if (!ctrlr->getButtonSTART()) {
00210         game_paused = !game_paused;
00211         wait(0.5);
00212     }
00213     
00214     return -1;
00215 }
00216 
00217 // MBEDGC SNAKE BY J.P. ARMSTRONG WWW.JPARMSTRONG.COM
00218 // LICENSED UNDER GNU PUBLIC LICENSE.
00219 
00220 void setup() 
00221 {  
00222         
00223     drawStrings(28, 50, 28, "MBEDGC.COM");
00224     
00225     drawStrings(10, 70, 192, "JP. YIGAL. DANNY.");
00226     drawStrings(12, 78, 192, "SHAIN. ALFREDO.");
00227 
00228     wait(3);
00229     blankFB();
00230     
00231     drawStrings(30, 50, 192, "FIU SENIOR");
00232     drawStrings(28, 58, 192, "DESIGN 2011");
00233 
00234     wait(3);
00235     blankFB();
00236     startGame();
00237 }
00238 
00239 void loop() 
00240 {
00241     // KEEP THE SNAKE IN THE FRAMEBUFFER.
00242     // IF IT'S CORD ARE BEYOND THE FRAMEBUFFER. ADJUST IT. 
00243     if (snake_y <= 0)
00244         snake_y = fbH - 1;
00245     
00246     if (snake_x <= 0)
00247         snake_x = fbW - 1;
00248         
00249     snake_y %= fbH;
00250     snake_x %= fbW;
00251     
00252     // GET VALUE FROM CONTROLLER
00253     int tmp_sd;
00254     do {
00255        tmp_sd = getButton(&ctrlrA);
00256     }
00257     while (game_paused);
00258     
00259     // MAKE SURE BUTTON WAS PRESSED OTHERWISE IGNORE IT.
00260     if (tmp_sd != -1) {
00261             
00262         // YOU CAN'T GO LEFT IF YOU'RE ALREADY GOING RIGHT AND VICE VERSA
00263         // YOU CAN'T GO   UP IF YOU'RE ALREADY GOING DOWN AND VICE VERSA
00264         if (!((snake_direction == 0 && tmp_sd == 2) || (snake_direction == 2 && tmp_sd == 0) ||
00265               (snake_direction == 3 && tmp_sd == 1) || (snake_direction == 1 && tmp_sd == 3)  )) {
00266             snake_direction = tmp_sd;
00267         }
00268     }
00269     
00270     // PRODUCE NO SOUND
00271     soundNoteHalf = 0;
00272     
00273     // INCREMENT OR DECREMENT SNAKE'S COORD DEPENDING ON DIRECTION
00274     switch (snake_direction) 
00275     {
00276         case 0:
00277             snake_y += 2;
00278             break;
00279         case 2:
00280             snake_y -= 2;
00281             break;
00282         case 1:
00283             snake_x += 2;
00284             break;
00285         case 3:
00286             snake_x -= 2;
00287             break;
00288     }
00289     
00290     // IF LOCATION SNAKE IS GOING IS AN APPLE. EAT IT.
00291     if (framebuffer[snake_y][snake_x] == 3) {
00292     
00293         snake_apples_eaten++;
00294         snake_length += 2;
00295         
00296         // DECREASE COUNTDOWN TIMER
00297         logic_count -= 50;
00298         
00299         if (logic_count < 0)
00300             logic_count = 0;
00301         
00302         score += 5;
00303         
00304         // BEEP
00305         soundNote = 3100;
00306         soundNoteHalf = 1550;
00307         
00308         // IF NO MORE APPLES ADD N MORE. "NEW LEVEL"
00309         if (snake_apples_eaten % num_apples == 0) {
00310             
00311             score += (snake_apples_eaten / 10) * (100 - 100 * ((float) logic_count / 1000));
00312             
00313             soundNote = 2000;
00314             soundNoteHalf = 1000;
00315         
00316             apples(num_apples);
00317            
00318         }
00319         
00320         drawNumbers(36, 105, 16, score);
00321         
00322     }
00323     // IF NOT AN APPLE, AND NOT EMPTY SPACE, THE SNAKE EITHER
00324     // HIT THE WALL OR IT ITSELF AND THE GAME IS LOST.
00325     else if (framebuffer[snake_y][snake_x] != 0) {
00326        
00327         
00328         endGame();
00329         startGame();
00330          
00331        
00332     }
00333     else {
00334         soundNote = 4000;
00335         soundNoteHalf = 0;
00336     }
00337     
00338     // ADVANCE THE SNAKE TO NEW POSITION
00339     snake.addHead(snake_x, snake_y);
00340     drawRectangle(snake_x, snake_y, 2, 2, snake_color);
00341       
00342     // REMOVE THE TAIL UNLESS IT ATE AN APPLE.
00343     while (snake_length <= snake.getSize()) { 
00344         drawRectangle(snake.getTailXCor(), snake.getTailYCor(), 2, 2, 0);
00345         snake.removeTail();
00346     }
00347     
00348     
00349     // COUNT DOWN
00350     logic_percent = (float) logic_count / 1000 ;
00351     drawRectangle(60, 106, 48, 4 , 0); 
00352      
00353     if ((logic_percent * 100) < 75.0) {
00354         drawRectangle(60, 106, 48 - 48 * logic_percent, 4 , 192); 
00355     }
00356     else {
00357     
00358         if ((logic_percent * 100) > 100) {
00359             endGame();
00360             startGame();
00361          }
00362         else {
00363           drawRectangle(60, 106, 48 - 48 * logic_percent, 4 , 3);
00364         }
00365         
00366         if (logic_count % 20 == 0) {
00367             soundNote = 4000;
00368             soundNoteHalf = 2000;
00369         }
00370         else {
00371             soundNoteHalf = 0;
00372         }
00373    }
00374 
00375    // ADD DELAY TO THE LOGIC
00376    wait(0.05);
00377 }
00378 
00379 // SETUP A NEW GAME
00380 void startGame() {
00381 
00382         // blank framebuffer
00383         blankFB();
00384         
00385         // initialization variables
00386         snake_x = 60;
00387         snake_y = 12;
00388         snake_direction = 0;    
00389         snake_apples_eaten = 0;
00390         snake_length = 10;
00391         score = 0;
00392 
00393         
00394         // add apples
00395         apples(num_apples);
00396         
00397         // add head to beginning of snake linked list
00398         snake.addHead(snake_x, snake_y);
00399 
00400         
00401         // BLUE BORDERS
00402         drawRectangle(4, 10, 2, 90, 16);
00403         drawRectangle(4, 10, 104, 2, 16);
00404         
00405         drawRectangle(108, 10, 2, 90, 16);
00406         drawRectangle(4, 100, 106, 2, 16);
00407         
00408         // COUNTDOWN
00409         drawRectangle(59, 105, 50, 6 , 16); 
00410         drawRectangle(60, 106, 48, 4 , 0); 
00411         
00412         logic_count = 0;
00413         
00414            
00415        drawNumbers(36, 105, 16, score);
00416      
00417 }
00418 
00419 void endGame() {
00420     // blankFB();
00421      
00422      soundNote = 4000;
00423      soundNoteHalf = soundNote / 2;
00424         
00425      wait(0.1); 
00426         
00427      soundNoteHalf = 0;
00428  
00429      
00430      drawStrings(30, 40, 192, "GAME OVER");
00431      drawStrings(28, 50, 192, "MBEDGC.COM");
00432      drawNumbers(73, 60, 192, score);
00433   
00434   wait(3);
00435   blankFB();
00436   wait(0.1);
00437       
00438   LocalFileSystem local("local");               // Create the local filesystem under the name "local"
00439 
00440   FILE *fp = fopen("/local/hs.txt", "a");  // Open "out.txt" on the local file system for writing
00441   
00442   char buf[16];
00443   sprintf(buf, "AMS\t%05d\r\n", score);
00444   fprintf(fp, buf);
00445   
00446   fclose(fp);
00447 
00448 }
00449 
00450 void drawStrings(int x, int y, unsigned char color, string str) {
00451     
00452         for (int i = 0; i < str.size(); i++) {
00453             drawCharacter( x + (6 * i), y, color, str[i]);
00454         }
00455     
00456 }
00457 
00458 void drawNumbers(int x, int y, unsigned char color, int num) {
00459        
00460         for (int i = 1; i <= 5; i++) {
00461             drawCharacter( x - (6 * i), y, color, num % 10);
00462             num /= 10;
00463         }
00464 }
00465 
00466 // ADD N APPLES TO THE SCREEN
00467 void apples(int number) {
00468     
00469     int i = 0;
00470     int x = 0, y = 0;
00471     
00472     do  {
00473        x = 2 * (rand() % (90 / 2)) + 6;
00474        y = 2 * (rand() % (86 / 2)) + 12;
00475        
00476        // MAKE SURE YOU DON'T ADD AN APPLE ON THE SNAKE OR WALL
00477        if (framebuffer[y][x] == 0) {
00478           drawRectangle(x, y, 2 , 2, 3);
00479           i++;
00480        }
00481        
00482     }
00483     while (i < number);
00484 }
00485 
00486 
00487 DigitalOut mled0(LED1);
00488 DigitalOut mled1(LED2);
00489 DigitalOut mled2(LED3);
00490 DigitalOut mled3(LED4);
00491 
00492 
00493 int networking() {
00494         
00495   mled0 = 1;
00496   
00497   printf("Init\n");
00498 
00499   printf("\r\nSetting up...\r\n");
00500   EthernetErr ethErr = eth.setup();
00501   
00502   mled1 = 1;
00503   
00504   if(ethErr)
00505   {
00506     printf("Error %d in setup.\n", ethErr);
00507   }
00508   mled2 = 1;
00509   printf("\r\nSetup OK\r\n");
00510 
00511   HTTPClient twitter;
00512   mled1 = 0;
00513   
00514   HTTPMap msg;
00515   mled0 = 0;
00516   msg["status"] = "I am tweeting from my mbedgc!"; //A good example of Key/Value pair use with Web APIs
00517 
00518   twitter.basicAuth("mbedgc", "mbgc321"); //We use basic authentication, replace with you account's parameters
00519   mled0 = 1;
00520  
00521   //No need to retieve data sent back by the server
00522   HTTPResult r = twitter.post("http://api.supertweet.net/1/statuses/update.xml", msg, NULL);
00523    
00524   if( r == HTTP_OK )
00525   {
00526     printf("Tweet sent with success!\n");
00527     
00528     mled3 = 1;
00529   }
00530   else
00531   {
00532     printf("Problem during tweeting, return code %d\n", r);
00533     mled2 = 0;
00534   }
00535   
00536   return 0;
00537 }