Subversion Repositories chibiosIgnition

Rev

Rev 9 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 mjames 1
/*
2
 * Font.c
3
 
4
 *
5
 *  Created on: 20 Dec 2015
6
 *      Author: Mike
7
 */
8
#include <stdint.h>
9
#include <string.h>
9 mjames 10
#include "Font.h"
3 mjames 11
#include "ap_math.h"
12
#include "SSD1306.h"
13
 
14
 
9 mjames 15
// the Lucida font is on a x10 y18 grid
16
#define FONTX 10
17
#define FONTY 18
3 mjames 18
 
19
#include "ascii-lucida.h"
20
 
9 mjames 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;
3 mjames 26
 
9 mjames 27
        x = x+FONTX*(c-32);
28
        return ((ascii_lucida_bits[(y*ascii_lucida_width)/8+(x/8)])>>(x&7)) & 1 ;
29
}
3 mjames 30
 
31
 
32
 
9 mjames 33
uint8_t cursor_x;
34
uint8_t cursor_y;
3 mjames 35
 
36
 
37
 
38
 
39
void font_gotoxy(uint8_t x,uint8_t y)
40
{
41
        cursor_x=x;
42
        cursor_y=y;
43
}
44
 
45
 
46
 
47
 
16 mjames 48
void font_puts(char * s)
9 mjames 49
{
50
    print_scaled_string(s,cursor_x,cursor_y,strlen(s),384);
3 mjames 51
}
52
 
53
 
54
 
55
 
56
static uint8_t format_num(char * buff, uint8_t digits,uint8_t dp_pos,int val)
57
{
58
  digits++;
59
  uint8_t pos = digits;
60
  uint8_t dp_loc = pos - dp_pos;
61
  uint8_t sign = 0;
62
  if(val<0)
63
  {
64
        sign = 1;
65
        val = -val;
66
  }
67
 
68
  buff[pos]=0;
69
  while (pos)
70
  {
71
        if(pos == dp_loc )
72
        {
73
                buff[--pos]='.';
74
        }
75
        else
76
        {
77
           buff[--pos] = val%10 + '0';
78
           val/=10;
79
           if(val==0 && pos< dp_loc)
80
                 break;
81
        }
82
  }
83
  if(sign)
84
 {
85
        buff[--pos] =  '-';
86
 }
87
 return digits;
88
}
89
 
90
 
91
void font_digits( uint8_t digits,uint8_t dp_pos,  int val)
92
{
93
        char buff[10] = "        ";
94
        uint8_t len = format_num(buff, digits,dp_pos,val);
95
        font_puts(buff);
96
}
97
 
98
 
99
void font_sig_digits(uint8_t x, uint8_t y,uint8_t right_justify,uint8_t dp_pos, int val)
100
{
101
  char digits;
102
  char sign = 0;
103
  int uval;
104
  if (val < 0)
105
  {
106
          uval = -val;
107
          sign = 1; // mark as negative
108
  }
109
  else
110
  {
111
          uval = val;
112
  }
113
  if(uval<10) // always one digit for a sign or space, one for a digit
114
  {
115
          digits = 1;
116
  }
117
  if(uval>=10 && uval <100)
118
  {
119
          digits = 2;
120
  }
121
  if(uval>=100 && uval < 1000)
122
  {
123
         digits =3;
124
  }
125
  if(uval>=1000)
126
  {
127
         digits=4;
128
  }
129
  // backup for the - sign if right justified
130
  if(right_justify)
131
  {
132
         if(dp_pos<10)
133
     {
134
           digits+=2;
135
     }
136
         else
137
         {
138
                 digits+=1;
139
         }
140
     x-=(digits);
141
  }
142
 
143
 
144
  font_gotoxy(x,y);
145
  font_digits(digits,dp_pos,val);
146
}
147
 
148
 
149
 
150
void scan_xbm(void)
151
{
152
 
153
        int i,j;
154
 
155
        for(i=0; i< FONTY;i++)
156
        {
157
                for(j=0;j<FONTX*6;j++)
158
                {
9 mjames 159
                         drawPixel(j, i, get_font_pixel(j,i,'A')) ;
3 mjames 160
                }
161
        }
162
}
163
 
9 mjames 164
 
165
// scale is multiplied by 256
166
void print_scaled_string(char * string, int x, int y, int digits,int scale )
3 mjames 167
{
9 mjames 168
 int xt,yt,jt;
169
 cursor_y = y;
170
 for(yt=0;yt<FONTY*256;yt+=scale) // iterate down scan lines
3 mjames 171
    {
9 mjames 172
            // iterate along the string
173
                // local x plotting coordinate
174
            cursor_x = x;
175
            for(xt=0;xt<digits;xt++)
3 mjames 176
        {
9 mjames 177
                for(jt=0;jt<FONTX*256;jt+=scale)
3 mjames 178
                {
179
                        unsigned char c = (string[xt] & 0x7F);
9 mjames 180
                        drawPixel(cursor_x, cursor_y, get_font_pixel(jt/256,yt/256,c)) ;
181
                    cursor_x++;
3 mjames 182
                }
183
        }
9 mjames 184
        cursor_y++;
3 mjames 185
        }
9 mjames 186
    if(cursor_x > width())
187
    {
188
        cursor_x = 0;
189
    }
3 mjames 190
}
191
 
9 mjames 192
 
193
 
194
 
195
 
196
 
3 mjames 197
void print_digits(uint8_t x, uint8_t y, uint8_t digits,uint8_t dp_pos,  int val)
198
{
199
 
200
 
201
        char buff[10] = "        ";
202
        uint8_t len = format_num(buff, digits,dp_pos,val);
9 mjames 203
    print_scaled_string(buff,x,y,len,256);
3 mjames 204
}
205
 
206
 
207
 
208
 
209
 
210
 
211
/* print a digit value 0 to 9 (not ASCII)  rotated by ang */
212
void print_rotated(uint8_t x, uint8_t y, int ang, uint8_t val)
213
{
214
        int co=ap_cos(ang);
215
        int si=ap_sin(ang);
216
 
217
        int xt,yt;
218
 
219
    for(yt=0;yt<FONTY;yt++) // iterate down scan lines
220
    {
221
                for(xt=0;xt<FONTX;xt++)
222
                {
9 mjames 223
                        if(get_font_pixel(xt,yt,val+'0'))
3 mjames 224
                        {
225
                           int cx = xt-FONTX/2;
226
                           int cy = yt-FONTY/2;
227
 
228
                           int px = AP_SCALE(cx*co - cy*si);
229
                           int py = AP_SCALE(cx*si + cy*co);
230
 
231
                           drawPixel(x+px, y+py,WHITE) ;
232
                        }
233
                }
234
   }
235
 
236
 
237
 
238
 
239
 
240
}
241
 
242
 
243
 
244