graphlcd-base/glcddrivers/common.c
changeset 4 df6a40031aa5
equal deleted inserted replaced
3:d0e62fc47285 4:df6a40031aa5
       
     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, &param);
       
    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, &param);
       
   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