summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/device/odevice_simpad.cpp36
1 files changed, 17 insertions, 19 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
@@ -122,233 +122,231 @@ static struct s_button simpad_buttons [] = {
122 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Lower+Upper"), 122 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Lower+Upper"),
123 "devicebuttons/simpad_upper_lower", 123 "devicebuttons/simpad_upper_lower",
124 "QPE/Launcher", "home()", 124 "QPE/Launcher", "home()",
125 "buttonsettings", "raise()" }, 125 "buttonsettings", "raise()" },
126 */ 126 */
127}; 127};
128} 128}
129 129
130 130
131void SIMpad::init(const QString&) 131void SIMpad::init(const QString&)
132{ 132{
133 d->m_vendorstr = "SIEMENS"; 133 d->m_vendorstr = "SIEMENS";
134 d->m_vendor = Vendor_SIEMENS; 134 d->m_vendor = Vendor_SIEMENS;
135 135
136 136
137 //TODO Implement model checking 137 //TODO Implement model checking
138 //FIXME For now we assume an SL4 138 //FIXME For now we assume an SL4
139 139
140 d->m_modelstr = "SL4"; 140 d->m_modelstr = "SL4";
141 d->m_model = Model_SIMpad_SL4; 141 d->m_model = Model_SIMpad_SL4;
142 142
143 switch ( d->m_model ) { 143 switch ( d->m_model ) {
144 default: 144 default:
145 d->m_rotation = Rot0; 145 d->m_rotation = Rot0;
146 d->m_direction = CCW; 146 d->m_direction = CCW;
147 d->m_holdtime = 1000; // 1000ms 147 d->m_holdtime = 1000; // 1000ms
148 148
149 break; 149 break;
150 } 150 }
151 151
152 //Distribution detecting code is now in base class 152 //Distribution detecting code is now in base class
153 m_leds [0] = m_leds [1] = Led_Off; 153 m_leds [0] = m_leds [1] = Led_Off;
154 154
155 m_power_timer = 0; 155 m_power_timer = 0;
156 156
157} 157}
158 158
159void SIMpad::initButtons() 159void SIMpad::initButtons()
160{ 160{
161 if ( d->m_buttons ) 161 if ( d->m_buttons )
162 return; 162 return;
163 163
164 d->m_buttons = new QValueList <ODeviceButton>; 164 d->m_buttons = new QValueList <ODeviceButton>;
165 165
166 uint size = sizeof(simpad_buttons)/sizeof(s_button); 166 uint size = sizeof(simpad_buttons)/sizeof(s_button);
167 for ( uint i = 0; i < size; i++ ) { 167 for ( uint i = 0; i < size; i++ ) {
168 s_button *sb = simpad_buttons + i; 168 s_button *sb = simpad_buttons + i;
169 ODeviceButton b; 169 ODeviceButton b;
170 170
171 if (( sb->model & d->m_model ) == d->m_model ) { 171 if (( sb->model & d->m_model ) == d->m_model ) {
172 b. setKeycode ( sb->code ); 172 b. setKeycode ( sb->code );
173 b. setUserText ( QObject::tr ( "Button", sb->utext )); 173 b. setUserText ( QObject::tr ( "Button", sb->utext ));
174 b. setPixmap ( Resource::loadPixmap ( sb->pix )); 174 b. setPixmap ( Resource::loadPixmap ( sb->pix ));
175 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( sb->fpressedservice ), sb->fpressedaction )); 175 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( sb->fpressedservice ), sb->fpressedaction ));
176 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( sb->fheldservice ), sb->fheldaction )); 176 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( sb->fheldservice ), sb->fheldaction ));
177 177
178 d->m_buttons->append ( b ); 178 d->m_buttons->append ( b );
179 } 179 }
180 } 180 }
181 reloadButtonMapping(); 181 reloadButtonMapping();
182} 182}
183 183
184// SIMpad boardcontrol register CS3 184// SIMpad boardcontrol register CS3
185#define SIMPAD_BOARDCONTROL "/proc/cs3" 185#define SIMPAD_BOARDCONTROL "/proc/cs3"
186#define SIMPAD_VCC_5V_EN 0x0001 // For 5V PCMCIA 186#define SIMPAD_VCC_5V_EN 0x0001 // For 5V PCMCIA
187#define SIMPAD_VCC_3V_EN 0x0002 // FOR 3.3V PCMCIA 187#define SIMPAD_VCC_3V_EN 0x0002 // FOR 3.3V PCMCIA
188#define SIMPAD_EN1 0x0004 // This is only for EPROM's 188#define SIMPAD_EN1 0x0004 // This is only for EPROM's
189#define SIMPAD_EN0 0x0008 // Both should be enable for 3.3V or 5V 189#define SIMPAD_EN0 0x0008 // Both should be enable for 3.3V or 5V
190#define SIMPAD_DISPLAY_ON 0x0010 190#define SIMPAD_DISPLAY_ON 0x0010
191#define SIMPAD_PCMCIA_BUFF_DIS 0x0020 191#define SIMPAD_PCMCIA_BUFF_DIS 0x0020
192#define SIMPAD_MQ_RESET 0x0040 192#define SIMPAD_MQ_RESET 0x0040
193#define SIMPAD_PCMCIA_RESET 0x0080 193#define SIMPAD_PCMCIA_RESET 0x0080
194#define SIMPAD_DECT_POWER_ON 0x0100 194#define SIMPAD_DECT_POWER_ON 0x0100
195#define SIMPAD_IRDA_SD 0x0200 // Shutdown for powersave 195#define SIMPAD_IRDA_SD 0x0200 // Shutdown for powersave
196#define SIMPAD_RS232_ON 0x0400 196#define SIMPAD_RS232_ON 0x0400
197#define SIMPAD_SD_MEDIAQ 0x0800 // Shutdown for powersave 197#define SIMPAD_SD_MEDIAQ 0x0800 // Shutdown for powersave
198#define SIMPAD_LED2_ON 0x1000 198#define SIMPAD_LED2_ON 0x1000
199#define SIMPAD_IRDA_MODE 0x2000 // Fast/Slow IrDA mode 199#define SIMPAD_IRDA_MODE 0x2000 // Fast/Slow IrDA mode
200#define SIMPAD_ENABLE_5V 0x4000 // Enable 5V circuit 200#define SIMPAD_ENABLE_5V 0x4000 // Enable 5V circuit
201#define SIMPAD_RESET_SIMCARD 0x8000 201#define SIMPAD_RESET_SIMCARD 0x8000
202 202
203//SIMpad touchscreen backlight strength control 203//SIMpad touchscreen backlight strength control
204#define SIMPAD_BACKLIGHT_CONTROL "/proc/driver/mq200/backlight" 204#define SIMPAD_BACKLIGHT_CONTROL "/proc/driver/mq200/backlight"
205 205
206 206
207/* 207/*
208 * The SIMpad exposes ChipSelect3 to userspace 208 * The SIMpad exposes ChipSelect3 to userspace
209 * via a proc filesystem file. Using this register 209 * via a proc filesystem file. Using this register
210 * one can toggle power of serial, irda, dect circuits 210 * one can toggle power of serial, irda, dect circuits
211 * change the video driver and display status and 211 * change the video driver and display status and
212 * many more things. 212 * many more things.
213 * To not lose the current setting we read the current 213 * To not lose the current setting we read the current
214 * cs3 setting and toggle the necessary bits and then 214 * cs3 setting and toggle the necessary bits and then
215 * write it. 215 * write it.
216 */ 216 */
217static bool setCS3Bit( bool bitset, int bit ) { 217static bool setCS3Bit( bool bitset, int bit ) {
218 int cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_RDONLY ); 218 QFile file( SIMPAD_BOARDCONTROL );
219 219 if ( !file.open( IO_ReadOnly ) )
220 if ( cs3_fd < 0 )
221 return false; 220 return false;
222 221
223 static char line[32]; 222 unsigned int val = 0;
224 int val = 0; 223 bool ok = false;
225 bool ok = false; 224 QTextStream stream( &file );
226 225
227 /* 226 /*
228 * try to read and parse the Chipselect3 status 227 * Use QFile and QTextStream for parsing to be more
229 * be paranoid and make sure line[31] is null 228 * robust
230 * terminated
231 */ 229 */
232 while( !ok && ::read(cs3_fd, &line, sizeof(line)) > 0 ) { 230 while ( !stream.atEnd() ) {
233 line[31] = '\0'; 231 QString line = stream.readLine();
234 if (::sscanf(line, "Chipselect3 : %x", &val )) 232 if ( line.startsWith( "Chipselect3 : " ) ) {
233 val = line.mid( 15 ).toUInt( 0, 16 );
235 ok = true; 234 ok = true;
235 break;
236 }
236 } 237 }
237 238
238 ::close(cs3_fd);
239
240 /*
241 * we were not able to find the current value
242 * and as a result we won't set it
243 */
244 if ( !ok ) 239 if ( !ok )
245 return false; 240 return false;
246 241
242 file.close();
243
247 /* 244 /*
248 * change the value 245 * change the value
249 */ 246 */
250 val = bitset ? (val | bit) : (val & ~bit); 247 val = bitset ? (val | bit) : (val & ~bit);
251 248
252 /* 249 /*
253 * write it back 250 * write it back
254 */ 251 */
255 cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_WRONLY ); 252 int cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_WRONLY );
256 if ( cs3_fd < 0 ) 253 if ( cs3_fd < 0 )
257 return false; 254 return false;
258 255
256 char line[32];
259 ::snprintf(line, sizeof(line), "0x%04x\n", val); 257 ::snprintf(line, sizeof(line), "0x%04x\n", val);
260 ::write(cs3_fd, line, strlen(line)); 258 ::write(cs3_fd, line, strlen(line));
261 ::close(cs3_fd); 259 ::close(cs3_fd);
262 260
263 return true; 261 return true;
264} 262}
265 263
266 264
267QValueList <OLed> SIMpad::ledList() const 265QValueList <OLed> SIMpad::ledList() const
268{ 266{
269 QValueList <OLed> vl; 267 QValueList <OLed> vl;
270 vl << Led_Power; //FIXME which LED is LED2 ? The green one or the amber one? 268 vl << Led_Power; //FIXME which LED is LED2 ? The green one or the amber one?
271 //vl << Led_Mail; //TODO find out if LED1 is accessible anyway 269 //vl << Led_Mail; //TODO find out if LED1 is accessible anyway
272 return vl; 270 return vl;
273} 271}
274 272
275QValueList <OLedState> SIMpad::ledStateList ( OLed l ) const 273QValueList <OLedState> SIMpad::ledStateList ( OLed l ) const
276{ 274{
277 QValueList <OLedState> vl; 275 QValueList <OLedState> vl;
278 276
279 if ( l == Led_Power ) //FIXME which LED is LED2 ? The green one or the amber one? 277 if ( l == Led_Power ) //FIXME which LED is LED2 ? The green one or the amber one?
280 vl << Led_Off << Led_On; 278 vl << Led_Off << Led_On;
281 //else if ( l == Led_Mail ) //TODO find out if LED1 is accessible anyway 279 //else if ( l == Led_Mail ) //TODO find out if LED1 is accessible anyway
282 //vl << Led_Off; 280 //vl << Led_Off;
283 return vl; 281 return vl;
284} 282}
285 283
286OLedState SIMpad::ledState ( OLed l ) const 284OLedState SIMpad::ledState ( OLed l ) const
287{ 285{
288 switch ( l ) { 286 switch ( l ) {
289 case Led_Power: 287 case Led_Power:
290 return m_leds [0]; 288 return m_leds [0];
291 //case Led_Mail: 289 //case Led_Mail:
292 // return m_leds [1]; 290 // return m_leds [1];
293 default: 291 default:
294 return Led_Off; 292 return Led_Off;
295 } 293 }
296} 294}
297 295
298bool SIMpad::setLedState ( OLed l, OLedState st ) 296bool SIMpad::setLedState ( OLed l, OLedState st )
299{ 297{
300 if ( l == Led_Power ) { 298 if ( l == Led_Power ) {
301 m_leds [0] = st; 299 m_leds [0] = st;
302 setCS3Bit(st == Led_On, SIMPAD_LED2_ON); 300 setCS3Bit(st == Led_On, SIMPAD_LED2_ON);
303 return true; 301 return true;
304 } 302 }
305 303
306 return false; 304 return false;
307} 305}
308 306
309void SIMpad::timerEvent ( QTimerEvent * ) 307void SIMpad::timerEvent ( QTimerEvent * )
310{ 308{
311 killTimer ( m_power_timer ); 309 killTimer ( m_power_timer );
312 m_power_timer = 0; 310 m_power_timer = 0;
313 QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, true, false ); 311 QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, true, false );
314 QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, false, false ); 312 QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, false, false );
315} 313}
316 314
317 315
318void SIMpad::playAlarmSound() 316void SIMpad::playAlarmSound()
319{ 317{
320#ifndef QT_NO_SOUND 318#ifndef QT_NO_SOUND
321 static Sound snd ( "alarm" ); 319 static Sound snd ( "alarm" );
322 if(!snd.isFinished()) 320 if(!snd.isFinished())
323 return; 321 return;
324 322
325 /* save as the Sound is static! */ 323 /* save as the Sound is static! */
326 changeMixerForAlarm( 0, "/dev/sound/mixer" , &snd); 324 changeMixerForAlarm( 0, "/dev/sound/mixer" , &snd);
327 snd. play(); 325 snd. play();
328#endif 326#endif
329} 327}
330 328
331 329
332bool SIMpad::suspend() // Must override because SIMpad does NOT have apm 330bool SIMpad::suspend() // Must override because SIMpad does NOT have apm
333{ 331{
334 if ( !isQWS( ) ) // only qwsserver is allowed to suspend 332 if ( !isQWS( ) ) // only qwsserver is allowed to suspend
335 return false; 333 return false;
336 334
337 bool res = ODevice::suspend(); 335 bool res = ODevice::suspend();
338 336
339 /* 337 /*
340 * restore the screen content if we really 338 * restore the screen content if we really
341 * supended the device 339 * supended the device
342 */ 340 */
343 if ( res ) 341 if ( res )
344 updateAllWidgets(); 342 updateAllWidgets();
345 343
346 return res; 344 return res;
347} 345}
348 346
349bool SIMpad::setDisplayStatus ( bool on ) 347bool SIMpad::setDisplayStatus ( bool on )
350{ 348{
351 qDebug( "ODevice for SIMpad: setDisplayStatus(%s)", on? "on" : "off" ); 349 qDebug( "ODevice for SIMpad: setDisplayStatus(%s)", on? "on" : "off" );
352 350
353 return setCS3Bit(on, SIMPAD_DISPLAY_ON); 351 return setCS3Bit(on, SIMPAD_DISPLAY_ON);
354} 352}