Subversion Repositories chibiosIgnition

Rev

Rev 3 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3 Rev 9
Line 5... Line 5...
5
 *  Created on: 20 Dec 2015
5
 *  Created on: 20 Dec 2015
6
 *      Author: Mike
6
 *      Author: Mike
7
 */
7
 */
8
#include <stdint.h>
8
#include <stdint.h>
9
#include <string.h>
9
#include <string.h>
-
 
10
#include "Font.h"
10
#include "ap_math.h"
11
#include "ap_math.h"
11
#include "SSD1306.h"
12
#include "SSD1306.h"
12
 
13
 
13
 
14
 
-
 
15
// the Lucida font is on a x10 y18 grid
-
 
16
#define FONTX 10
-
 
17
#define FONTY 18
14
 
18
 
15
#include "ascii-lucida.h"
19
#include "ascii-lucida.h"
16
 
20
 
-
 
21
// this gets the pixel for position x,y in character c
-
 
22
uint8_t get_font_pixel(uint16_t x, uint16_t y, uint8_t c)
-
 
23
{
-
 
24
        if(c<32)
-
 
25
           c= 32;
17
 
26
 
18
uint8_t cursor_x;
-
 
19
uint8_t cursor_y;
27
        x = x+FONTX*(c-32);
20
 
-
 
21
 
-
 
22
#include "Font.h"
-
 
23
/*
-
 
24
 * display text using a 5x7 bitmap font in ASCII letters
28
        return ((ascii_lucida_bits[(y*ascii_lucida_width)/8+(x/8)])>>(x&7)) & 1 ;
25
 */
-
 
26
static const unsigned char font [] [5] = {
-
 
27
        { 0x00,0x00,0x00,0x00,0x00 },   //   0x20 32
-
 
28
        { 0x00,0x00,0x6f,0x00,0x00 },   // ! 0x21 33
-
 
29
        { 0x00,0x07,0x00,0x07,0x00 },   // " 0x22 34
-
 
30
        { 0x14,0x7f,0x14,0x7f,0x14 },   // # 0x23 35
-
 
31
  //      { 0x00,0x07,0x04,0x1e,0x00 },   // $ 0x24 36
-
 
32
                {0x2e, 0x2a, 0xff, 0x2a, 0x3a},
-
 
33
                { 0x23,0x13,0x08,0x64,0x62 },   // % 0x25 37
-
 
34
        { 0x36,0x49,0x56,0x20,0x50 },   // & 0x26 38
-
 
35
        { 0x00,0x00,0x07,0x00,0x00 },   // ' 0x27 39
-
 
36
        { 0x00,0x1c,0x22,0x41,0x00 },   // ( 0x28 40
-
 
37
        { 0x00,0x41,0x22,0x1c,0x00 },   // ) 0x29 41
-
 
38
        { 0x14,0x08,0x3e,0x08,0x14 },   // * 0x2a 42
-
 
39
        { 0x08,0x08,0x3e,0x08,0x08 },   // + 0x2b 43
-
 
40
        { 0x00,0x50,0x30,0x00,0x00 },   // , 0x2c 44
-
 
41
        { 0x08,0x08,0x08,0x08,0x08 },   // - 0x2d 45
-
 
42
        { 0x00,0x60,0x60,0x00,0x00 },   // . 0x2e 46
-
 
43
        { 0x20,0x10,0x08,0x04,0x02 },   // / 0x2f 47
-
 
44
        { 0x3e,0x51,0x49,0x45,0x3e },   // 0 0x30 48
-
 
45
        { 0x00,0x42,0x7f,0x40,0x00 },   // 1 0x31 49
-
 
46
        { 0x42,0x61,0x51,0x49,0x46 },   // 2 0x32 50
-
 
47
        { 0x21,0x41,0x45,0x4b,0x31 },   // 3 0x33 51
-
 
48
        { 0x18,0x14,0x12,0x7f,0x10 },   // 4 0x34 52
-
 
49
        { 0x27,0x45,0x45,0x45,0x39 },   // 5 0x35 53
-
 
50
        { 0x3c,0x4a,0x49,0x49,0x30 },   // 6 0x36 54
-
 
51
        { 0x01,0x71,0x09,0x05,0x03 },   // 7 0x37 55
-
 
52
        { 0x36,0x49,0x49,0x49,0x36 },   // 8 0x38 56
-
 
53
        { 0x06,0x49,0x49,0x29,0x1e },   // 9 0x39 57
-
 
54
        { 0x00,0x36,0x36,0x00,0x00 },   // : 0x3a 58
-
 
55
        { 0x00,0x56,0x36,0x00,0x00 },   // ; 0x3b 59
-
 
56
        { 0x08,0x14,0x22,0x41,0x00 },   // < 0x3c 60
-
 
57
        { 0x14,0x14,0x14,0x14,0x14 },   // = 0x3d 61
-
 
58
        { 0x00,0x41,0x22,0x14,0x08 },   // > 0x3e 62
-
 
59
        { 0x02,0x01,0x51,0x09,0x06 },   // ? 0x3f 63
-
 
60
        { 0x3e,0x41,0x5d,0x49,0x4e },   // @ 0x40 64
-
 
61
        { 0x7e,0x09,0x09,0x09,0x7e },   // A 0x41 65
-
 
62
        { 0x7f,0x49,0x49,0x49,0x36 },   // B 0x42 66
-
 
63
        { 0x3e,0x41,0x41,0x41,0x22 },   // C 0x43 67
-
 
64
        { 0x7f,0x41,0x41,0x41,0x3e },   // D 0x44 68
-
 
65
        { 0x7f,0x49,0x49,0x49,0x41 },   // E 0x45 69
-
 
66
        { 0x7f,0x09,0x09,0x09,0x01 },   // F 0x46 70
-
 
67
        { 0x3e,0x41,0x49,0x49,0x7a },   // G 0x47 71
-
 
68
        { 0x7f,0x08,0x08,0x08,0x7f },   // H 0x48 72
-
 
69
        { 0x00,0x41,0x7f,0x41,0x00 },   // I 0x49 73
-
 
70
        { 0x20,0x40,0x41,0x3f,0x01 },   // J 0x4a 74
-
 
71
        { 0x7f,0x08,0x14,0x22,0x41 },   // K 0x4b 75
-
 
72
        { 0x7f,0x40,0x40,0x40,0x40 },   // L 0x4c 76
-
 
73
        { 0x7f,0x02,0x0c,0x02,0x7f },   // M 0x4d 77
-
 
74
        { 0x7f,0x04,0x08,0x10,0x7f },   // N 0x4e 78
-
 
75
        { 0x3e,0x41,0x41,0x41,0x3e },   // O 0x4f 79
-
 
76
        { 0x7f,0x09,0x09,0x09,0x06 },   // P 0x50 80
-
 
77
        { 0x3e,0x41,0x51,0x21,0x5e },   // Q 0x51 81
-
 
78
        { 0x7f,0x09,0x19,0x29,0x46 },   // R 0x52 82
-
 
79
        { 0x46,0x49,0x49,0x49,0x31 },   // S 0x53 83
-
 
80
        { 0x01,0x01,0x7f,0x01,0x01 },   // T 0x54 84
-
 
81
        { 0x3f,0x40,0x40,0x40,0x3f },   // U 0x55 85
-
 
82
        { 0x0f,0x30,0x40,0x30,0x0f },   // V 0x56 86
-
 
83
        { 0x3f,0x40,0x30,0x40,0x3f },   // W 0x57 87
-
 
84
        { 0x63,0x14,0x08,0x14,0x63 },   // X 0x58 88
-
 
85
        { 0x07,0x08,0x70,0x08,0x07 },   // Y 0x59 89
-
 
86
        { 0x61,0x51,0x49,0x45,0x43 },   // Z 0x5a 90
-
 
87
//        { 0x3c,0x4a,0x49,0x29,0x1e },   // [ 0x5b 91
-
 
88
            { 0x00,0x00,0x7f,0x41,0x00 },
-
 
89
        { 0x02,0x04,0x08,0x10,0x20 },   // \ 0x5c 92
-
 
90
        { 0x00,0x41,0x7f,0x00,0x00 },   // ] 0x5d 93
-
 
91
        { 0x04,0x02,0x01,0x02,0x04 },   // ^ 0x5e 94
-
 
92
        { 0x40,0x40,0x40,0x40,0x40 },   // _ 0x5f 95
-
 
93
        { 0x00,0x00,0x03,0x04,0x00 },   // ` 0x60 96
-
 
94
        { 0x20,0x54,0x54,0x54,0x78 },   // a 0x61 97
-
 
95
        { 0x7f,0x48,0x44,0x44,0x38 },   // b 0x62 98
-
 
96
//        { 0x38,0x44,0x44,0x44,0x20 },   // c 0x63 99
-
 
97
                 { 0x38,0x44,0x44,0x44,0x44 },
-
 
98
                { 0x38,0x44,0x44,0x48,0x7f },   // d 0x64 100
-
 
99
        { 0x38,0x54,0x54,0x54,0x18 },   // e 0x65 101
-
 
100
        { 0x08,0x7e,0x09,0x01,0x02 },   // f 0x66 102
-
 
101
        { 0x0c,0x52,0x52,0x52,0x3e },   // g 0x67 103
-
 
102
        { 0x7f,0x08,0x04,0x04,0x78 },   // h 0x68 104
-
 
103
        { 0x00,0x44,0x7d,0x40,0x00 },   // i 0x69 105
-
 
104
        { 0x20,0x40,0x44,0x3d,0x00 },   // j 0x6a 106
-
 
105
        { 0x00,0x7f,0x10,0x28,0x44 },   // k 0x6b 107
-
 
106
        { 0x00,0x41,0x7f,0x40,0x00 },   // l 0x6c 108
-
 
107
        { 0x7c,0x04,0x18,0x04,0x78 },   // m 0x6d 109
-
 
108
        { 0x7c,0x08,0x04,0x04,0x78 },   // n 0x6e 110
-
 
109
        { 0x38,0x44,0x44,0x44,0x38 },   // o 0x6f 111
-
 
110
        { 0x7c,0x14,0x14,0x14,0x08 },   // p 0x70 112
-
 
111
//        { 0x08,0x14,0x14,0x18,0x7c },   // q 0x71 113
-
 
112
            { 0x08,0x14,0x14,0x14,0x7c },
-
 
113
        { 0x7c,0x08,0x04,0x04,0x08 },   // r 0x72 114
-
 
114
        { 0x48,0x54,0x54,0x54,0x20 },   // s 0x73 115
-
 
115
        { 0x04,0x3f,0x44,0x40,0x20 },   // t 0x74 116
-
 
116
        { 0x3c,0x40,0x40,0x20,0x7c },   // u 0x75 117
-
 
117
        { 0x1c,0x20,0x40,0x20,0x1c },   // v 0x76 118
-
 
118
        { 0x3c,0x40,0x30,0x40,0x3c },   // w 0x77 119
-
 
119
        { 0x44,0x28,0x10,0x28,0x44 },   // x 0x78 120
-
 
120
        { 0x0c,0x50,0x50,0x50,0x3c },   // y 0x79 121
-
 
121
        { 0x44,0x64,0x54,0x4c,0x44 },   // z 0x7a 122
-
 
122
        { 0x00,0x08,0x36,0x41,0x41 },   // { 0x7b 123
-
 
123
        { 0x00,0x00,0x7f,0x00,0x00 },   // | 0x7c 124
-
 
124
        { 0x41,0x41,0x36,0x08,0x00 },   // } 0x7d 125
-
 
125
//        { 0x04,0x02,0x04,0x08,0x04 },   // ~ 0x7e 126
-
 
126
            { 0x08,0x0c,0x08,0x18,0x08 },
-
 
127
 
-
 
128
 
-
 
129
 
-
 
130
};
29
}
131
 
