dashboardv4solarboat

Dependencies:   mbed

Fork of mbed_blinky by Mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers oled_driver.h Source File

oled_driver.h

00001 #include "oled_characters.h"    //all OLED chars + logos
00002 
00003 #define PI 3.141592
00004 #define SPI_FREQUENCY 5000000
00005 
00006 //digital outputs and SPI
00007 SPI spi(PB_15, NC, PB_13);     // mosi, miso, sclk
00008 DigitalOut RST(PB_12);         //reset                             0: reset        1: normal operation
00009 DigitalOut DC(PA_10);          //set input as data or command      0: command      1: data
00010 
00011 DigitalOut battery_temp_alert_led(PC_1);
00012 DigitalOut motor_temp_alert_led(PA_8);
00013 DigitalOut battery_low_alert_led(PB_10);
00014 DigitalOut fly_ready_led(PB_0);
00015 
00016 DigitalOut CS_1(PB_3);        //chipSelect                        0: selected     1: not selected
00017 DigitalOut CS_2(PB_5);        //chipSelect                        0: selected     1: not selected
00018 DigitalOut CS_3(PB_4);        //chipSelect                        0: selected     1: not selected
00019 
00020 bool error_alert;                           //internal error booleaan
00021 
00022 bool motor_temp_alert = true;               //LED1                      E01         motor temperature too high
00023 bool battery_temp_alert = true;             //LED2                      E02         battery temperature too high
00024 bool battery_low_alert = true;              //LED3                      E03         battery low power alert
00025 bool fly_ready_alert = true;                //LED4                      E04         ready for flying
00026 bool voltage_in_low = true;                 //DISPLAY                   E05         solar panel voltage is low
00027 bool communication_not_working = true;      //DISPLAY                   E06         communication (FONA) not working
00028 bool dummy_1 = true;                        //DISPLAY                   E07         descr.
00029 bool dummy_2 = true;                        //DISPLAY                   E08         descr.
00030 bool dummy_3 = true;                        //DISPLAY                   E09         descr.
00031 bool dummy_4 = true;                        //DISPLAY                   E10         descr.
00032 bool dummy_5 = true;                        //DISPLAY                   E11         descr.
00033 bool dummy_6 = true;                        //DISPLAY                   E12         descr.
00034 bool dummy_7 = true;                        //DISPLAY                   E13         descr.
00035 bool dummy_8 = true;                        //DISPLAY                   E14         descr.
00036 
00037 void drawPixel(int screen_number, uint8_t row, uint8_t col, uint8_t brightness);
00038 void writeNumber(int screen_number, int input_number, char row, char col, int digits, bool large);
00039 void writeLetter(int screen_number, char input, int row, int col);
00040 void drawBitmap(int screen_number, int number, char row, char col, int width, int height);
00041 void updateBatteryBar(int screen_number, int percentage, int row, int col, int width, int height);
00042 void clearDisplay(int screen_number);
00043 
00044 void command(int screen_number, uint8_t c)
00045 {
00046     CS_1 = 1;
00047     CS_2 = 1;
00048     CS_3 = 1;
00049 
00050     DC = 0;
00051 
00052     if (screen_number == 1) CS_1 = 0;
00053     else if (screen_number == 2) CS_2 = 0;
00054     else if (screen_number == 3) CS_3 = 0;
00055 
00056     spi.write(c);
00057 
00058     CS_1 = 1;
00059     CS_2 = 1;
00060     CS_3 = 1;
00061 };
00062 
00063 void data(int screen_number, uint8_t c)
00064 {
00065     CS_1 = 1;
00066     CS_2 = 1;
00067     CS_3 = 1;
00068 
00069     DC = 1;
00070 
00071     if (screen_number == 1) CS_1 = 0;
00072     else if (screen_number == 2) CS_2 = 0;
00073     else if (screen_number == 3) CS_3 = 0;
00074 
00075     spi.write(c);
00076 
00077     CS_1 = 1;
00078     CS_2 = 1;
00079     CS_3 = 1;
00080 };
00081 
00082 void powerOnOLED(int screen_number)
00083 {
00084     if (screen_number == 2) spi.format(8,0);       //SQUARE
00085     else spi.format(8,3);                          //CIRCULAR
00086     spi.frequency(SPI_FREQUENCY);
00087 
00088     //internal Vdd regulator on
00089     command(1, 0xAB);
00090     command(1, 0x01);
00091     command(3, 0xAB);
00092     command(3, 0x01);
00093 
00094     //give reset
00095     wait(0.1);
00096     RST = 0;
00097     wait(0.1);
00098     RST = 1;
00099 
00100     //display on, normal mode
00101     command(1, 0xAF);
00102     command(1, 0xA4);
00103     command(2, 0xAF);
00104     command(2, 0xA4);
00105     command(3, 0xAF);
00106     command(3, 0xA4);
00107 
00108     //Enable COM remap
00109     command(1, 0xA0);
00110     command(1, 0b01000000);
00111     command(2, 0xA0);
00112     command(2, 0b01000011);
00113     command(3, 0xA0);
00114     command(3, 0b01000000);
00115 }
00116 
00117 void welcomeScreen()
00118 {
00119     //dickbutt
00120     drawBitmap(1, 75, 5, 5, 50, 100);
00121     drawBitmap(3, 75, 5, 5, 50, 100);
00122     //solar boat logo
00123     drawBitmap(2, 74, 10, 0, 64, 64);
00124     wait(0.05);
00125     writeLetter(2, 'S', 12, 60);
00126     wait(0.05);
00127     writeLetter(2, 'o', 12, 56);
00128     wait(0.05);
00129     writeLetter(2, 'l', 12, 52);
00130     wait(0.05);
00131     writeLetter(2, 'a', 12, 48);
00132     wait(0.05);
00133     writeLetter(2, 'r', 12, 44);
00134     wait(0.05);
00135     writeLetter(2, 'B', 12, 38);
00136     wait(0.05);
00137     writeLetter(2, 'o', 12, 34);
00138     wait(0.05);
00139     writeLetter(2, 'a', 12, 30);
00140     wait(0.05);
00141     writeLetter(2, 't', 12, 26);
00142     wait(0.05);
00143     writeLetter(2, 'T', 12, 20);
00144     wait(0.05);
00145     writeLetter(2, 'w', 12, 16);
00146     wait(0.05);
00147     writeLetter(2, 'e', 12, 12);
00148     wait(0.05);
00149     writeLetter(2, 'n', 12, 8);
00150     wait(0.05);
00151     writeLetter(2, 't', 12, 4);
00152     wait(0.05);
00153     writeLetter(2, 'e', 12, 0);
00154     wait(0.05);
00155 
00156     clearDisplay(1);
00157     clearDisplay(2);
00158     clearDisplay(3);
00159 
00160     //LEDs standard on (1)
00161     motor_temp_alert_led = 1;
00162     battery_temp_alert_led = 1;
00163     battery_low_alert_led = 1;
00164     fly_ready_led = 1;
00165 }
00166 
00167 void resetOLED()
00168 {
00169     wait(0.1);
00170     RST = 0;
00171     wait(0.1);
00172     RST = 1;
00173 }
00174 
00175 void displayData1(int rpm_motor, int battery_temperature, int motor_temperature, int voltage_in, int power_out, int power_in)
00176 {
00177     if (rpm_motor < 1) rpm_motor = 0;
00178     if (battery_temperature < 1) battery_temperature = 0;
00179     if (motor_temperature < 1) motor_temperature = 0;
00180     if (voltage_in < 1) voltage_in = 0;
00181     if (power_in < 1) power_in = 0;
00182     if (power_out < 1) power_out = 0;
00183 
00184     writeLetter(2, 'P', 66, 59);
00185     writeLetter(2, 'i', 66, 55);
00186     writeLetter(2, 'n', 66, 51);
00187     writeLetter(2, ':', 66, 47);
00188 
00189     writeNumber(2, power_in, 66, 13, 5, false);
00190     writeLetter(2, 'W', 66, 0);
00191 
00192     writeLetter(2, 'P', 56, 59);
00193     writeLetter(2, 'o', 56, 55);
00194     writeLetter(2, 'u', 56, 51);
00195     writeLetter(2, 't', 56, 47);
00196     writeLetter(2, ':', 56, 43);
00197 
00198     writeNumber(2, power_out, 56, 13, 5, false);
00199     writeLetter(2, 'W', 56, 0);
00200 
00201     writeLetter(2, 'V', 46, 59);
00202     writeLetter(2, 'i', 46, 55);
00203     writeLetter(2, 'n', 46, 51);
00204     writeLetter(2, ':', 46, 47);
00205 
00206     writeNumber(2, voltage_in, 46, 13, 5, false);
00207     writeLetter(2, 'm', 46, 4);
00208     writeLetter(2, 'V', 46, 0);
00209 
00210     writeLetter(2, 'T', 36, 59);
00211     writeLetter(2, 'm', 36, 55);
00212     writeLetter(2, 'o', 36, 51);
00213     writeLetter(2, 't', 36, 47);
00214     writeLetter(2, ':', 36, 43);
00215 
00216     writeNumber(2, motor_temperature, 36, 13, 3, false);
00217     writeLetter(2, '*', 36, 4);
00218     writeLetter(2, 'C', 36, 0);
00219 
00220     writeLetter(2, 'T', 26, 59);
00221     writeLetter(2, 'b', 26, 55);
00222     writeLetter(2, 'a', 26, 51);
00223     writeLetter(2, 't', 26, 47);
00224     writeLetter(2, ':', 26, 43);
00225 
00226     writeNumber(2, battery_temperature, 26, 13, 3, false);
00227     writeLetter(2, '*', 26, 4);
00228     writeLetter(2, 'C', 26, 0);
00229 
00230     writeLetter(2, 'N', 16, 59);
00231     writeLetter(2, 'm', 16, 55);
00232     writeLetter(2, 'o', 16, 51);
00233     writeLetter(2, 't', 16, 47);
00234     writeLetter(2, ':', 16, 43);
00235 
00236     writeNumber(2, rpm_motor, 16, 13, 4, false);
00237     writeLetter(2, 'r', 16, 8);
00238     writeLetter(2, 'p', 16, 4);
00239     writeLetter(2, 'm', 16, 0);
00240 }
00241 
00242 void displayData2(int battery_voltage, int battery_temperature, int motor_temperature, int voltage_in, int power_out, int power_in)
00243 {
00244     if (battery_voltage < 1) battery_voltage = 0;
00245 
00246     writeLetter(2, 'V', 66, 59);
00247     writeLetter(2, 'b', 66, 55);
00248     writeLetter(2, 'a', 66, 51);
00249     writeLetter(2, 't', 66, 47);
00250     writeLetter(2, ':', 66, 43);
00251 
00252     writeNumber(2, battery_voltage, 66, 13, 5, false);
00253     writeLetter(2, 'm', 66, 4);
00254     writeLetter(2, 'V', 66, 0);
00255 
00256 }
00257 
00258 void checkForErrors(int current_menu, int velocity, int battery_temperature, int motor_temperature, int MAX_TEMP_MOTOR, int MAX_TEMP_BATTERY, int battery_percentage_left, int battery_minutes_left, int BATTERY_LOW_ALERT)
00259 {
00260     int amount_of_errors = 0;
00261 
00262     //------------------------------CONDITIONS FOR ERRORS----------------------------------------------
00263     //errors on LEDs (4x), also display in error overview, last LED end of function
00264     if (battery_temperature > MAX_TEMP_BATTERY) battery_temp_alert = true;                                                  //battery temperature too high LED
00265     else battery_temp_alert = false;
00266     if (motor_temperature > MAX_TEMP_MOTOR) motor_temp_alert = true;                                                        //motor temperature too high LED
00267     else motor_temp_alert = false;
00268     if (battery_percentage_left <= BATTERY_LOW_ALERT || battery_minutes_left <= BATTERY_LOW_ALERT) battery_low_alert = true;//battery low LED
00269     else battery_low_alert = false;
00270     if (velocity > 20) fly_ready_alert = true;                                                                           //Errors exist LED
00271     else fly_ready_alert = false;
00272     //------------------------------END CONDITIONS FOR ERRORS-----------------------------------------
00273 
00274     //------------------------------REACTIONS FOR ERRORS----------------------------------------------
00275     //set essential LEDs for significant errors
00276     if (motor_temp_alert) motor_temp_alert_led = 1;
00277     else motor_temp_alert_led = 0;
00278     if (battery_temp_alert) battery_temp_alert_led = 1;
00279     else battery_temp_alert_led = 0;
00280     if (battery_low_alert) battery_low_alert_led = 1;
00281     else battery_low_alert_led = 0;
00282     if (fly_ready_alert) fly_ready_led = 1;
00283     else fly_ready_led = 0;
00284     //------------------------------END REACTIONS FOR ERRORS-----------------------------------------
00285 
00286     //count errors for main screen
00287     if (current_menu == 0) {
00288         if (motor_temp_alert) amount_of_errors++;
00289         if (battery_temp_alert) amount_of_errors++;
00290         if (battery_low_alert) amount_of_errors++;
00291     }
00292     /*
00293     //if in error screen display ALL errors
00294     if (current_menu == 1) {
00295         writeLetter(2, 'E', 66, 59);
00296         writeLetter(2, 'r', 66, 55);
00297         writeLetter(2, 'r', 66, 51);
00298         writeLetter(2, 'o', 66, 47);
00299         writeLetter(2, 'r', 66, 43);
00300         writeLetter(2, 's', 66, 39);
00301         writeLetter(2, ':', 66, 35);
00302 
00303         if (motor_temp_alert) {
00304             writeLetter(2, 'E', 57 - (10*amount_of_errors), 59);
00305             writeNumber(2, 1, 57 - (10*amount_of_errors), 55, 1, false);
00306             amount_of_errors++;
00307         }
00308         if (battery_temp_alert) {
00309             writeLetter(2, 'E', 57 - (10*amount_of_errors), 59);
00310             writeNumber(2, 2, 57 - (10*amount_of_errors), 55, 1, false);
00311             amount_of_errors++;
00312         }
00313         if (battery_low_alert) {
00314             writeLetter(2, 'E', 57 - (10*amount_of_errors), 59);
00315             writeNumber(2, 3, 57 - (10*amount_of_errors), 55, 1, false);
00316             amount_of_errors++;
00317         }
00318         //if (error_alert) {
00319     //            writeLetter(2, 'E', 57 - (10*amount_of_errors), 59);
00320     //            writeNumber(2, 4, 57 - (10*amount_of_errors), 55, 1, false);
00321     //            amount_of_errors++;
00322     //        }
00323 
00324         for (int j = amount_of_errors; j <= 25; j++) {
00325             if (j < 6) {
00326                 writeLetter(2, ' ', 57 - (10*j), 59);
00327                 writeLetter(2, ' ', 57 - (10*j), 55);
00328             }
00329             //else if (j > 5 && j < 11) writeLetter(2, ' ', 64 - (10*(j-5)), 47);
00330     //        else if (j > 10 && j < 16) writeLetter(2, ' ', 64 - (10*(j-10)), 35);
00331     //        else if (j > 15 && j < 21) writeLetter(2, ' ', 64 - (10*(j-15)), 23);
00332     //        else if (j > 20 && j < 26) writeLetter(2, ' ', 64 - (10*(j-20)), 11);
00333         }
00334 
00335         if (amount_of_errors < 1) {
00336             amount_of_errors = 0;
00337             error_alert = false;
00338         } else error_alert = true;
00339         if (amount_of_errors < 25) writeLetter(2, ' ', 66, 0);
00340         else if (amount_of_errors > 25) {
00341             amount_of_errors = 25;
00342             writeLetter(2, '+', 66, 0);
00343         }
00344         writeNumber(2, amount_of_errors, 66, 4, 2, false);
00345     }
00346     if (current_menu == 0 && error_alert) {
00347         //draw alert logo if errors
00348         drawBitmap(2, 91, 64, 48, 7, 10);
00349     } else if (current_menu == 0 && !error_alert) {
00350         //clear if no errors
00351         drawBitmap(2, 92, 64, 48, 7, 10);
00352     } */
00353 }
00354 
00355 void showBatteryMinutesLeft(int battery_minutes_left)
00356 {
00357     if (battery_minutes_left < 1) battery_minutes_left = 0;
00358     //show minutes left
00359     writeNumber(3, battery_minutes_left, 55, 20, 3, true);
00360 
00361     writeLetter(3, 'm', 60, 13);
00362     writeLetter(3, 'i', 60, 9);
00363     writeLetter(3, 'n', 60, 5);
00364 }
00365 
00366 void showBatteryPercentageLeft(int battery_percentage_left)
00367 {
00368     if (battery_percentage_left > 99) battery_percentage_left = 100;
00369     else if (battery_percentage_left < 0) battery_percentage_left = 0;
00370 
00371     //show percentage left
00372     writeNumber(3, battery_percentage_left, 85, 20, 3, true);
00373 
00374     //drawBitmap(1, 91, 85, 10, 10, 20);
00375     writeLetter(3, '%', 90, 13);
00376 
00377     //show battery logo
00378     for (int i = 18; i <= 35; i++) {
00379         drawPixel(3, i, 18, 0x0F);
00380     }
00381     for (int i = 18; i <= 35; i++) {
00382         drawPixel(3, i, 45, 0xF0);
00383     }
00384     for (int i = 18; i <= 45; i++) {
00385         drawPixel(3, 18, i, 0xFF);
00386     }
00387     for (int i = 18; i <= 45; i++) {
00388         drawPixel(3, 36, i, 0xFF);
00389     }
00390     for (int i = 22; i <= 31; i++) {
00391         drawPixel(3, i, 16, 0xF0);
00392     }
00393     drawPixel(3, 22, 17, 0xFF);
00394     drawPixel(3, 31, 17, 0xFF);
00395 
00396     //drawBitmap(1, 75, 15, 20, 30, 24);
00397     updateBatteryBar(3, battery_percentage_left, 20, 18, 26, 15);
00398 }
00399 
00400 void showRaceMinutesDone(int race_minutes_done)
00401 {
00402     if (race_minutes_done < 1) race_minutes_done = 0;
00403     //show minutes left
00404     writeNumber(1, race_minutes_done, 85, 20, 3, true);
00405 
00406     writeLetter(1, 'm', 90, 13);
00407     writeLetter(1, 'i', 90, 9);
00408     writeLetter(1, 'n', 90, 5);
00409 }
00410 
00411 void showRaceMinutesLeft(int race_minutes_left)
00412 {
00413     if (race_minutes_left < 1) race_minutes_left = 0;
00414     //show minutes left
00415     writeNumber(1, race_minutes_left, 25, 20, 3, true);
00416 
00417     writeLetter(1, 'm', 30, 13);
00418     writeLetter(1, 'i', 30, 9);
00419     writeLetter(1, 'n', 30, 5);
00420 }
00421 
00422 void showRacePercentageLeft(int race_percentage_left)
00423 {
00424     if (race_percentage_left > 99) race_percentage_left = 100;
00425     else if (race_percentage_left < 0) race_percentage_left = 0;
00426 
00427     //show percentage left
00428     writeNumber(1, race_percentage_left, 55, 20, 3, true);
00429     writeLetter(1, '%', 60, 13);
00430 }
00431 
00432 void checkTransmitter(bool transmitting)
00433 {
00434     if (time(0) % 2 == 0) transmitting = !transmitting;
00435     if (transmitting) {
00436         writeLetter(2, 'T', 65, 12);
00437         writeLetter(2, 'x', 65, 8);
00438     } else {
00439         writeLetter(2, ' ', 65, 12);
00440         writeLetter(2, ' ', 65, 8);
00441     }
00442 }
00443 
00444 void displayTime()
00445 {
00446     //int seconds = (int) (time(NULL) % 60);
00447     int minutes = (int) ((time(NULL) / 60) % 60);
00448     int hours   = (int) ((time(NULL) / (60*60)) % 24);
00449 
00450     drawBitmap(2, hours / 10 % 10, 65, 39, 4, 7);
00451     drawBitmap(2, hours % 10, 65, 35, 4, 7);
00452     writeLetter(2, ':', 65, 31);
00453     drawBitmap(2, minutes / 10 % 10, 65, 27, 4, 7);
00454     drawBitmap(2, minutes % 10, 65, 23, 4, 7);
00455 }
00456 
00457 void displayAdvisedThrottle(int advised_throttle_power)
00458 {
00459 //    writeNumber(2, advised_throttle_power, 41, 31, 4, false);
00460 //    writeLetter(2, 'r', 41, 21);
00461 //    writeLetter(2, 'p', 41, 17);
00462 //    writeLetter(2, 'm', 41, 13);
00463 }
00464 
00465 void displayThrottle(int throttle_power, bool reverse)
00466 {
00467     writeNumber(2, throttle_power, 45, 31, 4, false);
00468     writeLetter(2, 'r', 45, 21);
00469     writeLetter(2, 'p', 45, 17);
00470     writeLetter(2, 'm', 45, 13);
00471 
00472     if (reverse) {
00473         writeLetter(2, 'R', 15, 31);
00474         //blink box around R
00475         if (time(0) % 2 == 0) {
00476             for (int i = 12; i < 25; i++) {
00477                 drawPixel(2, i, 30, 0xF0);
00478             }
00479             for (int i = 12; i < 25; i++) {
00480                 drawPixel(2, i, 35, 0xF0);
00481             }
00482             for (int i = 31; i <= 35; i++) {
00483                 drawPixel(2, 12, i, 0xFF);
00484             }
00485             for (int i = 31; i <= 35; i++) {
00486                 drawPixel(2, 24, i, 0xFF);
00487             }
00488         } else {
00489             for (int i = 12; i < 25; i++) {
00490                 drawPixel(2, i, 30, 0x00);
00491             }
00492             for (int i = 12; i < 25; i++) {
00493                 drawPixel(2, i, 35, 0x00);
00494             }
00495             for (int i = 31; i <= 35; i++) {
00496                 drawPixel(2, 12, i, 0x00);
00497             }
00498             for (int i = 31; i <= 35; i++) {
00499                 drawPixel(2, 24, i, 0x00);
00500             }
00501         }
00502     }
00503 
00504     else {
00505         for (int i = 12; i < 25; i++) {
00506             drawPixel(2, i, 30, 0xF0);
00507         }
00508         for (int i = 12; i < 25; i++) {
00509             drawPixel(2, i, 35, 0xF0);
00510         }
00511         for (int i = 31; i <= 35; i++) {
00512             drawPixel(2, 12, i, 0xFF);
00513         }
00514         for (int i = 31; i <= 35; i++) {
00515             drawPixel(2, 24, i, 0xFF);
00516         }
00517         writeLetter(2, 'D', 15, 31);
00518     }
00519 }
00520 void displayVelocity(int velocity)
00521 {
00522     if (velocity < 1) velocity = 0;
00523 
00524     writeNumber(2, velocity, 35, 31, 3, false);
00525     writeLetter(2, 'k', 35, 21);
00526     writeLetter(2, 'm', 35, 17);
00527     writeLetter(2, '/', 35, 13);
00528     writeLetter(2, 'h', 35, 9);
00529 }
00530 
00531 void writeLetter(int screen_number, char input, int row, int col)
00532 {
00533     int index_ = 63;
00534     if (input == 'a') index_ = 10;
00535     if (input == 'b') index_ = 11;
00536     if (input == 'c') index_ = 12;
00537     if (input == 'd') index_ = 13;
00538     if (input == 'e') index_ = 14;
00539     if (input == 'f') index_ = 15;
00540     if (input == 'g') index_ = 16;
00541     if (input == 'h') index_ = 17;
00542     if (input == 'i') index_ = 18;
00543     if (input == 'j') index_ = 19;
00544     if (input == 'k') index_ = 20;
00545     if (input == 'l') index_ = 21;
00546     if (input == 'm') index_ = 22;
00547     if (input == 'n') index_ = 23;
00548     if (input == 'o') index_ = 24;
00549     if (input == 'p') index_ = 25;
00550     if (input == 'q') index_ = 26;
00551     if (input == 'r') index_ = 27;
00552     if (input == 's') index_ = 28;
00553     if (input == 't') index_ = 29;
00554     if (input == 'u') index_ = 30;
00555     if (input == 'v') index_ = 31;
00556     if (input == 'w') index_ = 32;
00557     if (input == 'x') index_ = 33;
00558     if (input == 'y') index_ = 34;
00559     if (input == 'z') index_ = 35;
00560     if (input == 'A') index_ = 36;
00561     if (input == 'B') index_ = 37;
00562     if (input == 'C') index_ = 38;
00563     if (input == 'D') index_ = 39;
00564     if (input == 'E') index_ = 40;
00565     if (input == 'F') index_ = 41;
00566     if (input == 'G') index_ = 42;
00567     if (input == 'H') index_ = 43;
00568     if (input == 'I') index_ = 44;
00569     if (input == 'J') index_ = 45;
00570     if (input == 'K') index_ = 46;
00571     if (input == 'L') index_ = 47;
00572     if (input == 'M') index_ = 48;
00573     if (input == 'N') index_ = 49;
00574     if (input == 'O') index_ = 50;
00575     if (input == 'P') index_ = 51;
00576     if (input == 'Q') index_ = 52;
00577     if (input == 'R') index_ = 53;
00578     if (input == 'S') index_ = 54;
00579     if (input == 'T') index_ = 55;
00580     if (input == 'U') index_ = 56;
00581     if (input == 'V') index_ = 57;
00582     if (input == 'W') index_ = 58;
00583     if (input == 'X') index_ = 59;
00584     if (input == 'Y') index_ = 60;
00585     if (input == 'Z') index_ = 61;
00586     if (input == ';') index_ = 62;
00587     if (input == '-') index_ = 63;
00588     if (input == ':') index_ = 64;
00589     if (input == '+') index_ = 65;
00590     if (input == '/') index_ = 66;
00591     if (input == '%') index_ = 67;
00592     if (input == '?') index_ = 68;
00593     if (input == ',') index_ = 69;
00594     if (input == '(') index_ = 70;
00595     if (input == ')') index_ = 71;
00596     if (input == '.') index_ = 72;
00597     if (input == ' ') index_ = 73;
00598     //logos
00599     if (input == '*') index_ = 76;
00600 
00601     drawBitmap(screen_number, index_, row, col, 4, 7);
00602 }
00603 
00604 void writeNumber(int screen_number, int input_number, char row, char col, int digits, bool large)
00605 {
00606     unsigned int number_of_digits = 0;
00607     int counter = input_number;
00608 
00609     do {
00610         ++number_of_digits;
00611         counter /= 10;
00612     } while (counter);
00613 
00614     for (int i = 0; i < number_of_digits; i++) {
00615         int result = (int) pow((double) 10,i);
00616         if (large) drawBitmap(screen_number, 80 + (input_number / (result) % 10), row, col + (11*i), 10, 20);
00617         else drawBitmap(screen_number, input_number / (result) % 10, row, col + (4*i), 4, 7);
00618     }
00619     for (int i = number_of_digits; i < digits; i++) {
00620         if (large) drawBitmap(screen_number, 90, row, col + (11*i), 10, 20);
00621         else writeLetter(screen_number, ' ', row, col + (4*i));
00622     }
00623 }
00624 
00625 void drawPixel(int screen_number, uint8_t row, uint8_t col, uint8_t brightness)
00626 {
00627     command(screen_number, 0x15);
00628     command(screen_number, col);
00629     command(screen_number, col);
00630 
00631     command(screen_number, 0x75);
00632     command(screen_number, row);
00633     command(screen_number, row);
00634 
00635     data(screen_number, brightness);
00636 }
00637 
00638 void clearDisplay(int screen_number)
00639 {
00640     command(screen_number, 0x15);
00641     command(screen_number, 0x00);
00642     command(screen_number, 0xFF);
00643 
00644     command(screen_number, 0x75);
00645     command(screen_number, 0x00);
00646     command(screen_number, 0xFF);
00647 
00648     if (screen_number == 2) {
00649         for (int i = 0; i < (128*64); i++) {
00650             data(screen_number, 0x00);
00651         }
00652     } else {
00653         for (int i = 0; i < (128*128); i++) {
00654             data(screen_number, 0x00);
00655         }
00656     }
00657 }
00658 
00659 void updateProgressCircle(int screen_number, int percentage)
00660 {
00661     //circular battery percentage bar
00662     int radius = 31;
00663     for (double theta = 0; theta <= 0.01*percentage*2*PI; theta += 0.01) {
00664         drawPixel(screen_number, (64+2*radius*(cos(theta))), (32+radius*(sin(theta))), 0xFF);
00665     }
00666     for (double theta = 0.01*percentage*2*PI; theta <= 2*PI ; theta += 0.01) {
00667         drawPixel(screen_number, (64+2*radius*(cos(theta))), (32+radius*(sin(theta))), 0x00);
00668     }
00669 }
00670 
00671 void updatePowerBars(int power_out, int power_in, int MAX_POWER_OUT, int MAX_POWER_IN)
00672 {
00673     if (power_in < 1) power_in = 0;
00674     else if (power_in > MAX_POWER_IN) power_in = MAX_POWER_IN;
00675     if (power_out < 1) power_out = 0;
00676     else if (power_out > MAX_POWER_OUT) power_out = MAX_POWER_OUT;
00677 
00678     //draw Powerbars
00679     for (int i = 12; i < 74; i++) {
00680         drawPixel(2, i, 0, 0x0F);
00681     }
00682     for (int i = 12; i < 74; i++) {
00683         drawPixel(2, i, 4, 0xF0);
00684     }
00685     for (int i = 0; i <= 4; i++) {
00686         drawPixel(2, 12, i, 0xFF);
00687     }
00688     for (int i = 0; i <= 4; i++) {
00689         drawPixel(2, 73, i, 0xFF);
00690     }
00691     for (int i = 12; i < 74; i++) {
00692         drawPixel(2, i, 59, 0x0F);
00693     }
00694     for (int i = 12; i < 74; i++) {
00695         drawPixel(2, i, 63, 0xF0);
00696     }
00697     for (int i = 59; i <= 63; i++) {
00698         drawPixel(2, 12, i, 0xFF);
00699     }
00700     for (int i = 59; i <= 63; i++) {
00701         drawPixel(2, 73, i, 0xFF);
00702     }
00703 
00704 //    writeLetter(2 , 'P', 12, 55);
00705 //    writeLetter(2 , 'i', 12, 51);
00706 //    writeLetter(2 , 'n', 12, 47);
00707 //
00708 //    writeLetter(2 , 'P', 12, 17);
00709 //    writeLetter(2 , 'o', 12, 13);
00710 //    writeLetter(2 , 'u', 12, 9);
00711 //    writeLetter(2 , 't', 12, 5);
00712 
00713     writeLetter(2 , 'I', 12, 55);
00714     writeLetter(2 , 'n', 12, 51);
00715 
00716     writeLetter(2 , 'O', 12, 13);
00717     writeLetter(2 , 'u', 12, 9);
00718     writeLetter(2 , 't', 12, 5);
00719 
00720     //left hand side
00721     for (int i = 0; i < (58*power_in/MAX_POWER_IN); i++) {
00722         for (int j = 0; j < 3; j++) {
00723             drawPixel(2, 14 + i, 60 + j, 0xFF);
00724         }
00725     }
00726     for (int i = (58*power_in/MAX_POWER_IN); i <= 58; i++) {
00727         for (int j = 0; j < 3; j++) {
00728             drawPixel(2, 14 + i, 60 + j, 0x00);
00729         }
00730     }
00731     //right hand side
00732     for (int i = 0; i < (58*power_out/MAX_POWER_OUT); i++) {
00733         for (int j = 0; j < 3; j++) {
00734             drawPixel(2, 14 + i, 1 + j, 0xFF);
00735         }
00736     }
00737     for (int i = (58*power_out/MAX_POWER_OUT); i <= 58; i++) {
00738         for (int j = 0; j < 3; j++) {
00739             drawPixel(2, 14 + i, 1 + j, 0x00);
00740         }
00741     }
00742 }
00743 
00744 void updateBatteryBar(int screen_number, int percentage, int row, int col, int width, int height)
00745 {
00746     for (int i = 0; i < (percentage*width/100); i++) {
00747         for (int j = 0; j < height; j++) {
00748             drawPixel(screen_number, row + j, width + col - i, 0xFF);
00749         }
00750     }
00751     for (int i = (percentage*width/100); i < width; i++) {
00752         for (int j = 0; j < height; j++) {
00753             drawPixel(screen_number, row + j, width + col - i, 0x00);
00754         }
00755     }
00756 }
00757 
00758 void drawBitmap(int screen_number, int index_number, char row, char col, int width, int height)
00759 {
00760     command(screen_number, 0x15);
00761     command(screen_number, col);
00762     command(screen_number, (col + (width-1)));
00763 
00764     command(screen_number, 0x75);
00765     command(screen_number, row);
00766     command(screen_number, (row + (height-1)));
00767 
00768     for(int i = (width*height-1); i >= 0; i--) {
00769 
00770         switch (index_number) {
00771 
00772             case 0:
00773                 data(screen_number, number_0_small[i]);
00774                 break;
00775             case 1:
00776                 data(screen_number, number_1_small[i]);
00777                 break;
00778             case 2:
00779                 data(screen_number, number_2_small[i]);
00780                 break;
00781             case 3:
00782                 data(screen_number, number_3_small[i]);
00783                 break;
00784             case 4:
00785                 data(screen_number, number_4_small[i]);
00786                 break;
00787             case 5:
00788                 data(screen_number, number_5_small[i]);
00789                 break;
00790             case 6:
00791                 data(screen_number, number_6_small[i]);
00792                 break;
00793             case 7:
00794                 data(screen_number, number_7_small[i]);
00795                 break;
00796             case 8:
00797                 data(screen_number, number_8_small[i]);
00798                 break;
00799             case 9:
00800                 data(screen_number, number_9_small[i]);
00801                 break;
00802             case 10:
00803                 data(screen_number, letter_a_small[i]);
00804                 break;
00805             case 11:
00806                 data(screen_number, letter_b_small[i]);
00807                 break;
00808             case 12:
00809                 data(screen_number, letter_c_small[i]);
00810                 break;
00811             case 13:
00812                 data(screen_number, letter_d_small[i]);
00813                 break;
00814             case 14:
00815                 data(screen_number, letter_e_small[i]);
00816                 break;
00817             case 15:
00818                 data(screen_number, letter_f_small[i]);
00819                 break;
00820             case 16:
00821                 data(screen_number, letter_g_small[i]);
00822                 break;
00823             case 17:
00824                 data(screen_number, letter_h_small[i]);
00825                 break;
00826             case 18:
00827                 data(screen_number, letter_i_small[i]);
00828                 break;
00829             case 19:
00830                 data(screen_number, letter_j_small[i]);
00831                 break;
00832             case 20:
00833                 data(screen_number, letter_k_small[i]);
00834                 break;
00835             case 21:
00836                 data(screen_number, letter_l_small[i]);
00837                 break;
00838             case 22:
00839                 data(screen_number, letter_m_small[i]);
00840                 break;
00841             case 23:
00842                 data(screen_number, letter_n_small[i]);
00843                 break;
00844             case 24:
00845                 data(screen_number, letter_o_small[i]);
00846                 break;
00847             case 25:
00848                 data(screen_number, letter_p_small[i]);
00849                 break;
00850             case 26:
00851                 data(screen_number, letter_q_small[i]);
00852                 break;
00853             case 27:
00854                 data(screen_number, letter_r_small[i]);
00855                 break;
00856             case 28:
00857                 data(screen_number, letter_s_small[i]);
00858                 break;
00859             case 29:
00860                 data(screen_number, letter_t_small[i]);
00861                 break;
00862             case 30:
00863                 data(screen_number, letter_u_small[i]);
00864                 break;
00865             case 31:
00866                 data(screen_number, letter_v_small[i]);
00867                 break;
00868             case 32:
00869                 data(screen_number, letter_w_small[i]);
00870                 break;
00871             case 33:
00872                 data(screen_number, letter_x_small[i]);
00873                 break;
00874             case 34:
00875                 data(screen_number, letter_y_small[i]);
00876                 break;
00877             case 35:
00878                 data(screen_number, letter_z_small[i]);
00879                 break;
00880             case 36:
00881                 data(screen_number, letter_a_large[i]);
00882                 break;
00883             case 37:
00884                 data(screen_number, letter_b_large[i]);
00885                 break;
00886             case 38:
00887                 data(screen_number, letter_c_large[i]);
00888                 break;
00889             case 39:
00890                 data(screen_number, letter_d_large[i]);
00891                 break;
00892             case 40:
00893                 data(screen_number, letter_e_large[i]);
00894                 break;
00895             case 41:
00896                 data(screen_number, letter_f_large[i]);
00897                 break;
00898             case 42:
00899                 data(screen_number, letter_g_large[i]);
00900                 break;
00901             case 43:
00902                 data(screen_number, letter_h_large[i]);
00903                 break;
00904             case 44:
00905                 data(screen_number, letter_i_large[i]);
00906                 break;
00907             case 45:
00908                 data(screen_number, letter_j_large[i]);
00909                 break;
00910             case 46:
00911                 data(screen_number, letter_k_large[i]);
00912                 break;
00913             case 47:
00914                 data(screen_number, letter_l_large[i]);
00915                 break;
00916             case 48:
00917                 data(screen_number, letter_m_large[i]);
00918                 break;
00919             case 49:
00920                 data(screen_number, letter_n_large[i]);
00921                 break;
00922             case 50:
00923                 data(screen_number, letter_o_large[i]);
00924                 break;
00925             case 51:
00926                 data(screen_number, letter_p_large[i]);
00927                 break;
00928             case 52:
00929                 data(screen_number, letter_q_large[i]);
00930                 break;
00931             case 53:
00932                 data(screen_number, letter_r_large[i]);
00933                 break;
00934             case 54:
00935                 data(screen_number, letter_s_large[i]);
00936                 break;
00937             case 55:
00938                 data(screen_number, letter_t_large[i]);
00939                 break;
00940             case 56:
00941                 data(screen_number, letter_u_large[i]);
00942                 break;
00943             case 57:
00944                 data(screen_number, letter_v_large[i]);
00945                 break;
00946             case 58:
00947                 data(screen_number, letter_w_large[i]);
00948                 break;
00949             case 59:
00950                 data(screen_number, letter_x_large[i]);
00951                 break;
00952             case 60:
00953                 data(screen_number, letter_y_large[i]);
00954                 break;
00955             case 61:
00956                 data(screen_number, letter_z_large[i]);
00957                 break;
00958             case 62:
00959                 data(screen_number, letter_semicolon[i]);
00960                 break;
00961             case 63:
00962                 data(screen_number, letter_minus[i]);
00963                 break;
00964             case 64:
00965                 data(screen_number, letter_dubbelepunt[i]);
00966                 break;
00967             case 65:
00968                 data(screen_number, letter_plus[i]);
00969                 break;
00970             case 66:
00971                 data(screen_number, letter_slash[i]);
00972                 break;
00973             case 67:
00974                 data(screen_number, letter_percent[i]);
00975                 break;
00976             case 68:
00977                 data(screen_number, letter_questionmark[i]);
00978                 break;
00979             case 69:
00980                 data(screen_number, letter_comma[i]);
00981                 break;
00982             case 70:
00983                 data(screen_number, letter_open[i]);
00984                 break;
00985             case 71:
00986                 data(screen_number, letter_close[i]);
00987                 break;
00988             case 72:
00989                 data(screen_number, letter_dot[i]);
00990                 break;
00991             case 73:
00992                 data(screen_number, letter_space[i]);
00993                 break;
00994             case 74:
00995                 data(screen_number, logo_solar_boat[i]);
00996                 break;
00997             case 75:
00998                 data(screen_number, logo_dickbutt[i]);
00999                 break;
01000             case 76:
01001                 data(screen_number, letter_degree[i]);
01002                 break;
01003                 //+80 for large numbers
01004             case 80:
01005                 data(screen_number, large_0[i]);
01006                 break;
01007             case 81:
01008                 data(screen_number, large_1[i]);
01009                 break;
01010             case 82:
01011                 data(screen_number, large_2[i]);
01012                 break;
01013             case 83:
01014                 data(screen_number, large_3[i]);
01015                 break;
01016             case 84:
01017                 data(screen_number, large_4[i]);
01018                 break;
01019             case 85:
01020                 data(screen_number, large_5[i]);
01021                 break;
01022             case 86:
01023                 data(screen_number, large_6[i]);
01024                 break;
01025             case 87:
01026                 data(screen_number, large_7[i]);
01027                 break;
01028             case 88:
01029                 data(screen_number, large_8[i]);
01030                 break;
01031             case 89:
01032                 data(screen_number, large_9[i]);
01033                 break;
01034             case 90:
01035                 data(screen_number, large_space[i]);
01036                 break;
01037             case 91:
01038                 data(screen_number, alert_sign[i]);
01039                 break;
01040             case 92:
01041                 data(screen_number, alert_sign_space[i]);
01042                 break;
01043         }
01044     }
01045 }