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