-
 
132
#define extDegrees 0
-
 
133
 
30
 
134
static const unsigned char font_ext[] [5] =
-
 
135
{
-
 
136
 
31
 
137
[extDegrees] =    { 0x00,0x06,0x09,0x06,0x00 }, // a ° sign
-
 
138
 
32
 
-
 
33
uint8_t cursor_x;
139
};
34
uint8_t cursor_y;
140
 
35
 
141
 
36
 
142
 
37
 
143
 
38
 
144
void font_gotoxy(uint8_t x,uint8_t y)
39
void font_gotoxy(uint8_t x,uint8_t y)
145
{
40
{
146
        cursor_x=x;
41
        cursor_x=x;
147
        cursor_y=y;
42
        cursor_y=y;
148
}
43
}
149
 
44
 
150
void font_putchar(uint8_t c)
-
 
151
{
-
 
152
        uint8_t * ptr = &display_buffer[0] + cursor_x*6 + cursor_y * WIDTH;
-
 
153
        int i;
-
 
154
        if('\r'==c)
-
 
155
        {
-
 
156
                cursor_x = 0;
-
 
157
                cursor_y++;
-
 
158
                if(cursor_y >= HEIGHT/8)
-
 
159
                {
-
 
160
                        cursor_y = 0;
-
 
161
                }
-
 
162
                return;
-
 
163
        }
-
 
164
 
45
 
165
 
46
 
166
        for(i=0;i<5;i++)
-
 
167
        {
-
 
168
                if(c>' ' && c<0x80)
-
 
169
                {
-
 
170
                  *ptr++ = font[c-' '][i];
-
 
171
                }
-
 
172
                else if(c=='°')
-
 
173
                {
-
 
174
                   *ptr++ = font_ext[extDegrees][i];
-
 
175
                }
-
 
176
                else
-
 
177
                {
-
 
178
                   *ptr++ = 0;
-
 
179
                }
-
 
180
        }
-
 
181
        *ptr++=0;
-
 
182
 
47
 
183
        // move cursor
-
 
184
        cursor_x++;
-
 
185
        if(cursor_x >= WIDTH/6)
48
void font_puts(uint8_t * s)
186
        {
49
{
187
          cursor_x=0;
-
 
188
          cursor_y++;
-
 
189
          if(cursor_y==HEIGHT/8)
50
    print_scaled_string(s,cursor_x,cursor_y,strlen(s),384);
190
          {
-
 
191
                  cursor_y = 0;
-
 
192
          }
-
 
193
        }
-
 
194
 
-
 
195
}
-
 
196
 
51
 
197
 
52
 
198
 
53
 
199
void font_puts(uint8_t * s)
-
 
200
{
-
 
201
        while(s && *s)
-
 
202
        {
-
 
203
                font_putchar(*(s++));
-
 
204
        }
-
 
205
}
54
}
206
 
