author | zecke <zecke> | 2004-11-04 21:53:57 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-11-04 21:53:57 (UTC) |
commit | 37ff6dd391e4b6e0c537cd1d74e226dfdf1b86ba (patch) (side-by-side diff) | |
tree | b261ff83d2f7b77f8663d433b08b005aabd8c184 | |
parent | 5f56ab623c99c12ce246f775e065632fbfbbfc1f (diff) | |
download | opie-37ff6dd391e4b6e0c537cd1d74e226dfdf1b86ba.zip opie-37ff6dd391e4b6e0c537cd1d74e226dfdf1b86ba.tar.gz opie-37ff6dd391e4b6e0c537cd1d74e226dfdf1b86ba.tar.bz2 |
Use QTextStream and QFile instead of read/sscanf for parsing
ChipSelect3 (cs3). This should make it more robust
-rw-r--r-- | libopie2/opiecore/device/odevice_simpad.cpp | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/libopie2/opiecore/device/odevice_simpad.cpp b/libopie2/opiecore/device/odevice_simpad.cpp index 9fde7f9..2e54216 100644 --- a/libopie2/opiecore/device/odevice_simpad.cpp +++ b/libopie2/opiecore/device/odevice_simpad.cpp @@ -194,89 +194,87 @@ void SIMpad::initButtons() #define SIMPAD_DECT_POWER_ON 0x0100 #define SIMPAD_IRDA_SD 0x0200 // Shutdown for powersave #define SIMPAD_RS232_ON 0x0400 #define SIMPAD_SD_MEDIAQ 0x0800 // Shutdown for powersave #define SIMPAD_LED2_ON 0x1000 #define SIMPAD_IRDA_MODE 0x2000 // Fast/Slow IrDA mode #define SIMPAD_ENABLE_5V 0x4000 // Enable 5V circuit #define SIMPAD_RESET_SIMCARD 0x8000 //SIMpad touchscreen backlight strength control #define SIMPAD_BACKLIGHT_CONTROL "/proc/driver/mq200/backlight" /* * The SIMpad exposes ChipSelect3 to userspace * via a proc filesystem file. Using this register * one can toggle power of serial, irda, dect circuits * change the video driver and display status and * many more things. * To not lose the current setting we read the current * cs3 setting and toggle the necessary bits and then * write it. */ static bool setCS3Bit( bool bitset, int bit ) { - int cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_RDONLY ); - - if ( cs3_fd < 0 ) + QFile file( SIMPAD_BOARDCONTROL ); + if ( !file.open( IO_ReadOnly ) ) return false; - static char line[32]; - int val = 0; + unsigned int val = 0; bool ok = false; + QTextStream stream( &file ); /* - * try to read and parse the Chipselect3 status - * be paranoid and make sure line[31] is null - * terminated + * Use QFile and QTextStream for parsing to be more + * robust */ - while( !ok && ::read(cs3_fd, &line, sizeof(line)) > 0 ) { - line[31] = '\0'; - if (::sscanf(line, "Chipselect3 : %x", &val )) + while ( !stream.atEnd() ) { + QString line = stream.readLine(); + if ( line.startsWith( "Chipselect3 : " ) ) { + val = line.mid( 15 ).toUInt( 0, 16 ); ok = true; + break; + } } - ::close(cs3_fd); - - /* - * we were not able to find the current value - * and as a result we won't set it - */ if ( !ok ) return false; + file.close(); + /* * change the value */ val = bitset ? (val | bit) : (val & ~bit); /* * write it back */ - cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_WRONLY ); + int cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_WRONLY ); if ( cs3_fd < 0 ) return false; + char line[32]; ::snprintf(line, sizeof(line), "0x%04x\n", val); ::write(cs3_fd, line, strlen(line)); ::close(cs3_fd); return true; } QValueList <OLed> SIMpad::ledList() const { QValueList <OLed> vl; vl << Led_Power; //FIXME which LED is LED2 ? The green one or the amber one? //vl << Led_Mail; //TODO find out if LED1 is accessible anyway return vl; } QValueList <OLedState> SIMpad::ledStateList ( OLed l ) const { QValueList <OLedState> vl; if ( l == Led_Power ) //FIXME which LED is LED2 ? The green one or the amber one? vl << Led_Off << Led_On; //else if ( l == Led_Mail ) //TODO find out if LED1 is accessible anyway //vl << Led_Off; |