Merge branch 'master' of github.com:dopefishh/des2015
[des2015.git] / mart / xenomai / ex11 / ex11.c
1 #include <stdio.h>
2 #include <signal.h>
3 #include <unistd.h>
4 #include <sys/mman.h>
5 #include <sys/io.h>
6
7 #include <native/task.h>
8 #include <native/timer.h>
9 #include <native/intr.h>
10
11 #include <rtdk.h>
12
13 #define LPT1IRQ 7
14 #define TICKS 5
15 #define BANNERWIDTH 10000
16 #define MSGMAX 1000
17 #define MAXX 20
18
19 RT_TASK intrtask, drawtask;
20 RTIME ticks[TICKS+1];
21 RTIME tocks[TICKS+1];
22
23 unsigned char data[BANNERWIDTH];
24 char message[MSGMAX];
25 char inputmsg[MSGMAX];
26 unsigned int pointer = 0;
27 unsigned int msglen;
28
29 void add_tick(RTIME *t, RTIME tnew)
30 {
31 unsigned int i = 0;
32 t[TICKS] = 0;
33 for(i=TICKS-1; i>0; i--){
34 t[i] = t[i-1];
35 t[TICKS] += t[i];
36 }
37 t[0] = tnew;
38 t[TICKS] = (t[TICKS]+t[0])/TICKS;
39 }
40
41 void taskd(void *arg)
42 {
43 RTIME time = *(RTIME *)arg;
44 RTIME step = time/(2*MAXX+2);
45 unsigned int i;
46
47 outb(0x00, 0x378);
48 rt_task_sleep(step*2);
49 for(i=0; i<MAXX; i++){
50 outb(data[i+pointer], 0x378);
51 rt_task_sleep(step);
52 outb(0x00, 0x378);
53 }
54 rt_task_sleep(step);
55 outb(0x00, 0x378);
56
57 pointer = pointer > msglen ? 0 : pointer+1;
58 }
59
60 void taski(void *arg)
61 {
62 //Register as interrupt handler
63 RT_INTR intr;
64 rt_intr_create(&intr, NULL, LPT1IRQ, 0);
65
66 //Initialize and declare the timer variables
67 RTIME tick = rt_timer_read();
68 RTIME tock;
69 RTIME period;
70 while(1){
71 tock = rt_timer_read();
72 add_tick(ticks, tock-tick);
73
74 // Tocks waiting period
75 if(tocks[TICKS] < ticks[TICKS]){
76 // sleep until the arm is most left
77 rt_task_sleep(tocks[TICKS]/2);
78 rt_task_create(&drawtask, NULL, 0, 50, 0);
79 period = ticks[TICKS]+tocks[TICKS];
80 rt_task_start(&drawtask, &taskd, &period);
81 }
82 rt_intr_wait(&intr, TM_INFINITE);
83
84 //Tick waiting period
85 tick = rt_timer_read();
86 add_tick(tocks, tick-tock);
87
88 if(ticks[TICKS] < tocks[TICKS]){
89 // sleep until the arm is most left
90 rt_task_sleep(ticks[TICKS]/2);
91 rt_task_create(&drawtask, NULL, 0, 50, 0);
92 period = ticks[TICKS]+tocks[TICKS];
93 rt_task_start(&drawtask, &taskd, &period);
94 }
95 rt_intr_wait(&intr, TM_INFINITE);
96 }
97 }
98
99 void make_message(char *msg)
100 {
101 unsigned int i;
102 for(i=0; i<BANNERWIDTH; i++){
103 data[i] = 0;
104 }
105 i = 20;
106 unsigned char s = 0;
107 while(i<BANNERWIDTH && s < strlen(msg)){
108 char c = msg[s];
109 // Yes, we hardcoded all letters, digits and some symbols...
110 switch(c){
111 case 'A':
112 case 'a':
113 data[i++] = 0x1e; data[i++] = 0x5; data[i++] = 0x1e; break;
114 case 'B':
115 case 'b':
116 data[i++] = 0x1f; data[i++] = 0x15; data[i++] = 0xe; break;
117 case 'C':
118 case 'c':
119 data[i++] = 0xe; data[i++] = 0x11; break;
120 case 'D':
121 case 'd':
122 data[i++] = 0x1f; data[i++] = 0x11; data[i++] = 0xe; break;
123 case 'E':
124 case 'e':
125 data[i++] = 0x1f; data[i++] = 0x15; break;
126 case 'F':
127 case 'f':
128 data[i++] = 0x1f; data[i++] = 0x05; break;
129 case 'G':
130 case 'g':
131 data[i++] = 0xe; data[i++] = 0x11, data[i++] = 0x1d; break;
132 case 'H':
133 case 'h':
134 data[i++] = 0x1f; data[i++] = 0x4, data[i++] = 0x1f; break;
135 case 'I':
136 case 'i':
137 data[i++] = 0x1f; break;
138 case 'J':
139 case 'j':
140 data[i++] = 0x10; data[i++] = 0x1f; break;
141 case 'K':
142 case 'k':
143 data[i++] = 0x1f; data[i++] = 0x04; data[i++] = 0x1b; break;
144 case 'L':
145 case 'l':
146 data[i++] = 0x1f; data[i++] = 0x10; break;
147 case 'M':
148 case 'm':
149 data[i++] = 0x1f; data[i++] = 0x2; data[i++] = 0x7; data[i++] = 0x2; data[i++] = 0x1f; break;
150 case 'N':
151 case 'n':
152 data[i++] = 0x1f; data[i++] = 0x2; data[i++] = 0x4; data[i++] = 0x1f; break;
153 case 'O':
154 case 'o':
155 data[i++] = 0xe; data[i++] = 0x11; data[i++] = 0xe; break;
156 case 'P':
157 case 'p':
158 data[i++] = 0x1f; data[i++] = 0x5; data[i++] = 0x2; break;
159 case 'Q':
160 case 'q':
161 data[i++] = 0xe; data[i++] = 0x11; data[i++] = 0x19; data[i++] = 0x1e; break;
162 case 'R':
163 case 'r':
164 data[i++] = 0x1f; data[i++] = 0x5; data[i++] = 0x1a; break;
165 case 'S':
166 case 's':
167 data[i++] = 0x12; data[i++] = 0x15; data[i++] = 0xd; break;
168 case 'T':
169 case 't':
170 data[i++] = 0x1; data[i++] = 0x1f; data[i++] = 0x1; break;
171 case 'U':
172 case 'u':
173 data[i++] = 0x1f; data[i++] = 0x10; data[i++] = 0x1f; break;
174 case 'V':
175 case 'v':
176 data[i++] = 0xf; data[i++] = 0x10; data[i++] = 0xf; break;
177 case 'W':
178 case 'w':
179 data[i++] = 0xf; data[i++] = 0x10; data[i++] = 0xc; data[i++] = 0x10; data[i++] = 0xf; break;
180 case 'X':
181 case 'x':
182 data[i++] = 0x11; data[i++] = 0xe; data[i++] = 0x11; break;
183 case 'Y':
184 case 'y':
185 data[i++] = 0x17; data[i++] = 0x14; data[i++] = 0xf; break;
186 case 'Z':
187 case 'z':
188 data[i++] = 0x19; data[i++] = 0x15; data[i++] = 0x13; break;
189 case '0':
190 data[i++] = 0xe; data[i++] = 0x11; data[i++] = 0xe; break;
191 case '1':
192 data[i++] = 0x12; data[i++] = 0x1f; data[i++] = 0x10; break;
193 case '2':
194 data[i++] = 0x12; data[i++] = 0x19; data[i++] = 0x16; break;
195 case '3':
196 data[i++] = 0x15; data[i++] = 0xa; break;
197 case '4':
198 data[i++] = 0x7; data[i++] = 0x4; data[i++] = 0x1f; break;
199 case '5':
200 data[i++] = 0x17; data[i++] = 0x15; data[i++] = 0x9; break;
201 case '6':
202 data[i++] = 0xe; data[i++] = 0x15; data[i++] = 0x9; break;
203 case '7':
204 data[i++] = 0x1; data[i++] = 0x1f; break;
205 case '8':
206 data[i++] = 0x1f; data[i++] = 0x15; data[i++] = 0x1f; break;
207 case '9':
208 data[i++] = 0x12; data[i++] = 0x15; data[i++] = 0x1e; break;
209 case '.':
210 data[i++] = 0x10; break;
211 case ',':
212 data[i++] = 0x10; data[i++] = 0x8; break;
213 case '\'':
214 case '"':
215 data[i++] = 0x1; break;
216 case ':':
217 data[i++] = 0xa; break;
218 case '(':
219 data[i++] = 0xe; data[i++] = 0x11; break;
220 case ')':
221 data[i++] = 0x11; data[i++] = 0xe; break;
222 case '-':
223 data[i++] = 0x4; data[i++] = 0x4; break;
224 case ' ':
225 i++;
226 break;
227 case '!':
228 data[i++] = 0x17; break;
229 default:
230 break;
231 }
232 i++;
233 s++;
234 }
235 msglen = i;
236 pointer = 0;
237 }
238
239 int main(int argc, char* argv[])
240 {
241 rt_print_auto_init(1);
242 mlockall(MCL_CURRENT | MCL_FUTURE);
243
244 unsigned int i;
245 for(i=0; i<BANNERWIDTH; i++){
246 data[i] = 0;
247 }
248
249 ioperm(0x37A, 1, 1);
250 ioperm(0x378, 1, 1);
251 outb(inb(0x37A) | 0x10, 0x37A);
252
253 make_message("abcdefghijklmnopqrstuvwxyz1234567890,.\"()");
254
255 rt_task_create(&intrtask, NULL, 0, 50, 0);
256 rt_task_start(&intrtask, &taski, 0);
257
258 printf("CRTL+C to exit\n");
259 printf("legal chars: abcdefghijklmnopqrstuvwxyz1234567890,.\"()\n");
260 while(1){
261 printf("Type your message(max %d chars): ", MSGMAX);
262 scanf("%[^\n]", inputmsg);
263 getchar();
264 make_message(inputmsg);
265 sleep(0.1);
266 }
267 }