55
 
207
 
56
 
208
uint8_t get_digits(uint16_t x, uint16_t y)
-
 
209
{
-
 
210
        return ((ascii_lucida_bits[(y*ascii_lucida_width)/8+(x/8)])>>(x&7)) & 1 ;
-
 
211
}
-
 
212
 
57
 
213
 
58
 
214
static uint8_t format_num(char * buff, uint8_t digits,uint8_t dp_pos,int val)
59
static uint8_t format_num(char * buff, uint8_t digits,uint8_t dp_pos,int val)
215
{
60
{
216
  digits++;
61
  digits++;
Line 302... Line 147...
302
  font_gotoxy(x,y);
147
  font_gotoxy(x,y);
303
  font_digits(digits,dp_pos,val);
148
  font_digits(digits,dp_pos,val);
304
}
149
}
305
 
150
 
306
 
151
 
307
#define FONTX 10
-
 
308
#define FONTY 18
-
 
309
 
-
 
310
 
152
 
311
void scan_xbm(void)
153
void scan_xbm(void)
312
{
154
{
313
 
155
 
314
        int i,j;
156
        int i,j;
315
 
157
 
316
        for(i=0; i< FONTY;i++)
158
        for(i=0; i< FONTY;i++)
317
        {
159
        {
318
                for(j=0;j<FONTX*6;j++)
160
                for(j=0;j<FONTX*6;j++)
319
                {
161
                {
320
                         drawPixel(j, i, get_digits(j,i)) ;
162
                         drawPixel(j, i, get_font_pixel(j,i,'A')) ;
321
                }
163
                }
322
        }
164
        }
323
}
165
}
324
 
