It is currently Wed Jul 06, 2011 6:43 pm

All times are UTC - 8 hours




 Page 1 of 1 [ 3 posts ] 
Author Message
 Post subject: Works on sim, not on watch
PostPosted: Sat Mar 05, 2011 12:25 am 

Joined: Thu Feb 17, 2011 7:28 pm
Posts: 4
Location: Toronto, Canada
I've got some code for a very simple clock somewhat similar to what friedchiken just posted but instead of using a font, I'm using a graphical full-colour sprite set of numbers. The head-scratcher is that works just fine in the simulator, but fails (and fails BADLY) when run on the watch itself. Here's the app source code, and I'll attach a quick zip file with the images. I'm totally confused, but I'm sure it's just something little that I'm missing...?

/**
*
*   THE BIG BLUE BUTT KICKER
*   Created March 5th, 2011 by Shannon Larratt of Zentastic.com ([email protected]).
*
*   This is a very simple digiital clock application for the inPulse watch.
*   In a 2x3 grid (three lines: HH, MM, and SS) the time is written in oversized blue digits.
*   
*   MY VERY FIRST INPULSE APPLICATION!
*   Much thanks to Duane Maxwell and others for their sample applications which I used to learn.
*   Thanks also to Eric and the folks at inPulse for bringing such a fun toy to market.
*
*   No copyright claimed, no warranty, and all that. Free and open software.
*   Use or modify as you see fit. Enjoy!
*
**/

#include <pulse_os.h>
#include <pulse_types.h>
#include <stdint.h>
#include <app_resources.h>

#define DISPLAY_TIMEOUT 10000   //How many milliseconds to leave display on for

#define MEDBLUE_CHAR_SIZE_H 48
#define MEDBLUE_CHAR_SIZE_V 42


/**
*   drawLED(x,y,whichDigit)
*   Draws a single digit to the display (0 through 9, with 0 being the default).
*   Digit number is passed in 'on' and the location are through x and y (positions 0-1 and 0-2 respectively).
**/
void drawBlueChar(int x, int y, int whichDigit) {
PulseResource image = whichDigit + 1;
    x = x * MEDBLUE_CHAR_SIZE_H;
    y = y * MEDBLUE_CHAR_SIZE_V + 1;
    pulse_draw_image(image, x, y);
}

int last_sec;
int last_min;
int last_hour;

/**
*   resetLast()
*   Reset "currently displayed" values so as to force a redraw of all digits
**/
void resetLast() {
    last_sec = -1;
    last_min = -1;
    last_hour = -1;
}

void handle_button_causing_wakeup();

/**
*   main_app_init()
*   Initialize... nothing much to do
**/
void main_app_init() {
    resetLast();
    pulse_blank_canvas();                           // Clear screen
    pulse_oled_set_brightness(100);                        // Turn OLED backlight on full power
    pulse_update_power_down_timer(DISPLAY_TIMEOUT);                  // Set when the display will fade out again
    pulse_register_callback(ACTION_WOKE_FROM_BUTTON, &handle_button_causing_wakeup);
}

/**
*   handle_button_causing_wakeup()
*   Turn on from button push... pretty much the same as initialize code (ie. nothing much to do)
**/
void handle_button_causing_wakeup() {
    resetLast();                              // Reset "currently displayed" values
    pulse_blank_canvas();                           // Clear screen
    pulse_oled_set_brightness(100);                        // Turn OLED backlight on full power
    pulse_update_power_down_timer(DISPLAY_TIMEOUT);                  // Set when the display will fade out again
}

void main_app_handle_button_down() {
}

void main_app_handle_button_up() {
}

/**
*   main_app_loop()
*   This code keeps an eye on the time and makes redraw requests for any needed digits.
*   Hour/minute/second value should only be written if it's changed.
*   Note to-do: Redraw test should be done on the two digits of H/M/S separately to about extra drawing of first digit nine times out of ten.
**/

void main_app_loop() {
    struct pulse_time_tm tm;
    pulse_get_time_date(&tm);            // Retrieve the current time
    int sec = tm.tm_sec;            // Pull out the second value
    if (sec!=last_sec) {            // Has it changed?
        last_sec = sec;
        int sec10 = sec / 10;            // Extract first ("tens") digit
        sec %= 10;               // Extract second ("ones") digit               
        drawBlueChar(1, 2, sec);         // Render the two seconds digits to bottom line
        drawBlueChar(0, 2, sec10);
    }
    int min = tm.tm_min;            // Pull out the minute value
    if (min!=last_min) {            // Has it changed?
        last_min = min;
        int min10 = min / 10;            // Extract first ("tens") digit
        min %= 10;               // Extract second ("ones") digit
        drawBlueChar(1, 1, min);         // Render the two minutes digits to centre line
        drawBlueChar(0, 1, min10);
    }
    int hour = tm.tm_hour;            // Pull out the hour value
    if (hour!=last_hour) {            // Has it changed?
        last_hour = hour;
        int hour10 = hour / 10;            // Extract first ("tens") digit
        hour %= 10;               // Extract second ("ones") digit
        drawBlueChar(1, 0, hour);         // Render the two hours digits to top line
        drawBlueChar(0, 0, hour10);
    }
}

/**
*   main_app_handle_doz()
*   Time to go to sleep... do a nice slow fade out
**/
void main_app_handle_doz() {
    for (int i = 100; i >= 0; i-=4) {
        pulse_oled_set_brightness(i);   // Step to next fade-out level
        pulse_mdelay(50);      // Not counting pulse_oled_set_brightness() overhead, fade should take 50ms*25 = 1.5 seconds
    }
}

void main_app_handle_hardware_update(enum PulseHardwareEvent event) {
}


Instead of posting the entire image, it only posts a single pixel it seems...

PS. I have another version of this using Duane's XBM-style inline images, but that one has an analogous problem. It runs fine on the sim, but is too big for the watch. Is there any way to trade code space for resource space? That would allow a bit more flexibility.

As a point of trivia, here is that code -- if there's any way to make this run I'm also interested as it's quite convenient to put the images into the main code like this.

/**
*
*   THE BIG BLUE BUTT KICKER
*   Created March 5th, 2011 by Shannon Larratt of Zentastic.com ([email protected]).
*
*   This is a very simple digiital clock application for the inPulse watch.
*   In a 2x3 grid (three lines: HH, MM, and SS) the time is written in oversized blue digits.
*   
*   MY VERY FIRST INPULSE APPLICATION!
*   Much thanks to Duane Maxwell for his sample applications which I used to learn how to do this.
*   Thanks also to Eric and the folks at inPulse for bringing such a fun toy to market.
*
*   No copyright claimed, no warranty, and all that. Free and open software.
*   Use or modify as you see fit. Enjoy!
*
**/


#include <pulse_os.h>
#include <pulse_types.h>
#include <stdint.h>

#define DISPLAY_TIMEOUT 60000   //How many milliseconds to leave display on for (default is 60 seconds)

/**
*   Medium Font, Blue       
*   Character size: 48h x 42v, so as to allow 2x3 grid of text (should be offset one pixel down to vertically centre)
*   8 colors as defined in medBlueColors[], A through H in medBlue0Map[] through medBlue9Map[]
*   Created from an XBM image created using http://www.online-utility.org/image_converter.jsp
*   Note to-do: While embedding the graphics like this is convenient because it only needs this source code and no resource files,
*               it is also somewhat space inefficient and may also have render speed penalties associated with it. It is also
*               easier to have resource-based images be "true" 24-bit images rather than these indexed images which have only 8.
**/

#define MEDBLUE_CHAR_SIZE_H 48
#define MEDBLUE_CHAR_SIZE_V 42

static color24_t medBlueColors[] = {
{0x00,0x00,0x01,0x00},
{0x02,0x23,0x42,0x00},
{0x02,0x46,0x6D,0x00},
{0x02,0x66,0x90,0x00},
{0x01,0x81,0xB2,0x00},
{0x01,0x9C,0xC8,0x00},
{0x01,0xBD,0xE8,0x00},
{0x01,0xF0,0xFE,0x00}
};

