mesh phone

Dependencies:   RF22 mbed

Committer:
SangSTBK
Date:
Mon Jul 02 03:41:36 2012 +0000
Revision:
0:c674504a6536
mesh

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SangSTBK 0:c674504a6536 1 #include "mbed.h"
SangSTBK 0:c674504a6536 2 #include <stdio.h>
SangSTBK 0:c674504a6536 3 #include "font_new.h"
SangSTBK 0:c674504a6536 4
SangSTBK 0:c674504a6536 5 void Write_Command(unsigned char command);
SangSTBK 0:c674504a6536 6 void SendData(unsigned long color);
SangSTBK 0:c674504a6536 7 void WindowSet(int s_x, int e_x,int s_y,int e_y);
SangSTBK 0:c674504a6536 8
SangSTBK 0:c674504a6536 9 void put_pixcels( int xs, int width, int ys, int height, unsigned char *c, int f_color, int b_color );
SangSTBK 0:c674504a6536 10 void put_pixcels_alpha( int xs, int width, int ys, int height, unsigned char *c, int color, int key );
SangSTBK 0:c674504a6536 11
SangSTBK 0:c674504a6536 12 int FontDrawSpace( int width, int height, int xpos, int ypos, int f_color, int b_color );
SangSTBK 0:c674504a6536 13
SangSTBK 0:c674504a6536 14 typedef struct _draw_font_parameters {
SangSTBK 0:c674504a6536 15 font *font_ptr;
SangSTBK 0:c674504a6536 16 int inter_char_space;
SangSTBK 0:c674504a6536 17 int alpha_mode;
SangSTBK 0:c674504a6536 18 int f_color;
SangSTBK 0:c674504a6536 19 int b_color;
SangSTBK 0:c674504a6536 20 }
SangSTBK 0:c674504a6536 21 draw_font_parameters;
SangSTBK 0:c674504a6536 22 draw_font_parameters dfp;
SangSTBK 0:c674504a6536 23
SangSTBK 0:c674504a6536 24 font Calibri14;
SangSTBK 0:c674504a6536 25 font Calibri28;
SangSTBK 0:c674504a6536 26 font Calibri72;
SangSTBK 0:c674504a6536 27 font Calibri78_1;
SangSTBK 0:c674504a6536 28
SangSTBK 0:c674504a6536 29 void FontDrawInit( void )
SangSTBK 0:c674504a6536 30 {
SangSTBK 0:c674504a6536 31 Calibri14.height = 23;
SangSTBK 0:c674504a6536 32 Calibri14.max_width = 17;
SangSTBK 0:c674504a6536 33 Calibri14.space_width = 7;
SangSTBK 0:c674504a6536 34 Calibri14.data_table = c14_data_table;
SangSTBK 0:c674504a6536 35 Calibri14.offset_table = c14_offset_table;
SangSTBK 0:c674504a6536 36 Calibri14.index_table = c14_index_table;
SangSTBK 0:c674504a6536 37 Calibri14.width_table = c14_width_table;
SangSTBK 0:c674504a6536 38
SangSTBK 0:c674504a6536 39 Calibri28.height = 45;
SangSTBK 0:c674504a6536 40 Calibri28.max_width = 34;
SangSTBK 0:c674504a6536 41 Calibri28.space_width = 10;
SangSTBK 0:c674504a6536 42 Calibri28.data_table = c28_data_table;
SangSTBK 0:c674504a6536 43 Calibri28.offset_table = c28_offset_table;
SangSTBK 0:c674504a6536 44 Calibri28.index_table = c28_index_table;
SangSTBK 0:c674504a6536 45 Calibri28.width_table = c28_width_table;
SangSTBK 0:c674504a6536 46
SangSTBK 0:c674504a6536 47 Calibri72.height = 117;
SangSTBK 0:c674504a6536 48 Calibri72.max_width = 87;
SangSTBK 0:c674504a6536 49 Calibri72.space_width = 20;
SangSTBK 0:c674504a6536 50 Calibri72.data_table = c72_data_table;
SangSTBK 0:c674504a6536 51 Calibri72.offset_table = c72_offset_table;
SangSTBK 0:c674504a6536 52 Calibri72.index_table = c72_index_table;
SangSTBK 0:c674504a6536 53 Calibri72.width_table = c72_width_table;
SangSTBK 0:c674504a6536 54
SangSTBK 0:c674504a6536 55 Calibri78_1.height = 117;
SangSTBK 0:c674504a6536 56 Calibri78_1.max_width = 49;
SangSTBK 0:c674504a6536 57 Calibri78_1.space_width = 20;
SangSTBK 0:c674504a6536 58 Calibri78_1.data_table = c78_1_data_table;
SangSTBK 0:c674504a6536 59 Calibri78_1.offset_table = c78_1_offset_table;
SangSTBK 0:c674504a6536 60 Calibri78_1.index_table = c78_1_index_table;
SangSTBK 0:c674504a6536 61 Calibri78_1.width_table = c78_1_width_table;
SangSTBK 0:c674504a6536 62
SangSTBK 0:c674504a6536 63 dfp.font_ptr = &Calibri14;
SangSTBK 0:c674504a6536 64 dfp.inter_char_space = 0;
SangSTBK 0:c674504a6536 65 dfp.alpha_mode = 0;
SangSTBK 0:c674504a6536 66 dfp.f_color = 0x0000FF;
SangSTBK 0:c674504a6536 67 dfp.b_color = 0xFFFFFF;
SangSTBK 0:c674504a6536 68
SangSTBK 0:c674504a6536 69 #if 0
SangSTBK 0:c674504a6536 70 // printf( "c14_data_table : %p\r\n", c14_data_table );
SangSTBK 0:c674504a6536 71 // printf( "c14_data_table : %p\r\n", Calibri14.data_table );
SangSTBK 0:c674504a6536 72 // printf( "c14_offset_table : %p\r\n", Calibri14.offset_table );
SangSTBK 0:c674504a6536 73 // printf( "c14_index_table : %p\r\n", Calibri14.index_table );
SangSTBK 0:c674504a6536 74 // printf( "c14_width_table : %p\r\n", Calibri14.width_table );
SangSTBK 0:c674504a6536 75
SangSTBK 0:c674504a6536 76 // printf( "(dfp.font_ptr->)data_table : %p\r\n", dfp.font_ptr->data_table );
SangSTBK 0:c674504a6536 77 #endif
SangSTBK 0:c674504a6536 78 }
SangSTBK 0:c674504a6536 79
SangSTBK 0:c674504a6536 80 //#ifdef TEST
SangSTBK 0:c674504a6536 81 //extern unsigned char screen[ SC_WIDTH * SC_HEIGHT ];
SangSTBK 0:c674504a6536 82 //#endif
SangSTBK 0:c674504a6536 83
SangSTBK 0:c674504a6536 84 void put_pixcels( int xs, int width, int ys, int height, unsigned char *c, int f_color, int b_color )
SangSTBK 0:c674504a6536 85 {
SangSTBK 0:c674504a6536 86 int i;
SangSTBK 0:c674504a6536 87 int j;
SangSTBK 0:c674504a6536 88
SangSTBK 0:c674504a6536 89 #ifdef TEST
SangSTBK 0:c674504a6536 90 for ( j = 0; j < height; j++ )
SangSTBK 0:c674504a6536 91 for ( i = 0; i < width; i++ )
SangSTBK 0:c674504a6536 92 *(screen + ((((height - 1) - j) + ys) * SC_WIDTH) + i + xs) = (unsigned char)((*c++ == 'F') ? f_color : b_color);
SangSTBK 0:c674504a6536 93 #else
SangSTBK 0:c674504a6536 94 WindowSet( xs, (xs + width) - 1, ys, (ys + height) - 1 );
SangSTBK 0:c674504a6536 95
SangSTBK 0:c674504a6536 96 Write_Command( 0x2c );
SangSTBK 0:c674504a6536 97
SangSTBK 0:c674504a6536 98 for ( j = 0; j < height; j++ )
SangSTBK 0:c674504a6536 99 for ( i = 0; i < width; i++ )
SangSTBK 0:c674504a6536 100 SendData( (*c++ == 'F') ? f_color : b_color );
SangSTBK 0:c674504a6536 101 #endif
SangSTBK 0:c674504a6536 102 }
SangSTBK 0:c674504a6536 103
SangSTBK 0:c674504a6536 104
SangSTBK 0:c674504a6536 105 void put_pixcels_alpha( int xs, int width, int ys, int height, unsigned char *c, int color, int key )
SangSTBK 0:c674504a6536 106 {
SangSTBK 0:c674504a6536 107 int i;
SangSTBK 0:c674504a6536 108 int j;
SangSTBK 0:c674504a6536 109
SangSTBK 0:c674504a6536 110 #ifdef TEST
SangSTBK 0:c674504a6536 111
SangSTBK 0:c674504a6536 112 for ( j = 0; j < height; j++ )
SangSTBK 0:c674504a6536 113 {
SangSTBK 0:c674504a6536 114 for ( i = 0; i < width; i++ )
SangSTBK 0:c674504a6536 115 {
SangSTBK 0:c674504a6536 116 if ( *c == 'F' )
SangSTBK 0:c674504a6536 117 *(screen + ((((height - 1) - j) + ys) * SC_WIDTH) + i + xs) = color;
SangSTBK 0:c674504a6536 118 c++;
SangSTBK 0:c674504a6536 119 }
SangSTBK 0:c674504a6536 120 }
SangSTBK 0:c674504a6536 121
SangSTBK 0:c674504a6536 122 #else
SangSTBK 0:c674504a6536 123
SangSTBK 0:c674504a6536 124 for ( j = 0; j < height; j++ )
SangSTBK 0:c674504a6536 125 {
SangSTBK 0:c674504a6536 126 for ( i = 0; i < width; i++ )
SangSTBK 0:c674504a6536 127 {
SangSTBK 0:c674504a6536 128 if ( *c != key )
SangSTBK 0:c674504a6536 129 {
SangSTBK 0:c674504a6536 130 WindowSet( xs + i, xs + i, ys + j, ys + j );
SangSTBK 0:c674504a6536 131 Write_Command( 0x2c );
SangSTBK 0:c674504a6536 132 SendData( *c++ );
SangSTBK 0:c674504a6536 133 }
SangSTBK 0:c674504a6536 134 }
SangSTBK 0:c674504a6536 135 }
SangSTBK 0:c674504a6536 136
SangSTBK 0:c674504a6536 137 #endif
SangSTBK 0:c674504a6536 138
SangSTBK 0:c674504a6536 139 }
SangSTBK 0:c674504a6536 140
SangSTBK 0:c674504a6536 141 int FontDrawStringWidth( char *s, font *font_ptr )
SangSTBK 0:c674504a6536 142 {
SangSTBK 0:c674504a6536 143 int str_width = 0;
SangSTBK 0:c674504a6536 144 char c;
SangSTBK 0:c674504a6536 145
SangSTBK 0:c674504a6536 146 while ( c = *s++ )
SangSTBK 0:c674504a6536 147 {
SangSTBK 0:c674504a6536 148 if ( ' ' == c )
SangSTBK 0:c674504a6536 149 {
SangSTBK 0:c674504a6536 150 str_width += font_ptr->space_width;
SangSTBK 0:c674504a6536 151 }
SangSTBK 0:c674504a6536 152 else
SangSTBK 0:c674504a6536 153 {
SangSTBK 0:c674504a6536 154 str_width += font_ptr->width_table[ font_ptr->index_table[ c ] ];
SangSTBK 0:c674504a6536 155
SangSTBK 0:c674504a6536 156 if ( dfp.inter_char_space )
SangSTBK 0:c674504a6536 157 str_width += dfp.inter_char_space;
SangSTBK 0:c674504a6536 158 }
SangSTBK 0:c674504a6536 159 }
SangSTBK 0:c674504a6536 160
SangSTBK 0:c674504a6536 161 return ( str_width );
SangSTBK 0:c674504a6536 162 }
SangSTBK 0:c674504a6536 163
SangSTBK 0:c674504a6536 164
SangSTBK 0:c674504a6536 165 unsigned char pad[ 90 * 120 ];
SangSTBK 0:c674504a6536 166
SangSTBK 0:c674504a6536 167
SangSTBK 0:c674504a6536 168 int FontDrawChar( char c, int xpos, int ypos, int f_color, int b_color, font *font_ptr )
SangSTBK 0:c674504a6536 169 {
SangSTBK 0:c674504a6536 170 unsigned char index;
SangSTBK 0:c674504a6536 171 unsigned int offset;
SangSTBK 0:c674504a6536 172 int width;
SangSTBK 0:c674504a6536 173 int height;
SangSTBK 0:c674504a6536 174 unsigned char *data;
SangSTBK 0:c674504a6536 175 int i;
SangSTBK 0:c674504a6536 176 int j;
SangSTBK 0:c674504a6536 177
SangSTBK 0:c674504a6536 178 index = font_ptr->index_table[ c ];
SangSTBK 0:c674504a6536 179 offset = font_ptr->offset_table[ index ];
SangSTBK 0:c674504a6536 180
SangSTBK 0:c674504a6536 181 height = font_ptr->height;
SangSTBK 0:c674504a6536 182
SangSTBK 0:c674504a6536 183 if ( ' ' == c )
SangSTBK 0:c674504a6536 184 return ( FontDrawSpace( font_ptr->space_width, height, xpos, ypos, f_color, b_color ) );
SangSTBK 0:c674504a6536 185
SangSTBK 0:c674504a6536 186 width = font_ptr->width_table[ index ];
SangSTBK 0:c674504a6536 187
SangSTBK 0:c674504a6536 188 //#if 0
SangSTBK 0:c674504a6536 189 // printf( "char = '%c' on %d / %d - %d / %d - %p\r\n", c, xpos, ypos, f_color, b_color, font_ptr );
SangSTBK 0:c674504a6536 190 // printf( "c14_data_table : %p\r\n", c14_data_table );
SangSTBK 0:c674504a6536 191 // printf( "c14_offset_table : %p\r\n", c14_offset_table );
SangSTBK 0:c674504a6536 192 // printf( "c14_index_table : %p\r\n", c14_index_table );
SangSTBK 0:c674504a6536 193 // printf( "c14_width_table : %p\r\n", c14_width_table );
SangSTBK 0:c674504a6536 194 // printf( "(dfp.font_ptr->)data_table : %p\r\n", dfp.font_ptr->data_table );
SangSTBK 0:c674504a6536 195 // printf( "font_ptr->height : %p\r\n", font_ptr->height );
SangSTBK 0:c674504a6536 196 // printf( "font_ptr->max_width : %p\r\n", font_ptr->max_width );
SangSTBK 0:c674504a6536 197 // printf( "font_ptr->space_width : %p\r\n", font_ptr->space_width );
SangSTBK 0:c674504a6536 198 // printf( "font_ptr->data_table : %p\r\n", font_ptr->data_table );
SangSTBK 0:c674504a6536 199 // printf( "font_ptr->offset_table : %p (%p)\r\n", font_ptr->offset_table, font_ptr->offset_table - (unsigned int *)font_ptr->data_table );
SangSTBK 0:c674504a6536 200 // printf( "font_ptr->index_table : %p (%p)\r\n", font_ptr->index_table, font_ptr->index_table - font_ptr->data_table );
SangSTBK 0:c674504a6536 201 // printf( "font_ptr->width_table : %p (%p)\r\n", font_ptr->width_table, font_ptr->width_table - font_ptr->data_table );
SangSTBK 0:c674504a6536 202 // printf( "index = %u\r\n", index );
SangSTBK 0:c674504a6536 203 // printf( "offset = %u\r\n", offset );
SangSTBK 0:c674504a6536 204 // printf( "width = %u\r\n", width );
SangSTBK 0:c674504a6536 205 // printf( "height = %u\r\n", height );
SangSTBK 0:c674504a6536 206 // printf( "\r\n" );
SangSTBK 0:c674504a6536 207 //#endif
SangSTBK 0:c674504a6536 208 data = (unsigned char *)(&(font_ptr->data_table[ offset ]));
SangSTBK 0:c674504a6536 209
SangSTBK 0:c674504a6536 210 //#define CHAR_FLIP_NORMAL_HORIZONTAL
SangSTBK 0:c674504a6536 211
SangSTBK 0:c674504a6536 212 #define CHAR_FLIP_NORMAL_VERTICAL
SangSTBK 0:c674504a6536 213
SangSTBK 0:c674504a6536 214 for ( i = 0; i < width; i++ )
SangSTBK 0:c674504a6536 215 {
SangSTBK 0:c674504a6536 216 for ( j = 0; j < height; j++ )
SangSTBK 0:c674504a6536 217 {
SangSTBK 0:c674504a6536 218 #if defined( CHAR_FLIP_NORMAL_HORIZONTAL ) && !defined( CHAR_FLIP_NORMAL_VERTICAL )
SangSTBK 0:c674504a6536 219 *(pad + (j * width) + ((width - 1) - i)) = (*(data + (i * ((height + 7) / 8)) + (j / 8)) << (j % 8)) & 0x80 ? 'F' : 'B';
SangSTBK 0:c674504a6536 220 #elif !defined( CHAR_FLIP_NORMAL_HORIZONTAL ) && defined( CHAR_FLIP_NORMAL_VERTICAL )
SangSTBK 0:c674504a6536 221 *(pad + (((height - 1) - j) * width) + i) = (*(data + (i * ((height + 7) / 8)) + (j / 8)) << (j % 8)) & 0x80 ? 'F' : 'B';
SangSTBK 0:c674504a6536 222 #elif defined( CHAR_FLIP_NORMAL_HORIZONTAL ) && defined( CHAR_FLIP_NORMAL_VERTICAL )
SangSTBK 0:c674504a6536 223 *(pad + (((height - 1) - j) * width) + ((width - 1) - i)) = (*(data + (i * ((height + 7) / 8)) + (j / 8)) << (j % 8)) & 0x80 ? 'F' : 'B';
SangSTBK 0:c674504a6536 224 #else
SangSTBK 0:c674504a6536 225 *(pad + (j * width) + i) = (*(data + (i * ((height + 7) / 8)) + (j / 8)) << (j % 8)) & 0x80 ? 'F' : 'B';
SangSTBK 0:c674504a6536 226 #endif
SangSTBK 0:c674504a6536 227
SangSTBK 0:c674504a6536 228
SangSTBK 0:c674504a6536 229
SangSTBK 0:c674504a6536 230 #if 0
SangSTBK 0:c674504a6536 231 #if 0
SangSTBK 0:c674504a6536 232 *(pad + (j * width) + i) = (*(data + (i * ((height + 7) / 8)) + (j / 8)) << (j % 8)) & 0x80 ? 'F' : 'B';
SangSTBK 0:c674504a6536 233 #else
SangSTBK 0:c674504a6536 234 *(pad + (((height - 1) - j) * width) + i) = (*(data + (i * ((height + 7) / 8)) + (j / 8)) << (j % 8)) & 0x80 ? 'F' : 'B';
SangSTBK 0:c674504a6536 235 #endif
SangSTBK 0:c674504a6536 236 #endif
SangSTBK 0:c674504a6536 237 }
SangSTBK 0:c674504a6536 238 }
SangSTBK 0:c674504a6536 239
SangSTBK 0:c674504a6536 240 if ( dfp.alpha_mode )
SangSTBK 0:c674504a6536 241 put_pixcels_alpha( xpos, width, ypos, height, pad, f_color, b_color );
SangSTBK 0:c674504a6536 242 else
SangSTBK 0:c674504a6536 243 put_pixcels( xpos, width, ypos, height, pad, f_color, b_color );
SangSTBK 0:c674504a6536 244
SangSTBK 0:c674504a6536 245 if ( dfp.inter_char_space )
SangSTBK 0:c674504a6536 246 width += FontDrawSpace( dfp.inter_char_space, height, xpos + width, ypos, f_color, b_color );
SangSTBK 0:c674504a6536 247
SangSTBK 0:c674504a6536 248 return ( width );
SangSTBK 0:c674504a6536 249 }
SangSTBK 0:c674504a6536 250
SangSTBK 0:c674504a6536 251
SangSTBK 0:c674504a6536 252 int FontDrawSpace( int width, int height, int xpos, int ypos, int f_color, int b_color )
SangSTBK 0:c674504a6536 253 {
SangSTBK 0:c674504a6536 254 int i;
SangSTBK 0:c674504a6536 255 unsigned char pad[ width * height ];
SangSTBK 0:c674504a6536 256
SangSTBK 0:c674504a6536 257 if ( dfp.alpha_mode )
SangSTBK 0:c674504a6536 258 return ( width );
SangSTBK 0:c674504a6536 259
SangSTBK 0:c674504a6536 260 for ( i = 0; i < width * height; i++ )
SangSTBK 0:c674504a6536 261 *(pad + i) = b_color;
SangSTBK 0:c674504a6536 262
SangSTBK 0:c674504a6536 263 put_pixcels( xpos, width, ypos, height, pad, f_color, b_color );
SangSTBK 0:c674504a6536 264
SangSTBK 0:c674504a6536 265 return ( width );
SangSTBK 0:c674504a6536 266 }
SangSTBK 0:c674504a6536 267
SangSTBK 0:c674504a6536 268
SangSTBK 0:c674504a6536 269 void FontDrawString( char *s, int xpos, int ypos, int f_color, int b_color, font *font_ptr )
SangSTBK 0:c674504a6536 270 {
SangSTBK 0:c674504a6536 271 char c;
SangSTBK 0:c674504a6536 272
SangSTBK 0:c674504a6536 273 while ( c = *s++ )
SangSTBK 0:c674504a6536 274 xpos += FontDrawChar( c, xpos, ypos, f_color, b_color, font_ptr );
SangSTBK 0:c674504a6536 275 }
SangSTBK 0:c674504a6536 276
SangSTBK 0:c674504a6536 277 void FontDraw_SetInterCharSpace( int space )
SangSTBK 0:c674504a6536 278 {
SangSTBK 0:c674504a6536 279 dfp.inter_char_space = space;
SangSTBK 0:c674504a6536 280 }
SangSTBK 0:c674504a6536 281
SangSTBK 0:c674504a6536 282
SangSTBK 0:c674504a6536 283 void FontDraw_SetAlphaMode( int mode )
SangSTBK 0:c674504a6536 284 {
SangSTBK 0:c674504a6536 285 dfp.alpha_mode = mode;
SangSTBK 0:c674504a6536 286 }
SangSTBK 0:c674504a6536 287
SangSTBK 0:c674504a6536 288 void FontDraw_SetFont( font f )
SangSTBK 0:c674504a6536 289 {
SangSTBK 0:c674504a6536 290 dfp.font_ptr = &f;
SangSTBK 0:c674504a6536 291 }
SangSTBK 0:c674504a6536 292
SangSTBK 0:c674504a6536 293 void FontDraw_SetForegroundColor( int v )
SangSTBK 0:c674504a6536 294 {
SangSTBK 0:c674504a6536 295 dfp.f_color = v;
SangSTBK 0:c674504a6536 296 }
SangSTBK 0:c674504a6536 297
SangSTBK 0:c674504a6536 298 void FontDraw_SetBackgroundColor( int v )
SangSTBK 0:c674504a6536 299 {
SangSTBK 0:c674504a6536 300 dfp.b_color = v;
SangSTBK 0:c674504a6536 301 }
SangSTBK 0:c674504a6536 302
SangSTBK 0:c674504a6536 303 void FontDraw_puts( int x, int y, char *s )
SangSTBK 0:c674504a6536 304 {
SangSTBK 0:c674504a6536 305 FontDrawString( s, x, y, dfp.f_color, dfp.b_color, dfp.font_ptr );
SangSTBK 0:c674504a6536 306 }
SangSTBK 0:c674504a6536 307
SangSTBK 0:c674504a6536 308
SangSTBK 0:c674504a6536 309 #include <stdarg.h>
SangSTBK 0:c674504a6536 310
SangSTBK 0:c674504a6536 311 void FontDraw_printf( int x, int y, char *format, ... )
SangSTBK 0:c674504a6536 312 {
SangSTBK 0:c674504a6536 313 char s[ 80 ];
SangSTBK 0:c674504a6536 314 va_list args;
SangSTBK 0:c674504a6536 315
SangSTBK 0:c674504a6536 316 va_start( args, format );
SangSTBK 0:c674504a6536 317 vsnprintf( s, 32, format, args );
SangSTBK 0:c674504a6536 318 va_end( args );
SangSTBK 0:c674504a6536 319
SangSTBK 0:c674504a6536 320 FontDraw_puts( x, y, s );
SangSTBK 0:c674504a6536 321 }