166
 
-
 
167
 
-
 
168
// scale is multiplied by 256
325
void print_large_string(char * string, int x, int y, int digits)
169
void print_scaled_string(char * string, int x, int y, int digits,int scale )
326
{
170
{
327
 int xt,yt,j;
171
 int xt,yt,jt;
-
 
172
 cursor_y = y;
328
 for(yt=0;yt<FONTY;yt++) // iterate down scan lines
173
 for(yt=0;yt<FONTY*256;yt+=scale) // iterate down scan lines
329
    {
174
    {
-
 
175
            // iterate along the string
-
 
176
                // local x plotting coordinate
-
 
177
            cursor_x = x;
330
        for(xt=0;xt<digits;xt++)
178
            for(xt=0;xt<digits;xt++)
331
        {
179
        {
332
                for(j=0;j<FONTX;j++)
180
                for(jt=0;jt<FONTX*256;jt+=scale)
333
                {
181
                {
334
                        unsigned char c = (string[xt] & 0x7F);
182
                        unsigned char c = (string[xt] & 0x7F);
335
                        if(c<32)
183
                        drawPixel(cursor_x, cursor_y, get_font_pixel(jt/256,yt/256,c)) ;
336
                                c= 32;
184
                    cursor_x++;
337
 
-
 
338
                        drawPixel(x+j+xt*FONTX, y+yt, get_digits(j+(c-32)*FONTX,yt)) ;
-
 
339
                }
185
                }
340
        }
186
        }
-
 
187
        cursor_y++;
341
        }
188
        }
-
 
189
    if(cursor_x > width())
-
 
190
    {
-
 
191
        cursor_x = 0;
342
 
192
    }
343
}
193
}
344
 
