Untested attempt to get rid of SIGIO pain
[gnokii.git] / include / gsm-api.h
1 /*
2
3   G N O K I I
4
5   A Linux/Unix toolset and driver for Nokia mobile phones.
6
7   Released under the terms of the GNU GPL, see file COPYING for more details.
8         
9   Header file for the various functions, definitions etc. used to implement
10   the handset interface.  See gsm-api.c for more details.
11
12 */
13
14 #ifndef __gsm_api_h
15 #define __gsm_api_h
16  
17 #include "misc.h"
18 #include "gsm-common.h"
19 #include "data/rlp-common.h"
20 #include "devices/device.h"
21 #include "gsm-phonebook.h"
22 #include "gsm-networks.h"
23 #include "gsm-bitmaps.h"
24 #include "gsm-datetime.h"
25 #include "gsm-calendar.h"
26 #include "gsm-sms.h"
27 #include "gsm-ringtones.h"
28 #include "gsm-wap.h"
29
30 #ifndef UCLINUX
31
32 /* Undefined functions in fbus/mbus files */
33 extern GSM_Error Unimplemented(void);
34 #define UNIMPLEMENTED (void *) Unimplemented
35 extern GSM_Error NotSupported(void);
36 #define NOTSUPPORTED (void *) NotSupported
37
38 #endif /* UCLINUX */
39
40 /* Define the structure used to hold pointers to the various API functions.
41    This is in effect the master list of functions provided by the gnokii API.
42    Modules containing the model specific code each contain one of these
43    structures which is "filled in" with the corresponding function within the
44    model specific code.  If a function is not supported or not implemented, a
45    generic not implemented function is used to return a GE_NOTIMPLEMENTED
46    error code. */
47
48 typedef struct {
49
50   /* FIXME: comment this. */
51
52   GSM_Error (*Initialise)( char *port_device, char *initlength,
53                            GSM_ConnectionType connection,
54                            void (*rlp_callback)(RLP_F96Frame *frame));
55
56   void      (*DispatchMessage) (u16 MessageLength, u8 *MessageBuffer, u8 MessageType); 
57
58   void      (*Terminate)(void); 
59
60   void      (*KeepAlive)(void);
61   
62   GSM_Error (*GetMemoryLocation)( GSM_PhonebookEntry *entry );
63
64   GSM_Error (*WritePhonebookLocation)( GSM_PhonebookEntry *entry );
65
66   GSM_Error (*GetSpeedDial)( GSM_SpeedDial *entry);
67
68   GSM_Error (*SetSpeedDial)( GSM_SpeedDial *entry);
69
70   GSM_Error (*GetMemoryStatus)( GSM_MemoryStatus *Status);
71
72   GSM_Error (*GetSMSStatus)( GSM_SMSStatus *Status);
73
74   GSM_Error (*GetSMSCenter)( GSM_MessageCenter *MessageCenter );
75
76   GSM_Error (*SetSMSCenter)( GSM_MessageCenter *MessageCenter );
77
78   GSM_Error (*GetSMSMessage)( GSM_SMSMessage *Message );
79
80   GSM_Error (*DeleteSMSMessage)( GSM_SMSMessage *Message );
81
82   GSM_Error (*SendSMSMessage)( GSM_SMSMessage *Message);
83
84   GSM_Error (*SaveSMSMessage)( GSM_SMSMessage *Message);
85
86     /* If units is set to a valid GSM_RFUnits value, the code
87        will return level in these units if it is able.  Otherwise
88        value will be returned as GRF_Arbitary.  If phone doesn't
89        support GetRFLevel, function returns GE_NOTSUPPORTED */
90   GSM_Error (*GetRFLevel)( GSM_RFUnits *units, float *level );
91
92     /* Works the same as GetRFLevel, except returns battery
93        level if known. */
94   GSM_Error (*GetBatteryLevel)( GSM_BatteryUnits *units, float *level );
95
96   GSM_Error (*GetPowerSource)( GSM_PowerSource *source);
97
98   GSM_Error (*GetDisplayStatus)( int *Status);
99
100   GSM_Error (*EnterSecurityCode)( GSM_SecurityCode Code);
101
102   GSM_Error (*GetSecurityCodeStatus)( int *Status );
103
104   GSM_Error (*GetSecurityCode)( GSM_SecurityCode *Code);
105   
106   GSM_Error (*GetIMEI)( char *imei );
107
108   GSM_Error (*GetRevision)( char *revision );
109
110   GSM_Error (*GetModel)( char *model );
111
112   GSM_Error (*GetDateTime)( GSM_DateTime *date_time);
113
114   GSM_Error (*SetDateTime)( GSM_DateTime *date_time);
115
116   GSM_Error (*GetAlarm)( int alarm_number, GSM_DateTime *date_time );
117
118   GSM_Error (*SetAlarm)( int alarm_number, GSM_DateTime *date_time );
119
120   GSM_Error (*DialVoice)( char *Number);
121
122   GSM_Error (*DialData)( char *Number, char type, void (* callpassup)(char c));
123
124   GSM_Error (*GetIncomingCallNr)( char *Number );
125
126   GSM_Error (*GetNetworkInfo) ( GSM_NetworkInfo *NetworkInfo );
127
128   GSM_Error (*GetCalendarNote) ( GSM_CalendarNote *CalendarNote);
129
130   GSM_Error (*WriteCalendarNote) ( GSM_CalendarNote *CalendarNote);
131
132   GSM_Error (*DeleteCalendarNote) ( GSM_CalendarNote *CalendarNote);
133
134   GSM_Error (*NetMonitor) ( unsigned char mode, char *Screen );
135
136   GSM_Error (*SendDTMF) ( char *String );
137
138   GSM_Error (*GetBitmap) ( GSM_Bitmap *Bitmap );
139   
140   GSM_Error (*SetBitmap) ( GSM_Bitmap *Bitmap );
141
142   GSM_Error (*SetRingtone) ( GSM_Ringtone *ringtone , int *maxlength);
143
144   GSM_Error (*SetBinRingtone) ( GSM_BinRingtone *ringtone);
145   
146   GSM_Error (*GetBinRingtone) ( GSM_BinRingtone *ringtone);
147   
148   GSM_Error (*Reset) ( unsigned char type );
149
150   GSM_Error (*GetProfile) ( GSM_Profile *Profile );
151
152   GSM_Error (*SetProfile) ( GSM_Profile *Profile );
153   
154   bool      (*SendRLPFrame) ( RLP_F96Frame *frame, bool out_dtx );
155
156   GSM_Error (*CancelCall) ();
157      
158   GSM_Error (*PressKey) (int key, int event);
159   
160   GSM_Error (*EnableDisplayOutput) ();
161   
162   GSM_Error (*DisableDisplayOutput) ();
163  
164   GSM_Error (*EnableCellBroadcast) ();
165
166   GSM_Error (*DisableCellBroadcast) ();
167
168   GSM_Error (*ReadCellBroadcast) ( GSM_CBMessage *Message );
169
170   GSM_Error (*PlayTone) (int Herz, u8 Volume);
171
172   GSM_Error (*GetProductProfileSetting) ( GSM_PPS *PPS);
173
174   GSM_Error (*SetProductProfileSetting) ( GSM_PPS *PPS);
175
176   GSM_Error (*GetOperatorName) ( GSM_Network *operator);  
177
178   GSM_Error (*SetOperatorName) ( GSM_Network *operator);    
179
180   GSM_Error (*GetVoiceMailbox) ( GSM_PhonebookEntry *entry);  
181
182   GSM_Error (*PhoneTests) ();    
183
184   GSM_Error (*SimlockInfo) ( GSM_AllSimlocks *siml);    
185
186   GSM_Error (*GetCalendarNotesInfo) (GSM_NotesInfo *NotesInfo);
187
188   GSM_Error (*GetSMSFolders) ( GSM_SMSFolders *folders);      
189
190   GSM_Error (*ResetPhoneSettings) ();      
191
192   GSM_Error (*GetWAPBookmark) ( GSM_WAPBookmark *bookmark);      
193
194   GSM_Error (*SetWAPBookmark) ( GSM_WAPBookmark *bookmark);      
195
196   GSM_Error (*GetWAPSettings) ( GSM_WAPSettings *settings);      
197
198   GSM_Error (*CallDivert) ( GSM_CallDivert *cd );      
199
200   GSM_Error (*AnswerCall) (char s);
201
202   GSM_Error (*GetManufacturer)( char *manufacturer );
203
204 } GSM_Functions;
205
206 typedef struct {
207
208   /* FIXME: comment this. */
209
210   GSM_Error (*Initialise)( char *port_device, char *initlength,
211                            GSM_ConnectionType connection,
212                            void (*rlp_callback)(RLP_F96Frame *frame));
213
214   int (*SendMessage) (u16 message_length, u8 message_type, u8 *buffer);
215
216   int (*SendFrame)   (u16 message_length, u8 message_type, u8 *buffer); 
217
218   int (*WritePhone)  (u16 length, u8 *buffer); 
219
220   void (*Terminate)(void);      
221
222   void (*StateMachine)(unsigned char rx_byte);
223
224 } GSM_Protocol;
225
226 /* This structure is provided to allow common information about the particular
227    model to be looked up in a model independant way. Some of the values here
228    define minimum and maximum levels for values retrieved by the various Get
229    functions for example battery level. They are not defined as constants to
230    allow model specific code to set them during initialisation */
231
232 typedef struct {
233                 
234   char *FBUSModels; /* Models covered by this type, pipe '|' delimited. */
235   
236   char *MBUSModels; /* Models covered by this type, pipe '|' delimited. */
237
238   char *InfraredModels; /* Models covered by this type, pipe '|' delimited. */
239   
240   char *DLR3Models; /* Models covered by this type, pipe '|' delimited. */
241
242   char *ATModels; /* Models covered by this type, pipe '|' delimited. */
243
244   char *IrdaModels; /* Models covered by this type, pipe '|' delimited. */
245
246   char *TekramModels; /* Models covered by this type, pipe '|' delimited. */  
247   
248 /* Minimum and maximum levels for RF signal strength. Units are as per the
249    setting of RFLevelUnits.  The setting of RFLevelUnits indicates the 
250    default or "native" units used.  In the case of the 3110 and 6110 series
251    these are arbitrary, ranging from 0 to 4. */
252
253   float MaxRFLevel;
254   float MinRFLevel;
255   GSM_RFUnits RFLevelUnits;
256
257 /* Minimum and maximum levels for battery level. Again, units are as per the
258    setting of GSM_BatteryLevelUnits.  The value that BatteryLevelUnits is set
259    to indicates the "native" or default value that the phone supports.  In the
260    case of the 3110 and 6110 series these are arbitrary, ranging from 0 to 4. */
261
262   float MaxBatteryLevel;
263   float MinBatteryLevel;
264   GSM_BatteryUnits BatteryLevelUnits;
265
266 /* Information about date, time and alarm support. In case of alarm
267    information we provide value for the number of alarms supported. */
268
269   GSM_DateTimeSupport DateTimeSupport;
270   GSM_DateTimeSupport AlarmSupport;
271   int MaximumAlarms;
272 } GSM_Information;
273
274 void NULL_Terminate(void);
275 void NULL_KeepAlive();
276 bool NULL_WritePhone (u16 length, u8 *buffer);
277 void NULL_TX_DisplayMessage(u16 MessageLength, u8 *MessageBuffer);
278
279 GSM_Error NULL_WaitUntil (int time, GSM_Error *value);
280 GSM_Error NULL_SendMessageSequence (int time, GSM_Error *value,
281                u16 message_length, u8 message_type, u8 *buffer);
282
283 GSM_ConnectionType GetConnectionTypeFromString(char *Connection);
284
285 bool GetMemoryTypeString(char *memorytext, GSM_MemoryType *type);
286 bool GetMemoryTypeID(char *memorytext, GSM_MemoryType *type);
287
288 /* Define these as externs so that app code can pick them up. */
289
290 extern bool *GSM_LinkOK;
291 extern GSM_Information *GSM_Info;
292 extern GSM_Functions *GSM;
293 extern GSM_Protocol *Protocol;
294
295 extern GSM_PhonebookEntry *CurrentPhonebookEntry;
296 extern GSM_Error          CurrentPhonebookError;
297
298 extern GSM_SpeedDial      *CurrentSpeedDialEntry;
299 extern GSM_Error          CurrentSpeedDialError;
300
301 extern unsigned char      Current_IMEI[GSM_MAX_IMEI_LENGTH];
302 extern unsigned char      Current_Revision[GSM_MAX_REVISION_LENGTH];
303 extern unsigned char      Current_Model[GSM_MAX_MODEL_LENGTH];
304
305 #ifndef UCLINUX
306 extern GSM_SMSMessage     *CurrentSMSMessage;
307 extern GSM_Error          CurrentSMSMessageError;
308 extern int                CurrentSMSPointer;
309
310 extern GSM_SMSFolders      *CurrentSMSFolders;
311 extern GSM_Error          CurrentSMSFoldersError;
312 extern int                CurrentSMSFoldersCount;
313
314 extern GSM_OneSMSFolder   CurrentSMSFolder;
315 extern GSM_Error          CurrentSMSFolderError;
316 extern int                CurrentSMSFolderID;
317 #endif /* UCLINUX */
318
319 extern GSM_MemoryStatus   *CurrentMemoryStatus;
320 extern GSM_Error          CurrentMemoryStatusError;
321
322 #ifndef UCLINUX
323 extern GSM_NetworkInfo    *CurrentNetworkInfo;
324 extern GSM_Error          CurrentNetworkInfoError;
325
326 extern GSM_SMSStatus      *CurrentSMSStatus;
327 extern GSM_Error          CurrentSMSStatusError;
328
329 extern GSM_MessageCenter  *CurrentMessageCenter;
330 extern GSM_Error          CurrentMessageCenterError;
331
332 extern int                *CurrentSecurityCodeStatus;
333 extern GSM_Error          CurrentSecurityCodeError;
334 extern GSM_SecurityCode   *CurrentSecurityCode;
335
336 extern GSM_DateTime       *CurrentDateTime;
337 extern GSM_Error          CurrentDateTimeError;
338
339 extern GSM_Error          CurrentResetPhoneSettingsError;
340
341 extern GSM_DateTime       *CurrentAlarm;
342 extern GSM_Error          CurrentAlarmError;
343
344 extern GSM_CalendarNote   *CurrentCalendarNote;
345 extern GSM_Error          CurrentCalendarNoteError;
346
347 extern GSM_NotesInfo      CurrentCalendarNotesInfo,*CurrentCalendarNotesInfo2;
348 extern GSM_Error          CurrentCalendarNotesInfoError;
349
350 extern GSM_Error          CurrentSetDateTimeError;
351 extern GSM_Error          CurrentSetAlarmError;
352
353 extern int                *CurrentFirstCalendarFreePos;
354 extern GSM_Error          CurrentFirstCalendarFreePosError;
355 #endif /* UCLINUX */
356
357 extern GSM_Error          CurrentEnableExtendedCommandsError;
358
359 extern int                CurrentRFLevel,
360                    CurrentBatteryLevel,
361                    CurrentPowerSource;
362
363 #ifndef UCLINUX
364 extern int                CurrentDisplayStatus;
365 extern GSM_Error          CurrentDisplayStatusError;
366
367 extern char               *CurrentNetmonitor;
368 extern GSM_Error          CurrentNetmonitorError;
369
370 extern GSM_Bitmap         *CurrentGetBitmap;
371 extern GSM_Error          CurrentGetBitmapError;
372
373 extern GSM_Error          CurrentSetBitmapError;
374
375 extern GSM_Error          CurrentSendDTMFError;
376
377 extern GSM_Profile        *CurrentProfile;
378 extern GSM_Error          CurrentProfileError;
379
380 extern GSM_Error          CurrentDisplayOutputError;
381
382 extern GSM_CBMessage      *CurrentCBMessage;
383 extern GSM_Error          CurrentCBError;
384
385 extern int                CurrentPressKeyEvent;
386 extern GSM_Error          CurrentPressKeyError;
387
388 extern GSM_Error          CurrentPlayToneError;
389 #endif /* UCLINUX */
390
391 extern GSM_Error          CurrentDialVoiceError;
392
393 #ifndef UCLINUX
394 extern GSM_Error          CurrentGetOperatorNameError;
395 extern GSM_Network        *CurrentGetOperatorNameNetwork;
396 extern GSM_Error          CurrentSetOperatorNameError;
397 #endif /* UCLINUX */
398
399 extern GSM_Error          CurrentGetIMEIError;
400
401 extern GSM_Error          CurrentGetHWError;
402
403 #ifndef UCLINUX
404 extern unsigned char      CurrentPPS[4];
405 extern GSM_Error          CurrentProductProfileSettingsError;
406
407 extern char               CurrentIncomingCall[20];
408
409 extern GSM_Error          CurrentBinRingtoneError;
410 extern GSM_BinRingtone    *CurrentGetBinRingtone;
411
412 extern GSM_Error          CurrentRingtoneError; 
413 #endif /* UCLINUX */
414
415 extern GSM_Error          CurrentMagicError;
416
417 #ifndef UCLINUX
418 extern GSM_Error          CurrentSimlockInfoError;
419 extern GSM_AllSimlocks    *CurrentSimLock;
420
421 extern GSM_Error          CurrentGetWAPBookmarkError;
422 extern GSM_Error          CurrentSetWAPBookmarkError;
423 extern GSM_WAPBookmark    *WAPBookmark;
424
425 extern GSM_Error          CurrentGetWAPSettingsError;
426 extern GSM_WAPSettings    *WAPSettings;
427
428 extern GSM_Error          CurrentCallDivertError;
429 extern GSM_CallDivert    *CurrentCallDivert;
430
431 extern char              *CurrentManufacturer;
432 #endif /* UCLINUX */
433
434 /* This is the connection type used in gnokii. */
435 extern GSM_ConnectionType CurrentConnectionType;
436
437 /* Pointer to a callback function used to return changes to a calls status */
438 /* This saves unreliable polling */
439 extern void (*CurrentCallPassup)(char c);
440
441 /* Pointer to callback function in user code to be called when RLP frames
442    are received. */
443 extern void (*CurrentRLP_RXCallback)(RLP_F96Frame *frame);
444
445 /* Used to disconnect the call */
446 extern u8 CurrentCallSequenceNumber;
447
448 extern bool CurrentLinkOK;
449
450 extern bool CurrentRequestTerminate;
451
452 #ifndef UCLINUX
453 extern bool CurrentDisableKeepAlive;
454 #endif /* UCLINUX */
455
456 /* Prototype for the functions actually provided by gsm-api.c. */
457
458 extern GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_ConnectionType connection, void (*rlp_callback)(RLP_F96Frame *frame), char* SynchronizeTime);
459
460 #ifndef UCLINUX
461 extern bool CheckModel (GSM_Information InfoToCheck, char *model, GSM_ConnectionType connection);
462 #endif /* UCLINUX */
463
464 extern char *GetMygnokiiVersion();
465
466 typedef enum {
467   F_CAL61=0,/*Calendar in 6110 style - 4 types,...*/
468   F_CAL33,  /*Calendar in 3310 style - 10 reminders, Unicode, 3 coding types*/
469   F_CAL71,  /*Calendar in 7110 style - 4 types, recurrance, etc.*/
470
471   F_PBK33,  /*Phonebook in Unicode. 3310 style - name and entry*/
472   F_PBK71,  /*Extended phonebook - multiple numbers,Unicode.Like in 7110*/
473
474   F_DATA61, /*We can make data calls using gnokiid. Like in 6110*/
475   F_DATA71, /*Datacalls using AT commands*/
476
477   F_SMS,    /*SMS with Inbox, Outbox*/
478   F_SMS71,  /*SMS with SMS folders like in 7110*/
479
480   F_AUTH,   /*We can make authentication and have "Accessory connected" like in 6110*/
481   F_NETMON, /*Netmonitor available*/ /*10*/
482   F_CALER61,/*Caller groups in 6110 style - 5 groups with members*/
483   F_KEYB,   /*We can press keys*/
484   F_SMSCDEF,/*SMSC can have default recipient*/
485   F_SPEED,  /*We can handle speed dials*/
486   F_SCRSAV, /*We have screen savers*/
487   F_DTMF,   /*We can handle DTMF sequences*/
488   F_NOPOWER,/*We must get power/battery info from netmonitor*/
489
490   F_STANIM, /*Startup logo animated or static*/
491   F_STA   , /*Startup logo static*/
492   F_STA62 , /*Startup logo static size 6210*/ /*20*/
493   F_STA71 , /*Startup logo static size 7110*/
494
495   F_PROF61, /*Profiles numbered like in N6110*/
496   F_PROF51, /*Profiles numbered like in N5110*/
497   F_PROF33, /*Profiles numbered like in N3310.Unicode names*/
498
499   F_RING_SM,/*Binary ringtone in Smart Messaging*/
500   F_RINGBIN,/*Binary ringtone in binary format*/
501
502   F_WAP     /*WAP functions available*/
503 } feat_index;
504
505 typedef enum {
506   FN_CALENDAR=0,
507   FN_NETMONITOR,
508   FN_CALLERGROUPS,
509   FN_PHONEBOOK,
510   FN_AUTHENTICATION,
511   FN_DATACALLS,
512   FN_KEYPRESS,
513   FN_SMSCDEFAULT,
514   FN_SPEEDDIAL,
515   FN_SCREENSAVER,
516   FN_DTMF, /*10*/
517   FN_SMS,
518   FN_NOPOWERFRAME,
519   FN_STARTUP,
520   FN_PROFILES,
521   FN_RINGTONES,
522   FN_WAP
523 } featnum_index;
524
525 /* For models table */
526 typedef struct {
527   char *model;
528   char *number;
529   feat_index features[17];  
530 } OnePhoneModel;
531
532 extern char *GetModelName ();
533 extern int GetModelFeature (featnum_index num);
534
535 #ifndef UCLINUX
536 extern bool AppendLog(u8 *buffer, int length,bool format);
537 extern bool AppendLogText(u8 *buffer,bool format);
538 #else /* UCLINUX */
539 #define AppendLog(buffer,length,format)
540 #define AppendLogText(buffer,format)
541 #endif /* UCLINUX */
542
543 typedef struct {
544   int                SIMPhonebookUsed;
545   int                SIMPhonebookSize;
546   GSM_PhonebookEntry SIMPhonebook[250];
547
548   int                PhonePhonebookUsed;
549   int                PhonePhonebookSize;
550   GSM_PhonebookEntry PhonePhonebook[500];
551
552   bool               CallerAvailable;
553   GSM_Bitmap         CallerGroups[5];
554
555   bool               SpeedAvailable;
556   GSM_SpeedDial      SpeedDials[8];
557
558   bool               OperatorLogoAvailable;
559   GSM_Bitmap         OperatorLogo;
560
561   bool               StartupLogoAvailable;
562   GSM_Bitmap         StartupLogo;
563
564   GSM_Bitmap         StartupText;
565 } GSM_Backup;
566
567 #endif  /* __gsm_api_h */