char medBlue0Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAABBBBBEHHEDDEECBCDDCBAAAAAAAAAAAAAA"
"AAAAAAAAAAABCCCCCCCGGFCCDDDCBCDDFDCBBAAAAAAAAAAA"
"AAAAAAAABCCBCCCCCDEGFDDDEFCCECCCCCCCCCBAAAAAAAAA"
"AAAAAAACDDDEEDDCCCEFEDDFFFEFFDCDDDDDDDCBCBAAAAAA"
"AAAAABCCCDEEGGGDCBCDEDEFFEFFEDCCDDDDDDDCCCCAAAAA"
"AAAACBBBDEEEFGFDBBCEEDEEEEFEDDCCEEEEEDCCCCDCAAAA"
"AAADBBBEEDDDEEEECBCEFEEDDDDDDCDDEDCDFEDCCDFCCAAA"
"AACCDBCEEDDCCDEECCEFFEDDEFFDCDEECCBCDDCCDFFEDDAA"
"ABCCDDEEDDEDCCEEDDEFFFEEEEDDEFFEDCCCCDDDEEEDDEAA"
"ACCCCEEDDDCDDCEFFFGGGFFFGGGFFGGFFFFEDDDDEEDCCDCA"
"ADCCDFEDEEDEDDFFFFFGGGEDCGGGFGFFFFEDDEEFDDDDDCEA"
"AECCEFEEFEEDCGGGGEEGHHAAAAHFDDDFFGEDDFFEEEEDFDFA"
"ACBBEFEFFFEEEGGGFEEGGGAAAAGEEEGGGGFEEEFEEFFDGEFA"
"ADBAEFFFFEEEEGGGFDCDFGAAAAGFFFGGGGGGFFFFEEDDGEFA"
"AECBEGFFEEEEEFGFGFDDGHAAAAHGHGGGGGFFFFFFFFDCDDEA"
"AFEDFFFFEEEFFFEDFHGGHHAAAAHHGGGGGFEEEFGFFFECCCDA"
"AEDDFEEEEFFFFFDDEGGGHHAAAAHHFFGGGFEEEFFFFGGFBBBA"
"AEDDEEDEFFGFGGFFFGGFHHAAAAHGFEGGGGFFEGFFFGHHFEBA"
"AEEDDEEEFFFFFGHHGHHGHHAAAAGEEDHGHGGFEEFFFGGHHFBA"
"AFFDDEFGEDEFFGGGGHHHHHAAAAGFGFHGGGGFEEEEEDEGGDBA"
"AEEDCFFFFEEFGGGHHGGGHHAAAAGFHGHGGGHGGFFEDDEEEEDA"
"ADEDDEFEEGGGGGGGGGGGHHAAAAHFDEHGGGGGGGFEEEFCDEFA"
"AEFFEDEEDGGGGGFGGGGHHHAAAAHHEDHGGGFGGGFFFFGEDEEA"
"AEFGECCEFGFGGFFGGGGHHHAAAAHHGEFGGFEGGGEEFGFDDDCA"
"AFFGDCDFFFEEEEFGGGGHHHAAAAHHHHGGGFFFFEDEFFCCECBA"
"AFEGDBCFFFEEFFEEEFGGHHAAAAGHHHGFFFGFGCDFFECCEEEA"
"AFEGDCCFFEEEEFEDDEGHHHAAAAEFFGGFFFFGFDDFGECDDDDA"
"AEDEDDCFFEDEFFEEEFHHHGAAAAHGGGFFFFGGFEEFFFFEEDCA"
"ACCEDDEFFECDDFFFEFGGFEAAABGFGGFDFFGGFDEFEEDFFBCA"
"ACBCCDEEDEDDEFFEEFFEDFGFFHGFFGEEFFFFEDDEEDCDDBCA"
"ADCCBCEEEEEGFFEEDEFFEDFGGGFEEEFDFFFDDEEDDCCECCCA"
"ABDCBCFEDDFGGGECDEFFEEEFGGEDDDEFFFFFFFEDDEDEDCAA"
"AACCCDDEDCDCDDECCDEEFEEFEEEEEDDFGFDEDDDEDGFFCAAA"
"AAAEDBCDDCBBBDECDEFEFFFDCCCEDDCDEEDCCCCCDFFGBAAA"
"AAABDCBABCDDDFFDFFFEDDEDDCCDDDCCCDDCCBCCCDFDAAAA"
"AAAAACCABEFFEEEFGFFDDCEEDCCCCCDDCDCCCCDBCECAAAAA"
"AAAAAABBCFGFDCCEEDCCCCDEEFFFDDDDBDCBBDECCAAAAAAA"
"AAAAAAAAADFDCDCCEEDDEEEEFGGGEEFDBDDDDFDBAAAAAAAA"
"AAAAAAAAAAABEEECBCEEDDEEDEFFDFGFCDEDBAAAAAAAAAAA"
"AAAAAAAAAAAAAACAABDDDCDFFDDBDEDCAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue1Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAADDCDDDDCCDGHFDDEDCDFFGGFCBAAAAAAAAAAAA"
"AAAAAAAAAADCBBBCCCCDGFDDCDCBCDDFFCBBAAAAAAAAAAAA"
"AAAAAAAAAACCCCDCCCDFFDEFFDDGECCDDDCCAAAAAAAAAAAA"
"AAAAAAAAAAEFFFDCCBCDDDEFFEEGFDCCCDEDAAAAAAAAAAAA"
"AAAAAAAAAAEGFFFDCBBCEDEEFFFFEDCDEDEDAAAAAAAAAAAA"
"AAAAAAAAAADFEFFDCBCDFGEDDCEECCCEFEEDAAAAAAAAAAAA"
"AAAAAAAAAABCEFFECBCEFFEEDEEDCCDEGECCAAAAAAAAAAAA"
"AAAAAAAAAACBEFFECCEGFFEEEEECDEFGECBBAAAAAAAAAAAA"
"AAAAAAAAAABBDFDFFGGGGGGEEEECEFGGEBBBAAAAAAAAAAAA"
"AAAAAAAAAAABCCDFFFGGGGFFEEEDEGGGDCCCAAAAAAAAAAAA"
"AAAAAAAAAACDDCDDFEEFGFFFFFFFEFFFEGFDAAAAAAAAAAAA"
"AAAAAAAAAABBACDEFEDEFFFFFFGGEEFFFGHFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAGHGEDDEEEFFFEEFFGGGGGHAAAAAAAAAAAA"
"AAAAAAAAAAAAAAHHEEEEFFEFGFEEGGGGGGFFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAGFEDFFFGGGGGGGGHGGGGGFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAGDCDFFGGGGHHHHHHGGFFFFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAFDBEGGGGGGHHGGGGGGGDDFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAGFCEHHHHHHHHGGGGGGHHEFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAHHGGHHHHHHHGFFFGHHHHGFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAHHGGHGGGHGGGFEEFGHHGGFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAHHGGHGGGGGGGFDEGHGGGGFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAGGFGGGGGGHGGEEEGHGGGGFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAFGFFGHHHHGGGGGFGFGGFFEAAAAAAAAAAAA"
"AAAAAAAAAAAAAACFFGGHHHGFFGHHHGFFFFEEAAAAAAAAAAAA"
"AAAAAAAAAAAAAAEEEFGGHGGGFFGHHGGFFFDCAAAAAAAAAAAA"
"AAAAAAAAAAAAAADDEEGGGGGFEEEFGGFFFGGEAAAAAAAAAAAA"
"AAAAAAAAAAAAAAFDCEGHGGGFFFGEGGFFFFGGAAAAAAAAAAAA"
"AAAAAAAAAAAAAAGFEEGHGFFFGGFEFFFFGGFFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAGEEDFFFFGGGGFFGFFFFEDFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAFEEEFEDEGGGGFFFFGEEEFGAAAAAAAAAAAA"
"AAAAAAAAAAAAAAFDDEFFDCDFGGGEEFFFFFFFAAAAAAAAAAAA"
"AAAAAAAAAAAAAADCCEEEEEEFGFFEEFFFFFGGAAAAAAAAAAAA"
"AAAAAAAAAAAAAACBBEEEFFEEGFEEDDEFFGGFAAAAAAAAAAAA"
"AAAAAAAAAAAAAACCEEFFFGFDDCDDDDDEEEDBAAAAAAAAAAAA"
"AAAAAAAAAAAAAAEFFGFFEEEDDCCDDDCCDCBBAAAAAAAAAAAA"
"AAAAAAAAAAAAAAFGGGDCCCEEDCCCDDCCCCDCAAAAAAAAAAAA"
"AAAAAAAAAAAAAACDFFDCBCEEFFFEEDDCCDDDAAAAAAAAAAAA"
"AAAAAAAAAAAAAACBCDCDDDEEGGGFFFEBCDCDAAAAAAAAAAAA"
"AAAAAAAAAAAAAADCBBCDEEDEFFEEFFFBCDCCAAAAAAAAAAAA"
"AAAAAAAAAAAAAAFECBCDDDCFFEDDFFECCDCBAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue2Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAABBBBEHHEDDEECBDDDCBAAAAAAAAAAAAAA"
"AAAAAAAAAAAABBBCCCDGGGDCCDDBBCDDFDCBAAAAAAAAAAAA"
"AAAAAAAAABBCDEDCCDDEFDDFFECFFDCCCCBBCCBAAAAAAAAA"
"AAAAAAABDDCFHHECCBBDDDEFFEDFFFDDDDDDDCCBBAAAAAAA"
"AAAAAABECDDFGGECBBBCDDEEEEFFEDDEEDEDDDDCCCBAAAAA"
"AAAAABBBBCDEEEFEDBCDFGFDDDFECCCEFEFEDCCCBCDBAAAA"
"AAAACBCDCDDCCDFFDBCDGFEDDDDDCCDFEDCDEDEDCCECBAAA"
"AAABDDEDCCDDCDEEECCEFEDEEEFDDCEECCBCDDCCCDFDDBAA"
"AAABDECDDDDDCCCEEEFFFGFEEEDDEFGEDCCCCCDEEDEDCDAA"
"AAACCEDDDCCCDDEFFFGGGGGFFEDDFGGFEEEEDDDEDDDCCDAA"
"AACDDDEEFFEFEDEEEEEGGGFGFGGFGGGGGGFEDFFFEEEDEDCA"
"AACCBDDFGFFCCDFGFECEGGGAABHGFFFGGGEDDFFDEEEFEDCA"
"AABAACDDDDCCCEGGGGCDGHAAAAGFEEFFGGFEEEEEEEDGFDCA"
"AABABEEEEFFDDFHHHGGGHGAAAAGFEFGGGGGFFFFEFFDEGECA"
"AAAAACBBBBBBBCEFFEEGHAAAAHHGFGGGGFFEEFFGGGDCDDBA"
"AAAAAAAAAAAAAAAAAAAAAAAAHHHGGGGFFGEEEEFGGFECCCAA"
"AAAAAAAAAAAAAAAAAAAAAAFHHHGGGGGGGGEFFFGGFFFGEAAA"
"AAAAAAAAAAAAAAAAAAAABHHHHHGEFGHHGHGGGGFFEFGHEAAA"
"AAAAAAAAAAAAAAAAAABGHHHHHHFDFHHHGHFFFGDEFFHHAAAA"
"AAAAAAAAAAAAAAAAAHHHHHHHGGFEFGGGGGDDEECDDDDBAAAA"
"AAAAAAAAAAAAAABGHHHGGFGGGFFGGHGGGGFEDFEDDCAAAAAA"
"AAAAAAAAAAAABFHHGGGGGHGFFFGEEFGGGHGFGGGEBAAAAAAA"
"AAAAAAAAAABHHHHGGGHHHHFGGGGEDDFHHGGGHHEAAAAAAAAA"
"AAAAAAAABDFFHGGFGGHHHFFFGGGGFGGGGGGGFAAAAAAAAAAA"
"AAAAAAACFEDDDEGFEGGGGGFFFFHHHGHGGGCAAAAAAAAAAAAA"
"AAAAAACEDDCCDEFEDEFGGGGGEEFHHHHFBAAAAAAAAAAAAAAA"
"AAAABBCDEEDCDFEEDEGGGGGFEGHGGEAAAAAAAAAAAAAAAAAA"
"AAADCCDFFFEDEFEEEFGGGGGFGFDAAAAAAAAAAAAAAAAAAAAA"
"AABCCCCEEEDDEFFFFFGGGGGGDAAAAAAAAAAAAAAAAAAAAAAA"
"AACBBCCEEDCCDFFFFFGFEEGGFEFFFFFGGGFEDDFECBDFBBAA"
"AACCCDEEDCCDEEEEFFEDCDFFGGGGFEFGHHFDDDDDBCEEDBAA"
"AACBCEEDDDDEFDEEEEEDDDDEGGFFEDFGGGEDCDDDCEFEDBAA"
"AACBBFEDCDEDDEECEEFFEEEEGGFDDDEGFFDEDDCCDEECBBAA"
"AAECCDEDCCDFEEECDEFFFFEDCCDDDCCDDDCCCCCCDEDBBBAA"
"AAFDDFECCCEFFEFDFFFEEEEDCBCDDDCCCDCCBCCDEEFEBBAA"
"AAECEFDBBBCGFFFFFFFCCEEDCBCDDDCCCCBBCDDDDEFEDCAA"
"AACCCCCBBBDFEDCDDDDCCEEEEFFDEDDCDDCCCECDCCDCCCAA"
"AABDCDCBBCCDDBBBCDDDDEEEFGGEFFECEDDEFEDCBBCCDCAA"
"AACDDCDCCCCBBDDDCCDEEEEEEEFDFFFCDEEDEDCBBBCDEEAA"
"AAEFDEEEFEDBFGGFBBDDDCDFFDDCFFEDDDDDDEDCBBBFFEAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue3Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAABBCBBCFHHGEDDDCBCDDDBAAAAAAAAAAAAAA"
"AAAAAAAAABCCCCCCCCCFGGECCCCBBCDDFDCBBAAAAAAAAAAA"
"AAAAAAABDECCCCCCCDDEFECDDEDFFCCCDDCCBBBBAAAAAAAA"
"AAAAAABDDDDEGGFDCBBCDDDFFEFFECCDDDEDDDCCCBAAAAAA"
"AAAACCCECDDDGGGDBBBBDEEFFEFFDDCEEEDDDDDCCDCAAAAA"
"AAAADBBBBCDDEFGFCBCDFGGEEEFECCCEFEEEDDCCCCDBAAAA"
"AAABBBCECDDCCDEECBCDGEEDDDDDCCDEEDCDEEDCCDEBCAAA"
"AAACDDFFDDDDDDEEECCEFEEEEFGECCEDCCBCDDCCCDFDDBAA"
"AABDDDEECCDDDCCEEEFFGFEEFEDDEFGEDCCCCCCDEEEDCDAA"
"AACCDDDDCBCCDDEFFGGGGGFEFGFFGGGGEFFEDDDEFFEDDDAA"
"ABCCDDDEFDCCCDEEFFGGHHAAAFGGFFGGGGEDDFFGEBDDECAA"
"ABBCCDDEFFCCDFGGGEFGHHAAADGEDEFFGGEEDFGEEDDFEDAA"
"AAAAACDEEDCCDGHHGFEEGHAAABGEDEEGGGFFFGEDDDEGGDAA"
"AAAAAAAAAAAAAAAAAAAAAAAAABGGFFGGGFEFFFEEDEDEEAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAHHHHHGGEFGFFFFFEFGFBAAA"
"AAAAAAAAAAAAAAAAABBCEFGGHHHGGGGGFGGFEEGGFHHDAAAA"
"AAAAAAAAAAAAAAAACEGFHHHHHGGGGGGGGGGEDFFGGHEAAAAA"
"AAAAAAAAAAAAAAAADHGEGHHHHGGGFEFHGGFEFGGGEAAAAAAA"
"AAAAAAAAAAAAAAAAGHHEEGHHHHGGEEFGGGFFGECAAAAAAAAA"
"AAAAAAAAAAAAAAAAHHHHFGHHGFFFFFGGGGHFAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAGHHHGGHGFEFFGHHHGGGFCDEBAAAAAAAA"
"AAAAAAAAAAAAAAAAHHHHHGGGFGFEEGHHGGGGGHHHFBAAAAAA"
"AAAAAAAAAAAAAAAAHHHHHHHHGGEEEGHGGFGGGHHHFGGBAAAA"
"AAAAAAAAAAAAAAAAAAAAAABBHHGGFGGGGGFFFGFFEFGDBAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAHHHHGFFGGFFDDDEEEDBCBAA"
"ABBCAAABBBBBBDEDCDDFGFAAAEHGHGFFEGGEDCCFFGEBBDAA"
"BDEGDBBDDDDDDFFFDGGHHHAAACGFGGFFFFFFDDEFGGCBCDCA"
"CDCEECCCEDDCCDEDDEGHGHAAABGGGGGFFFFFEEDFFFEDDCCA"
"BCBCCCEFFDCCCDFFFEGGEFAAAFGGGGFFFFFFDDDFEFEFEBBA"
"ABBBBCDEFEDEDFGFFFEEEEFFGGGFFFFFFFFFDDDFFEFFDBCA"
"ADCBCCCCFEDEDEGFEEFEFEFGGGFEFFFFFFFFEEFECCDECBCA"
"ACDCCDDDCCDGFEDDDEEEEEEFGFEEDEFGFFFFFGFDBCEEDBAA"
"AACCCDDDDDFFGFDBCEEEFFFFFFDDDDDFFFDEEGFDCFFECAAA"
"AABDCCDCCCDCCDEBCDEEFFFDDCCDDDCDDECCDDCCDFGFBAAA"
"AAAACDBAABDDCDEBDEFEFEEDDCCDDDCCCDDCBBBCCEEDAAAA"
"AAAAACCABEFFEEEEFFFDCCEEDCCCCCDDCDDCBCCBCDCAAAAA"
"AAAAAAABCEGFDDDEGGFCDCDEFFFEDDEDBDDBBCECCAAAAAAA"
"AAAAAAAAACDCCDCCEEDDDDEEFGGFEFFDBDDCDFDBAAAAAAAA"
"AAAAAAAAAAABEEECBCDEEDEEFFEDDFGFCDDDBAAAAAAAAAAA"
"AAAAAAAAAAAAAACAABDEDBDFGDDDCEDCAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue4Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAACCCBDEFGGEDDDDCDDCDAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAADCCBBBDDDDCCCCCCCCCDAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAFFFCBCECCCCCCCDCBCDDEAAAAA"
"AAAAAAAAAAAAAAAAAAAAAFFEDCBDFDDCDDEEEDCCEEFAAAAA"
"AAAAAAAAAAAAAAAAAAABFEEDDDDFGFDDDEEDDDDDDDEAAAAA"
"AAAAAAAAAAAAAAAAAABFFDDCCCCFFDDCDFEDDDDDDCDAAAAA"
"AAAAAAAAAAAAAAAAAADFDCCDEDDEDCCCDEDDDEFDCCCAAAAA"
"AAAAAAAAAAAAAAAAACEFEEDEEEFFEDDDEDCCCDDDDCGAAAAA"
"AAAAAAAAAAAAAAABCEFFEFEEEEFEEEFFECCCCCDEDDFAAAAA"
"AAAAAAAAAAAAAADEDEFFFGGEDDEDDEGFFDCCCCDDEDDAAAAA"
"AAAAAAAAAAAAAEEEDDEFGGFFEEFEEEFGFGEDDEFFCCCAAAAA"
"AAAAAAAAAAAADFFFEEEFGGFFEEGGFDFGGGFFEFFEDDEAAAAA"
"AAAAAAAAAAADDGGGGEDDFGGFEEGFFDDGGGGGFEEEDDFAAAAA"
"AAAAAAAAAAEECFGGGDCCFFFFFFFEFFFGGGFFFEEEECEAAAAA"
"AAAAAAAAAEEEDDGGFDCDFFFGGGFFHHGGGGFFFFFFGFGAAAAA"
"AAAAAAABDDDDDEEGEEEGHGGGGHGHHHGGGFFEEFFFGGHAAAAA"
"AAAAAABDDDEEDEGFEFGHGHHGGHGGHHHGFGFEEGFEGHHAAAAA"
"AAAAACEDFFGFFFGFEEGHHHGHHGGGGGGGFEEFFFGFFGHAAAAA"
"AAAACDDECDGFFGGFEGHHGHHHHGGGGGGHGFFFFFDEFGHAAAAA"
"AAADFEFGCCFFFGHHHHHAAHHHGGEEGGGGGGEEEDDDDEGAAAAA"
"AADEFGGFDDEFFFGHHHAAAHHGGGEDFGGGGGGFDEEEDDEAAAAA"
"ABEDDGGEEFGGGGHHHAAAAHHGGGFEEGGGGGGGGGFEDDFAAAAA"
"EEFEFEEDEGGGHGGHBAAAAHGFGGGFFHFGGGGGGGGFEEFBAAAA"
"DEFFDBDFFFGGGGFGGGGHHHGFFGHHHHGFGFGGGGFEEFFFDDDB"
"DEGGCBCFFEEEEFFFGGHHHHGFEEGHHGFFFEFGGFEEEEDCDCCC"
"DFFFBBDFFEDDDEFFEFGHHGGFEEEFFFGFGEEEEDCCEEDDDDCC"
"EEFFCCDEFEEDEFFDDEGHGGGFEEGFEGGFFGFFDCCDGFDCDEEE"
"EEDEDDDEFEEFFFFEEDGHGFGFEFGGEFFGGFFFFDDFGGEDDCCE"
"DCBCDCDEECCDEFFFEDFGGFGFEGGFFFFGEFFFFDDEFFFDCCCC"
"CCCCCCDEDCDDDFFEDDEEEDGFFFGFFFFFFFFGEDDEFFFDBCCF"
"CDDCCCCCCDEFFFEEDDECCEFGGGGFFFFFFFFFEDEFEEDCCCDE"
"EEEEDEEEDDGHHGGGFFGFEDFGGGFFFFEFFFFFEFFEEECDDEED"
"BBBAAAAAAAAABAAAABBACEDFFGFEDDDEFFEDDECDDFFBAAAA"
"AAAAAAAAAAAAAAAAAAAAAEDDCDCDDDDEEDCBCCCCDFFAAAAA"
"AAAAAAAAAAAAAAAAAAAAAFEDCBBBDDDDDCBBBCCCDFFAAAAA"
"AAAAAAAAAAAAAAAAAAAAAFEDCCCDCDDDCDCCDEEDDDDAAAAA"
"AAAAAAAAAAAAAAAAAAAAAEDDCEFFEEEDDDDDFEDCCDDAAAAA"
"AAAAAAAAAAAAAAAAAAAAAEEEEGGGFFFEEDDDDCCCCDEAAAAA"
"AAAAAAAAAAAAAAAAAAAAADDEFFEEEFFEDDDDCCCBBCDAAAAA"
"AAAAAAAAAAAAAAAAAAAAABDFFEDDEFFEDDDDEDCBBBBAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue5Map[] =
"AAAAAAAAAAAAAAAAAAABBBAAAAAAABBBBBBBBBAAAAAAABAA"
"AAAAADCCEEEDDDEEDCCFGGEDDDDCDEEFFDDDDDDDDDEFFFDA"
"AAAAACCCDDDCCCCDCCDFGFDCDCBCDCCDCCCCCCBCCDDEEEDA"
"AAAAABCDDDCCBBCCCCDEEEEEECDFDCCCCCCCDCBBCDDDCCDA"
"AAAABBBCEDDCCDCCCCDEDEFFEDFEDCBCDDEDDDCCCCCCCDBA"
"AAAACBBCDDDEFGGFCBCDDEFEEEGECCCEEEDDDDCCCCCCCEBA"
"AAAACBBCCCDEFFFDCBBEFEEDDBDEDCDFEDCDDDDDDDEDDEAA"
"AAAACBBCCCDEEFFECBBDFEDDDCCCBCEEECBBDEDDEFFBCDAA"
"AAAADCCCDCDDCDEEDBDEFEEEEECCDDFEDCBBCCCBCDFECDAA"
"AAABDDDDDDEDDDDEEDDFGGEEEEDCEGGEDCCDCCCCDEFDCCAA"
"AAACEDCDEDEEDCDEFFGHHHGFFGGGGHHGEEEFEEDEFDDDCBAA"
"AAAEEDDFFEDDDDEEFGFABCCBBDFEDDEFEDEDEGGFECCEDAAA"
"AAACCDDFFEEDCDFGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAABBEEFEDDDCDGGGFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAABFFEEEEEDFGGGEADFGHHHHHGGGGFDBAAAAAAAAAAAAAA"
"AABBCFEEEDEEEEGGGEEGGHHHHHHHHHHGGHGECAAAAAAAAAAA"
"AADEFFDEEDEFEEFEEEEEGHHHHHHGGGGGFFEEEGFCAAAAAAAA"
"AADEEEEFEEFFFEFEDDEGGGHHGGGFFGGGGGFFFGFGGCAAAAAA"
"AABEDDDEEFFFEGGHEEGHHHHGGGGFEFGGHHHFFFEFGGGBAAAA"
"ABDDCCDFEEEFFGHHHGHHHHHHHGGDDFGGGGFDEEDCEFGHCAAA"
"ACEDEEEFEEEFFGHHHHHHHHHHHHEDEHGGGGGEFFDDDDDFHBAA"
"AEECGGGGGHFEFFHHHHHHHHHGGGGEFGGGGGGGHGGDDDDEEFAA"
"AFEDEGGEEGHGEFHHHHAAAABGGGGEDGHHGGFGGGGFEDDDDEEA"
"ADDDEGFEGGHGHHHHEAAAAAAAGGGEDFHGGGGFGGGFFEEEDEEA"
"AAAAAAAAAAAAAAAAAAAAAAAAAGGFGHGEFGFFGGFFFFFEDCCB"
"AAAAAAAAAAAAAAAAAAAAAAAAAFHHHGEEGFFEEDDEEFEEECBB"
"CDEEBBCEEEFEEFFFEEGHHHAAAGHHHFEFFFFFECDEFEDCFDDD"
"FFFGDCDFFEEEEFGFEEGHHHAAAHGEGGFFFFGGFDCEGFCCEEFE"
"EEEEEDCFEDCDDFFFDFHHHGAAAHGEGGFFFFFGGEDFFFEDEDCC"
"CCCEDCDEFECDEGGFEEEFFEGDGGGFFGFFEFFGFDDFFFEEECBC"
"BBBCCDCDEDDEFFFEDFFFEDFHHGFFEEFEFFFEEDDEEDCDDBCD"
"BDCCDDDDEDEFFFEECEFFECDFGFFFDEEFFFFEDDEDDCDFCCDB"
"AECCCDEDEDFGGGDCCEFEEEDDFFEEEDFFFFFGFFDDEDDFBCDA"
"ABBCCDDCCDDFFEEDCDEEFEEEEFDDDDDFFFDDCDDDEFFBBBAA"
"AACEDCCCBBDCCDDBBCDEFFFEDCCDDDDEEECCCCCCDFGCBAAA"
"AAADDBBBBDEDCCEDDEFEEEEDCBBCDDCCDDCBCDCCCDEEBAAA"
"AAAAACBABEFFDDEFGFFDDBEDDCCDDDDCCCBBCEDCCDDBAAAA"
"AAAAAABBCEGEDDCEFFFBBCDDEEFFEDEDBCCCCEEDCBAAAAAA"
"AAAAAAAABEFDCDCCEDDDDDEEFGGFFEFEBDDDDEDBAAAAAAAA"
"AAAAAAAAAAABEFECBCEEEDDEFEDCDEFECDEDBAAAAAAAAAAA"
"AAAAAAAAAAAAABCAABDECBCEFDDDCDDCBAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue6Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAABBBBCFGGGEDDECBDDCBAAAAAAAAAAAAAAA"
"AAAAAAAAAABCCCCCCCCFGEEDCCCCBCDDFDCBAAAAAAAAAAAA"
"AAAAAAAACDDDCBCCCCEFEDEFFCBFGDCCCCBBCCBAAAAAAAAA"
"AAAAAABDDDEFDDDCCCEFDEEFEDCEEDDDDDDCCCCCBAAAAAAA"
"AAAAACCCBDEFGFFCCCDEEEEEDEGEDCCEEDDDDDDCCCAAAAAA"
"AAACCCCBCEEEFFFCBCCDFFEDCBDECCCDFDCDEDDCBCCBAAAA"
"AABDBBCCEEDDEFFDBCDEEEDDDDEDCBDGGDBCCDDCCBECBAAA"
"ABCBBBDEDDEDDFDCCCEFEEDEEFFDCCEEDCBCCCCDDCDDDAAA"
"ADCCCDEDDDDDCCCDCDFFFFFGGEDDEEFDCCCCCCCDFEDDCDAA"
"EDDDCEEDDDDDCCCEFFGGGGEAADFGGGFECCDDEEEFEFFCCDAA"
"EDDFEEEEEDDDEEEFFFFGGHAAAAGGHGGFEEDCCDFFCCCDDDBA"
"ECCDEEFFFEDDFGGGGDDGGGAAAAGHGGFFGHFDDFFEDDDDECBA"
"ECBCEEFEEECDGGGGFCCEGGAAAAEFEFFGHHHFEFDDDDDEDBBA"
"FBBBFFFEEEDDEGGGEDCDGHAAAAAAAAAAAAAAAAAAAAAAAAAA"
"EECCFFFEFFDEFFGGEDDEHHAAAAAAAAAAAAAAAAAAAAAAAAAA"
"EFFFFFFEEEEEFFGGFGEFHHAAAAAAAAAAAAAAAAAAAAAAAAAA"
"CDFFFFEDEFFFFGFDDFHGHHAAAAAAAAAAAAAAAAAAAAAAAAAA"
"CDFEEDDEEFFFGGEDDFHHHHAAAAAAAAAAAAAAAAAAAAAAAAAA"
"CFFEDDEFDFFFGHHFEGHHHHAAAAAACHGHHHFECBAAAAAAAAAA"
"CFFFDEEEDEFFFGHHHHHHGHAAAEGEFHHGHHGEEEECCAAAAAAA"
"CEFDEFEEGGFFGGGHGHGGGHHHHGEDEHHGGHGDCDGFEDBAAAAA"
"DDEDFFEDFGGFGGGGGGGGGHHHHHFCCEGFGGGEFFGGCCEDAAAA"
"EEEFFEDEFGGFGGGGGGGHHHHGGGGEDFHHFGGGGFFFDDEFDAAA"
"EDCFFDCFFFGFFFFGGGGHHHGFGHHHHGGGGGFGGFEDDEFDDCAA"
"DDDEFCCDFFFEEEFGGGFGHHHFFGHHHHEFFFFFEFEDEEDBCCAA"
"DEEEGCCDFEDDFFEEEFGGHHHDCGHHHFGGFEEEEDCEFFCBCDCA"
"FFFFECCDEEDDEFFEDEFGGHAAAAGGGEFFFFFEDDCEGGDBCDDA"
"EEEEDDDDFFEDEFFEDEGHHHAAAAGGHGEFGGGFEEEFFGEDDCCA"
"CBCCCDEFEEDDDFFEEEFGGHAAAAHFGGFFEEGFEDDFFFFFFBBA"
"BCBCDEEEDDDDEFFEDFFFCDFDDFGFGFFFFFGFDDDEEFFFDBCA"
"ADDCCEEDDDEGGFEDCDFFEEEGHGGFEEFFFFFFEDEEECCECCDA"
"ADCCCDEDCCDGGGDCCDEFEEEFGGFEEEFFFFEDDFFECCCEDBBA"
"AACCBDEEDCBCFGFCCDEEFFFFFFEEDDEGGFDEDEFDDEFECAAA"
"AAACCECCBCCCCEECDEEEFFEDDCDDDDCDEECCCCCDDFGGBAAA"
"AAABCCBBBDEEEFFDEFFDDEEDCCCDDDCCCDDCCBCDCEFDAAAA"
"AAAABBBAADGFEEDEFFECCCEDDDCDDDDCCDDCCCCCCECAAAAA"
"AAAAAABBCGFDDCCCFEDDCCDDEFFEEEEDBCDBBDECCBAAAAAA"
"AAAAAAAACDFDDDCCEEDDEEEEFGGFEFFEBDDCDFDBAAAAAAAA"
"AAAAAAAAAAABEFECCCEEDDEEFEDCDEFECDEDBAAAAAAAAAAA"
"AAAAAAAAAAAAABCAABDDCBDFGDDDCEDCBAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue7Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAACCCEEEDDDDDDCCCFHHEDDEDDFFGFDCDEEDEEDAAAAAA"
"AAAAACCDDDDCCCCCDCCDGGFDCCDCCDDFDCCCCBBCCDAAAAAA"
"AAAAACCDDDCCBCDDCCDEFEEFFFCCDDDDDDDEDBBCCDAAAAAA"
"AAAAACBCDDDDFGGDCCBCEDEFFEDDFFDDDEEEDDBBCDAAAAAA"
"AAAAACCFCDEEGGGDCBBCEEEFEEEFFEDDEEEDDDDCCDAAAAAA"
"AAAAADBCCCDDFGFECBCDEFFEDCCEDDDEEDCCDEEDCDAAAAAA"
"AAAAABBCCDDCDEFFDBCEFDCDEDCDCCDEDCBCDDDEEEAAAAAA"
"AAAAAABDCEDCCEFFCBCEFEDEEEEDDEFEDCCCCCCDDCAAAAAA"
"AAAAABCCCDDCBDDEDEEFFFFEEEEDEFGFEDDDCDCDDCAAAAAA"
"AAAAADCCDDEDDDDFGHHHHGFEEEEFFFFFEEDCCDEEFEAAAAAA"
"AAAAABBBCCBBBBCCCCCDBEEEEFGFFEFFGGEDDEGFEFAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAEFEEEEEEEDFGGGFEFEDECAAAAAA"
"AAAAAAAAAAAAAAAAAAABGGFFFFEEGGGGGGHGGGFDBAAAAAAA"
"AAAAAAAAAAAAAAAAAAAEGGGGGGGFGHGGGGGFEEEBAAAAAAAA"
"AAAAAAAAAAAAAAAAACGGHHGGGHHHHGGGGGFFEEDAAAAAAAAA"
"AAAAAAAAAAAAAAAABGFGHHGGGGGGGGGGEEFEDEAAAAAAAAAA"
"AAAAAAAAAAAAAAAAFFGGGHGGGGGGGGGGGGFEFBAAAAAAAAAA"
"AAAAAAAAAAAAAAAGFCFHGGGHHHGEEFHHHGDEEAAAAAAAAAAA"
"AAAAAAAAAAAAAAGHECGHGFGHHHGEEGHHHGEDAAAAAAAAAAAA"
"AAAAAAAAAAAAAAHHGGHHGHHHHGFEFGHHGGDBAAAAAAAAAAAA"
"AAAAAAAAAAAAAGHHGGGGGGHGGGFDEGHGGGEAAAAAAAAAAAAA"
"AAAAAAAAAAAABFHGGGGGGGGGGGEEEGHGGHFAAAAAAAAAAAAA"
"AAAAAAAAAAAAGDFGGGGGHGGFGGGEFGFGGHAAAAAAAAAAAAAA"
"AAAAAAAAAAACFCEGGGGHHHGFGHHHHGGGGGAAAAAAAAAAAAAA"
"AAAAAAAAAAAFFDEFFGGGHHGEFGHHHHFEFCAAAAAAAAAAAAAA"
"AAAAAAAAAABCDEEEDEFGGGGFEEFFGFEFGAAAAAAAAAAAAAAA"
"AAAAAAAAAADCCFFDDDFGGGGFEGFDFGFEEAAAAAAAAAAAAAAA"
"AAAAAAAAAACDFFEDDEGGGGFFGGFDFGFDCAAAAAAAAAAAAAAA"
"AAAAAAAAABCDFGGFEFGGGGFFGGGEFGGGBAAAAAAAAAAAAAAA"
"AAAAAAAAACCEFFFFFFGFFFFGGFEEFGHHAAAAAAAAAAAAAAAA"
"AAAAAAAABEFDEEFFEFEEDDFGGGFEEFGGAAAAAAAAAAAAAAAA"
"AAAAAAAACFGFDDDDDEFFFEEFGFFFDDFGAAAAAAAAAAAAAAAA"
"AAAAAAAACCDDDDDCCDFFFEEFGFDDDDEDAAAAAAAAAAAAAAAA"
"AAAAAAAABCDEEDDCDEFFFFEDCCCDCCCBAAAAAAAAAAAAAAAA"
"AAAAAAAAADFGEEFEFFFDDEDDCBCDCCCAAAAAAAAAAAAAAAAA"
"AAAAAAAABGFFEEEDFGFCDDEDDBCDCCCAAAAAAAAAAAAAAAAA"
"AAAAAABEEFEEDDCCEFDCCEEEEFGECCCAAAAAAAAAAAAAAAAA"
"AAAAAACEDEEECCCCCEEEEEEFFGGFDDEAAAAAAAAAAAAAAAAA"
"AAAAAACDDBBCDDEDCCDEEDEEFEEDDEFAAAAAAAAAAAAAAAAA"
"AAAAAADECCBBFHGFCBDDCCDFFDDCEFFAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue8Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAABBBBCDGHEDDEEDBCDCDBAAAAAAAAAAAAAA"
"AAAAAAAAAABCCCCCCCCDGGECCCCCBCDDFDCBBAAAAAAAAAAA"
"AAAAAAABCDCCBBCCDDEEFFEDDCBEFCCCCCCCCCBAAAAAAAAA"
"AAAAAACDDDCDEFDCCCCDFEEFFDDEFCCDDDDDDCBBCBAAAAAA"
"AAAABCBCCDDEFGFDCBBBDDEFFFGFEDCEEEDDCDCCCDCAAAAA"
"AAAACBBBBCEEFGGECBCCEEEEEEFFDCCDFFEEDDDCBCDCAAAA"
"AAABBBCCDEDDEFFFDBCDFFEDDDEECCCEEDCDFFEDCCDCCAAA"
"AABCDDEFDDEDCDFEDCCFFFEEEFEECDFEDCBCDDDCCDFDDBAA"
"AACCCBDEDDEDCDEEDDFGGGEFFFEDFGGEDCCCCCCEEDEDCCAA"
"AACCBBEDDDDDDCDEEEGGHHFFFEEEGGGFEFEEDDDEFFEDCDAA"
"ABDDDEFFFDCCCDDEFFGGHHAABEFFGGFFGGGDDFGGFCCDECAA"
"ABBCCDEFGFFDDCEGGEDEGGAAABFFGFFFGGFDEGFEFDDFEDAA"
"AABAAEEFFFEEDEGGGEDDGGAAAAFFGFFFGGGEGFEDDDDGGDAA"
"AABABFFEDDDEFFGGGEDEGGAAAAGGHGGGGGFFFEEEDDDEFAAA"
"AAABDFEDDEFEEEGGFEEFGHAAAGHHHHGGGGFFEEEEFGGFBAAA"
"AAACGGFDDFFFEDGFEFFGGHHGGHHGGGGFEFFFEEEFFHHCAAAA"
"AAAABFFEEFGFEDGEDEGGGHHHHHGGGGGFFFDEFFFHGGCAAAAA"
"AAAAAACFGGGFFFHEDEGGGHHHHHFEFGGGGGFFGGGHCAAAAAAA"
"AAAAAAAABCEFGHHGFGGGGHHHHGEEEGHGGGGFFDAAAAAAAAAA"
"AAAAAAAAAACFFGHHGGGGGGHHHEEEFHHGGGHFBAAAAAAAAAAA"
"AAAAAAABFGGFEGHGGGHGGGHGGFFFGHHGGGGFDFGBAAAAAAAA"
"AAAAAEFHHHGFGGGGGGHGGGHHFGFEEHHGGGGGGHHHDBAAAAAA"
"AAAAGGGGGGGGGHGFGGHGHHHGGGGEEHHGGGGGFGGGFGGBAAAA"
"AABGEDFGFEFGGGEGGGGGHHDAEGHGGGFGGFFEEGGDEFGEBAAA"
"AAGEBBDFFEFFFFEGGGGGHHAAACHHHHGGGEDEECCEEFEBCBAA"
"ADFDBBCFEEEEEEEFEFGGHHAAABHGHGGGGGEDECCEFGDBBDAA"
"AEEEBBCEEDDDDEFFDDGHHHAAABHFGGFFFGGEDCDEFGCBCDCA"
"AEDDCCEEEDDDEFFFDDGHHGAAABHGGGFFFFGGFEEFFFDDDCCA"
"ACBCDEFEEDDEEFFFFFGGGFBAAGGGGGEEFFFGEEEFFEEFEBBA"
"ACBBCDEFEDDDEEFFFFGEEDHGHHFFFFFFFFFFDDEGFEFFDBCA"
"ADCBCDDEEEEFFEEEEFEEEDFHGGFEDFFFFFFEEEEGDCDECCCA"
"ACCBCCEDCDGGGFECCDEFFFEEGGFEDCDFGFFFGFECBDEEDBAA"
"AACACEFDCCCDDEECCEEEFFFFFEDEEDDFFEEDDEDCCEFECAAA"
"AACCCFECBCCBCEEDEEEEEEEDDCCDDDCDEECCDCCCDFGFBAAA"
"AAABEECAABEEEEFDFFGFEDEDDCCDDDCCCDCCCCCDCEFEAAAA"
"AAAABCBAABGGFFEEFGFEDCEEDCCDCDDCCCBBCDCBCEDAAAAA"
"AAAAAABBABFFFCCDFDDCCCDEFFFEDEEDCCCCCEDCDBAAAAAA"
"AAAAAAAABCBBDDCCEDDDDEEFFGGFEFFEBDDDEFEBAAAAAAAA"
"AAAAAAAAAAABEEECBCDEDDEEEFECDEFFCDEDBAAAAAAAAAAA"
"AAAAAAAAAAAAABCAABDDCBDFFDDDCDDBBAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