194
 
-
 
195
 
-
 
196
 
-
 
197
 
-
 
198
 
-
 
199
 
345
void print_digits(uint8_t x, uint8_t y, uint8_t digits,uint8_t dp_pos,  int val)
200
void print_digits(uint8_t x, uint8_t y, uint8_t digits,uint8_t dp_pos,  int val)
346
{
201
{
347
 
202
 
348
 
203
 
349
        char buff[10] = "        ";
204
        char buff[10] = "        ";
350
        uint8_t len = format_num(buff, digits,dp_pos,val);
205
        uint8_t len = format_num(buff, digits,dp_pos,val);
351
    print_large_string(buff,x,y,len);
206
    print_scaled_string(buff,x,y,len,256);
352
}
207
}
353
 
208
 
354
 
209
 
355
 
210
 
356
 
211
 
Line 366... Line 221...
366
 
221
 
367
    for(yt=0;yt<FONTY;yt++) // iterate down scan lines
222
    for(yt=0;yt<FONTY;yt++) // iterate down scan lines
368
    {
223
    {
369
                for(xt=0;xt<FONTX;xt++)
224
                for(xt=0;xt<FONTX;xt++)
370
                {
225
                {
371
                        if(get_digits(xt+(val+16)*FONTX,yt))
226
                        if(get_font_pixel(xt,yt,val+'0'))
372
                        {
227
                        {
373
                           int cx = xt-FONTX/2;
228
                           int cx = xt-FONTX/2;
374
                           int cy = yt-FONTY/2;
229
                           int cy = yt-FONTY/2;
375
 
230
 
376
                           int px = AP_SCALE(cx*co - cy*si);
231
                           int px = AP_SCALE(cx*co - cy*si);