|
1 /* |
|
2 * GraphLCD driver library |
|
3 * |
|
4 * common.c - various functions |
|
5 * |
|
6 * parts were taken from graphlcd plugin for the Video Disc Recorder |
|
7 * (c) 2001-2004 Carsten Siebholz <c.siebholz AT t-online.de> |
|
8 * |
|
9 * This file is released under the GNU General Public License. Refer |
|
10 * to the COPYING file distributed with this package. |
|
11 * |
|
12 * (c) 2004 Andreas Regel <andreas.regel AT powarman.de> |
|
13 */ |
|
14 |
|
15 #include <ctype.h> |
|
16 #include <sched.h> |
|
17 #include <time.h> |
|
18 #include <unistd.h> |
|
19 #include <sys/time.h> |
|
20 #include <sys/resource.h> |
|
21 |
|
22 #include "common.h" |
|
23 #include "config.h" |
|
24 |
|
25 |
|
26 namespace GLCD |
|
27 { |
|
28 |
|
29 static const int BitReverseTable[256] = |
|
30 { |
|
31 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, |
|
32 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, |
|
33 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, |
|
34 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, |
|
35 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, |
|
36 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, |
|
37 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, |
|
38 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, |
|
39 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, |
|
40 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, |
|
41 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, |
|
42 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, |
|
43 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, |
|
44 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, |
|
45 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, |
|
46 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, |
|
47 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, |
|
48 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, |
|
49 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, |
|
50 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, |
|
51 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, |
|
52 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, |
|
53 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, |
|
54 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, |
|
55 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, |
|
56 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, |
|
57 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, |
|
58 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, |
|
59 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, |
|
60 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, |
|
61 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, |
|
62 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff |
|
63 }; |
|
64 |
|
65 int nSleepInit() |
|
66 { |
|
67 int ret = 0; |
|
68 |
|
69 if (Config.waitPriority != 0) |
|
70 { |
|
71 ret = setpriority(PRIO_PROCESS, 0, Config.waitPriority); |
|
72 } |
|
73 |
|
74 if (!ret) |
|
75 { |
|
76 switch (Config.waitMethod) |
|
77 { |
|
78 case kWaitUsleep: // usleep |
|
79 break; |
|
80 case kWaitNanosleep: // nanosleep |
|
81 break; |
|
82 case kWaitNanosleepRR: // nanosleep (sched_rr) |
|
83 // set sched algorithm |
|
84 struct sched_param param; |
|
85 |
|
86 param.sched_priority=1; |
|
87 ret = sched_setscheduler(0, SCHED_RR, ¶m); |
|
88 break; |
|
89 case kWaitGettimeofday: // gettimeofday |
|
90 break; |
|
91 } |
|
92 } |
|
93 return ret; |
|
94 } |
|
95 |
|
96 int nSleepDeInit() |
|
97 { |
|
98 int ret = 0; |
|
99 |
|
100 if (Config.waitPriority != 0) |
|
101 { |
|
102 ret = setpriority(PRIO_PROCESS, 0, 0); |
|
103 } |
|
104 |
|
105 if (!ret) |
|
106 { |
|
107 switch (Config.waitMethod) |
|
108 { |
|
109 case kWaitUsleep: // usleep |
|
110 break; |
|
111 case kWaitNanosleep: // nanosleep |
|
112 break; |
|
113 case kWaitNanosleepRR: // nanosleep (sched_rr) |
|
114 // set sched algorithm |
|
115 struct sched_param param; |
|
116 |
|
117 param.sched_priority=0; |
|
118 ret = sched_setscheduler(0, SCHED_OTHER, ¶m); |
|
119 break; |
|
120 case kWaitGettimeofday: // gettimeofday |
|
121 break; |
|
122 } |
|
123 } |
|
124 return ret; |
|
125 } |
|
126 |
|
127 void nSleep(long ns) |
|
128 { |
|
129 switch (Config.waitMethod) |
|
130 { |
|
131 case kWaitUsleep: // usleep |
|
132 if (ns > 0) |
|
133 { |
|
134 usleep(std::max(1L, ns/1000)); |
|
135 } |
|
136 break; |
|
137 case kWaitNanosleep: // nanosleep |
|
138 case kWaitNanosleepRR: // nanosleep(sched_rr) |
|
139 struct timespec delay, remaining; |
|
140 if (ns > 0) |
|
141 { |
|
142 delay.tv_sec = ns/1000000000; |
|
143 delay.tv_nsec = ns%1000000000; |
|
144 while (nanosleep(&delay, &remaining) == -1) |
|
145 { |
|
146 delay.tv_sec = remaining.tv_sec; |
|
147 delay.tv_nsec = remaining.tv_nsec; |
|
148 } |
|
149 } |
|
150 break; |
|
151 case kWaitGettimeofday: //getTimeofday for Kernel 2.6 |
|
152 long us; |
|
153 struct timeval tv1, tv2; |
|
154 suseconds_t us2; |
|
155 if (ns > 0) |
|
156 { |
|
157 us = ns / 1000; |
|
158 if (us == 0) |
|
159 us = 1; |
|
160 gettimeofday(&tv1, 0); |
|
161 do |
|
162 { |
|
163 gettimeofday(&tv2, 0); |
|
164 us2 = tv2.tv_usec + ((tv2.tv_sec - tv1.tv_sec) * 1000000); |
|
165 } while (us2 - tv1.tv_usec < us); |
|
166 } |
|
167 } |
|
168 } |
|
169 |
|
170 void uSleep(long us) |
|
171 { |
|
172 if (Config.waitMethod == kWaitUsleep) |
|
173 { |
|
174 // usleep |
|
175 if (us > 0) |
|
176 usleep(std::max(1L, us)); |
|
177 } |
|
178 else |
|
179 { |
|
180 nSleep(us * 1000); |
|
181 } |
|
182 } |
|
183 |
|
184 |
|
185 |
|
186 unsigned char ReverseBits(unsigned char value) |
|
187 { |
|
188 return BitReverseTable[value]; |
|
189 } |
|
190 |
|
191 void clip(int & value, int min, int max) |
|
192 { |
|
193 if (value < min) |
|
194 value = min; |
|
195 if (value > max) |
|
196 value = max; |
|
197 } |
|
198 |
|
199 void sort(int & value1, int & value2) |
|
200 { |
|
201 if (value2 < value1) |
|
202 { |
|
203 int tmp; |
|
204 tmp = value2; |
|
205 value2 = value1; |
|
206 value1 = tmp; |
|
207 } |
|
208 } |
|
209 |
|
210 std::string trim(const std::string & s) |
|
211 { |
|
212 std::string::size_type start, end; |
|
213 |
|
214 start = 0; |
|
215 while (start < s.length()) |
|
216 { |
|
217 if (!isspace(s[start])) |
|
218 break; |
|
219 start++; |
|
220 } |
|
221 end = s.length() - 1; |
|
222 while (end >= 0) |
|
223 { |
|
224 if (!isspace(s[end])) |
|
225 break; |
|
226 end--; |
|
227 } |
|
228 return s.substr(start, end - start + 1); |
|
229 } |
|
230 |
|
231 } // end of namespace |