char medBlue9Map[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAABBBBBDGHFDDEECBDDCCBAAAAAAAAAAAAAA"
"AAAAAAAAAAABCCCCCCCEFFDCCCCCBCDDFDCBAAAAAAAAAAAA"
"AAAAAAABCCCCDCCCCDEFFDDDECBDECCCCCBBCCAAAAAAAAAA"
"AAAAAABDDDEFFFFDCCEFEEFFEDDFGDBCCDDCCCCBAAAAAAAA"
"AAAAABCCCDEFGFGDCCCDDEFFEEGFEDCDDDDDCCCCCCAAAAAA"
"AAABCBBBDEEEEEFDCBCCDEEEDDGEDCCEFFEDEDCCCCCBAAAA"
"AABDCBCEEDDDCDEECCCCEFEDCCDDCCCDFDCCDEEDCCDEAAAA"
"ABBCDDEEDDDCCDEECCCDEEEEEEFECCEFECBCDDDEDDEDDAAA"
"ACCDDDEDDDEDDDEEECDFGFEEEEEDDEFECCCCCCCDEEFCBEAA"
"DDCCDEFEEDEDEDDEEEFGGHGFFEECFGGGEDDEEDDDDDECCEBA"
"EDDCEFEEFDDCDEGGGFFGHHFDEFFEFGGGEDEEDEFFDCDDDEEA"
"FDCCDEFFFEDDCFGGGFEFHBAAAGGGEEFGFGEDDGFEEEEFFEFA"
"EDBBBEFFFDCDDEGGGFCDGAAAAGGGEDEFGGEDDFEEEEFFFEFB"
"FFBBCFFEDCFEDDFGGFEEEAAAAGFEGGGGGGGEEFEEEEDFEDEC"
"CECBDFFDDDFFEEEGFFGGGGCBGHGEFHGGGGGGFFFEFECCDDDB"
"AFEEGFFDDEGFFEFEEEFFGHHGGHHGFGGGGGGFFEFFFFDDCCCB"
"ACDEFEEDDFGFFEFEDDEFFHHHHGGGFGGGGGGFFEGFFGGFCCCB"
"AACFDCCDFFGEEGGFDEGGFGHHHHGGFGGGGGFEFFGFFGGGFECB"
"AAADFDDEFFFDDGHHGGGGGGHHHHFEEGGGGGFEEEFFFFGGGECB"
"AAAABFFEBDEEDFHHHHHHGHHHHHFEDFHHGGFEEEEEEEEGGDCB"
"AAAAAACEEFFFEFGHHHHHHFDAAGGFDGHGGGGGFFFEEEEEEFEB"
"AAAAAAAAACEGGGGHHHHDAAAAAGGEDGHGGGGGGGGFEEFDEFFC"
"AAAAAAAAAAAAAAAAAAAAAAAAAHGEDHGGFGFFFGGGFFFEEFFB"
"AAAAAAAAAAAAAAAAAAAAAAAAAGGEFGGEFGFEFGFGFFFDEDDA"
"AAAAAAAAAAAAAAAAAAAAAAAAAEHHHHFFFFFEEEDFFECCFDCB"
"AAAAAAAAAAAAAAAAAAAAAAAAADEHHHFEEFFEFECEFECCFEEB"
"AAAAAAAAAAAAAAAAAAAAAAAAADEFGGGFFFFFFEDFGFCCEEEC"
"BCBCCBBCDCDDFFFEFEFGGAAAAFHFFGGGFFFGGEEEFFEEEDDB"
"CCCBCCCEFDCCDFGGGHHGGAAAAGGFFFGGFFFGFDDFFEDEECCA"
"BCBBCDDCDDDEDEFFFFFFEBAAAGFFFFFFFFFFECDFEDCFCCCA"
"ADCBDDDCCCGGFDCDDEEEEDAACGFFEEEFFFFEDDDEDCCFCCDA"
"ADCCDDDDDDGGGFCCCDEEEEFGGFFEDEFFFFFFDFEDDDEFCDBA"
"ABCCCCDEEEDFFFECCCDDEEEGGFDDEDDEFFFDDEEDEFFBBBAA"
"AABCBBCDDBCBCDEBCCDDEEFEDCCDDDDEEEDCCDDDDFFCBAAA"
"AAACDCBABDEDBCDBDEFEEEEDCCCEDCDCCCCCCCCCDDDBAAAA"
"AAAABECABEFFDDDDFFFDCCEDCCCDCCCCCCCBCBCCDDCAAAAA"
"AAAAAABBBDGEDDCDGGFCCCDEEFFFDDDDCCDCBCEDBAAAAAAA"
"AAAAAAAABCDDDDCCEEDDCDEEEGGGEFFDCDDDDFDAAAAAAAAA"
"AAAAAAAAAAABEFECBCDEDDDDFEEEDFFFCEEDBAAAAAAAAAAA"
"AAAAAAAAAAAAABBAABDDCBDFFDDCDEDCBAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAA";

/** End of font definition **/


/**
*   drawLED(x,y,whichDigit)
*   Draws a single digit to the display (0 through 9, with 0 being the default).
*   Digit number is passed in 'on' and the location are through x and y (positions 0-1 and 0-2 respectively).
**/
void drawBlueChar(int x, int y, int whichDigit) {
    x = x * MEDBLUE_CHAR_SIZE_H;
    y = y * MEDBLUE_CHAR_SIZE_V + 1;
    pulse_set_draw_window(x, y, x + MEDBLUE_CHAR_SIZE_H - 1, y + MEDBLUE_CHAR_SIZE_V - 1);   // Define the box we're drawing the character in
    switch(whichDigit) {                           // Point at the appropriate digit's data
       case 1: char *map = medBlue1Map;
       case 2: char *map = medBlue2Map;
       case 3: char *map = medBlue3Map;
       case 4: char *map = medBlue4Map;
       case 5: char *map = medBlue5Map;
       case 6: char *map = medBlue6Map;
       case 7: char *map = medBlue7Map;
       case 8: char *map = medBlue8Map;
       case 9: char *map = medBlue9Map;
       default: char *map = medBlue0Map;
       }
    for (int i=0; i < MEDBLUE_CHAR_SIZE_H * MEDBLUE_CHAR_SIZE_V; i++) {            // Draw all the digit's pixels one by one
        pulse_draw_point24(medBlueColors[*map++-'A']);                  // Pulse_draw_image might be faster?
    }
}

int last_sec;
int last_min;
int last_hour;

/**
*   resetLas()
*   Reset "currently displayed" values so as to force a redraw of all digits
**/
void resetLast() {
    last_sec = -1;
    last_min = -1;
    last_hour = -1;
}

void handle_button_causing_wakeup();

/**
*   main_app_init()
*   Initialize... nothing much to do
**/
void main_app_init() {
    resetLast();
    pulse_blank_canvas();                           // Clear screen
    pulse_oled_set_brightness(100);                        // Turn OLED backlight on full power
    pulse_update_power_down_timer(DISPLAY_TIMEOUT);                  // Set when the display will fade out again
    pulse_register_callback(ACTION_WOKE_FROM_BUTTON, &handle_button_causing_wakeup);
}

/**
*   handle_button_causing_wakeup()
*   Turn on from button push... pretty much the same as initialize code (ie. nothing much to do)
**/
void handle_button_causing_wakeup() {
    resetLast();                              // Reset "currently displayed" values
    pulse_blank_canvas();                           // Clear screen
    pulse_oled_set_brightness(100);                        // Turn OLED backlight on full power
    pulse_update_power_down_timer(DISPLAY_TIMEOUT);                  // Set when the display will fade out again
}

void main_app_handle_button_down() {
}

void main_app_handle_button_up() {
}

/**
*   main_app_loop()
*   This code keeps an eye on the time and makes redraw requests for any needed digits.
*   Hour/minute/second value should only be written if it's changed.
*   Note to-do: Redraw test should be done on the two digits of H/M/S separately to about extra drawing of first digit nine times out of ten.
**/

void main_app_loop() {
    struct pulse_time_tm tm;
    pulse_get_time_date(&tm);            // Retrieve the current time
    int sec = tm.tm_sec;            // Pull out the second value
    if (sec!=last_sec) {            // Has it changed?
        last_sec = sec;
        int sec10 = sec / 10;            // Extract first ("tens") digit
        sec %= 10;               // Extract second ("ones") digit               
        drawBlueChar(0, 2, sec);         // Render the two seconds digits to bottom line
        drawBlueChar(1, 2, sec10);
    }
    int min = tm.tm_min;            // Pull out the minute value
    if (min!=last_min) {            // Has it changed?
        last_min = min;
        int min10 = min / 10;            // Extract first ("tens") digit
        min %= 10;               // Extract second ("ones") digit
        drawBlueChar(0, 1, min);         // Render the two minutes digits to centre line
        drawBlueChar(1, 1, min10);
    }
    int hour = tm.tm_hour;            // Pull out the hour value
    if (hour!=last_hour) {            // Has it changed?
        last_hour = hour;
        int hour10 = hour / 10;            // Extract first ("tens") digit
        hour %= 10;               // Extract second ("ones") digit
        drawBlueChar(0, 0, hour);         // Render the two hours digits to top line
        drawBlueChar(1, 0, hour10);
    }
}

/**
*   main_app_handle_doz()
*   Time to go to sleep... do a nice slow fade out
**/
void main_app_handle_doz() {
    for (int i = 100; i >= 0; i-=4) {
        pulse_oled_set_brightness(i);   // Step to next fade-out level
        pulse_mdelay(50);      // Not counting pulse_oled_set_brightness() overhead, fade should take 50ms*25 = 1.5 seconds
    }
}

void main_app_handle_hardware_update(enum PulseHardwareEvent event) {
}


Pretty much any criticism or advice is appreciated. I haven't written anything in C for an extremely long time so my failing brain is pretty much starting from scratch, and it's made harder because inPulse's documentation and environment is still so rough and "alpha" around the edges. Exciting and fun to take part in, but it can get frustrating. Thanks to anyone who can help figure this out.


Attachments:
medfont.zip [37.36 KiB]
Downloaded 12 times

_________________
--
Shannon Larratt \\ http://www.zentastic.com/
I shall have peace as leafy trees are peaceful when rain bends down the bough.
Offline
 Profile  
 
 Post subject: Re: Works on sim, not on watch
PostPosted: Sat Mar 05, 2011 10:15 am 

Joined: Mon Feb 21, 2011 10:03 am
Posts: 26
Location: San Diego, CA
For the first one - did you upload the resources to the device?

For the second case, you can't really trade off resources vs RAM like that - the resources got into an external (to the processor) 1MB Flash, while the program goes into a 32K block of Flash in the processor itself. Global variables (like these tables) end up loaded into processor internal RAM at startup, which on this device is limited to a total 8K, although I think only 2K is available to your program, since the "operating system" of the device needs a bunch to do Bluetooth, etc.

There are some additional tricks to compress the in-band graphics - packing the pixels within bytes, or using a simple run-length encoding scheme. For instance, if you limit the colors to 16, then you can pack two pixels per byte. If your images have sequences of pixels of the same color, you can compress them. Both of these techniques require a little more upfront processing of the images, and a bit more code to render, but it's not substantial.

Here's something to try - declare the image tables as "const" - that *should* move them from the bss segment to the text segment (ie, they move from RAM to the 32K block).


Offline
 Profile  
 
 Post subject: Re: Works on sim, not on watch
PostPosted: Sat Mar 05, 2011 11:06 am 

Joined: Thu Feb 17, 2011 7:28 pm
Posts: 4
Location: Toronto, Canada
I did not upload the resource .bin to the watch -- I didn't realize that had to be done separately and just assumed it was uploading both resource and app .bin files when you run the compile/upload python utility. If I do have to upload that file separately then I'm sure that's my problem, thanks...



_________________
--
Shannon Larratt \\ http://www.zentastic.com/
I shall have peace as leafy trees are peaceful when rain bends down the bough.
Offline
 Profile  
 
Display posts from previous:  Sort by  
 Page 1 of 1 [ 3 posts ] 

All times are UTC - 8 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to: