10cb4b0d5176c644aebca98a66e7ff0c0e4b9ca9
[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 #ifndef UCLINUX
299 extern GSM_SpeedDial      *CurrentSpeedDialEntry;
300 extern GSM_Error          CurrentSpeedDialError;
301 #endif /* UCLINUX */
302
303 extern unsigned char      Current_IMEI[GSM_MAX_IMEI_LENGTH];
304 extern unsigned char      Current_Revision[GSM_MAX_REVISION_LENGTH];
305 extern unsigned char      Current_Model[GSM_MAX_MODEL_LENGTH];
306
307 #ifndef UCLINUX
308 extern GSM_SMSMessage     *CurrentSMSMessage;
309 extern GSM_Error          CurrentSMSMessageError;
310 extern int                CurrentSMSPointer;
311
312 extern GSM_SMSFolders      *CurrentSMSFolders;
313 extern GSM_Error          CurrentSMSFoldersError;
314 extern int                CurrentSMSFoldersCount;
315
316 extern GSM_OneSMSFolder   CurrentSMSFolder;
317 extern GSM_Error          CurrentSMSFolderError;
318 extern int                CurrentSMSFolderID;
319 #endif /* UCLINUX */
320
321 extern GSM_MemoryStatus   *CurrentMemoryStatus;
322 extern GSM_Error          CurrentMemoryStatusError;
323
324 #ifndef UCLINUX
325 extern GSM_NetworkInfo    *CurrentNetworkInfo;
326 extern GSM_Error          CurrentNetworkInfoError;
327
328 extern GSM_SMSStatus      *CurrentSMSStatus;
329 extern GSM_Error          CurrentSMSStatusError;
330
331 extern GSM_MessageCenter  *CurrentMessageCenter;
332 extern GSM_Error          CurrentMessageCenterError;
333
334 extern int                *CurrentSecurityCodeStatus;
335 extern GSM_Error          CurrentSecurityCodeError;
336 extern GSM_SecurityCode   *CurrentSecurityCode;
337
338 extern GSM_DateTime       *CurrentDateTime;
339 extern GSM_Error          CurrentDateTimeError;
340
341 extern GSM_Error          CurrentResetPhoneSettingsError;
342
343 extern GSM_DateTime       *CurrentAlarm;
344 extern GSM_Error          CurrentAlarmError;
345
346 extern GSM_CalendarNote   *CurrentCalendarNote;
347 extern GSM_Error          CurrentCalendarNoteError;
348
349 extern GSM_NotesInfo      CurrentCalendarNotesInfo,*CurrentCalendarNotesInfo2;
350 extern GSM_Error          CurrentCalendarNotesInfoError;
351
352 extern GSM_Error          CurrentSetDateTimeError;
353 extern GSM_Error          CurrentSetAlarmError;
354
355 extern int                *CurrentFirstCalendarFreePos;
356 extern GSM_Error          CurrentFirstCalendarFreePosError;
357 #endif /* UCLINUX */
358
359 extern GSM_Error          CurrentEnableExtendedCommandsError;
360
361 extern int                CurrentRFLevel,
362                    CurrentBatteryLevel,
363                    CurrentPowerSource;
364
365 #ifndef UCLINUX
366 extern int                CurrentDisplayStatus;
367 extern GSM_Error          CurrentDisplayStatusError;
368
369 extern char               *CurrentNetmonitor;
370 extern GSM_Error          CurrentNetmonitorError;
371
372 extern GSM_Bitmap         *CurrentGetBitmap;
373 extern GSM_Error          CurrentGetBitmapError;
374
375 extern GSM_Error          CurrentSetBitmapError;
376
377 extern GSM_Error          CurrentSendDTMFError;
378
379 extern GSM_Profile        *CurrentProfile;
380 extern GSM_Error          CurrentProfileError;
381
382 extern GSM_Error          CurrentDisplayOutputError;
383
384 extern GSM_CBMessage      *CurrentCBMessage;
385 extern GSM_Error          CurrentCBError;
386
387 extern int                CurrentPressKeyEvent;
388 extern GSM_Error          CurrentPressKeyError;
389
390 extern GSM_Error          CurrentPlayToneError;
391 #endif /* UCLINUX */
392
393 extern GSM_Error          CurrentDialVoiceError;
394
395 #ifndef UCLINUX
396 extern GSM_Error          CurrentGetOperatorNameError;
397 extern GSM_Network        *CurrentGetOperatorNameNetwork;
398 extern GSM_Error          CurrentSetOperatorNameError;
399 #endif /* UCLINUX */
400
401 extern GSM_Error          CurrentGetIMEIError;
402
403 extern GSM_Error          CurrentGetHWError;
404
405 #ifndef UCLINUX
406 extern unsigned char      CurrentPPS[4];
407 extern GSM_Error          CurrentProductProfileSettingsError;
408
409 extern char               CurrentIncomingCall[20];
410
411 extern GSM_Error          CurrentBinRingtoneError;
412 extern GSM_BinRingtone    *CurrentGetBinRingtone;
413
414 extern GSM_Error          CurrentRingtoneError; 
415 #endif /* UCLINUX */
416
417 extern GSM_Error          CurrentMagicError;
418
419 #ifndef UCLINUX
420 extern GSM_Error          CurrentSimlockInfoError;
421 extern GSM_AllSimlocks    *CurrentSimLock;
422
423 extern GSM_Error          CurrentGetWAPBookmarkError;
424 extern GSM_Error          CurrentSetWAPBookmarkError;
425 extern GSM_WAPBookmark    *WAPBookmark;
426
427 extern GSM_Error          CurrentGetWAPSettingsError;
428 extern GSM_WAPSettings    *WAPSettings;
429
430 extern GSM_Error          CurrentCallDivertError;
431 extern GSM_CallDivert    *CurrentCallDivert;
432
433 extern char              *CurrentManufacturer;
434 #endif /* UCLINUX */
435
436 /* This is the connection type used in gnokii. */
437 extern GSM_ConnectionType CurrentConnectionType;
438
439 /* Pointer to a callback function used to return changes to a calls status */
440 /* This saves unreliable polling */
441 extern void (*CurrentCallPassup)(char c);
442
443 /* Pointer to callback function in user code to be called when RLP frames
444    are received. */
445 extern void (*CurrentRLP_RXCallback)(RLP_F96Frame *frame);
446
447 /* Used to disconnect the call */
448 extern u8 CurrentCallSequenceNumber;
449
450 extern bool CurrentLinkOK;
451
452 extern bool CurrentRequestTerminate;
453
454 #ifndef UCLINUX
455 extern bool CurrentDisableKeepAlive;
456 #endif /* UCLINUX */
457
458 /* Prototype for the functions actually provided by gsm-api.c. */
459
460 extern GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_ConnectionType connection, void (*rlp_callback)(RLP_F96Frame *frame), char* SynchronizeTime);
461
462 #ifndef UCLINUX
463 extern bool CheckModel (GSM_Information InfoToCheck, char *model, GSM_ConnectionType connection);
464 #endif /* UCLINUX */
465
466 extern char *GetMygnokiiVersion();
467
468 typedef enum {
469   F_CAL61=0,/*Calendar in 6110 style - 4 types,...*/
470   F_CAL33,  /*Calendar in 3310 style - 10 reminders, Unicode, 3 coding types*/
471   F_CAL71,  /*Calendar in 7110 style - 4 types, recurrance, etc.*/
472
473   F_PBK33,  /*Phonebook in Unicode. 3310 style - name and entry*/
474   F_PBK71,  /*Extended phonebook - multiple numbers,Unicode.Like in 7110*/
475
476   F_DATA61, /*We can make data calls using gnokiid. Like in 6110*/
477   F_DATA71, /*Datacalls using AT commands*/
478
479   F_SMS,    /*SMS with Inbox, Outbox*/
480   F_SMS71,  /*SMS with SMS folders like in 7110*/
481
482   F_AUTH,   /*We can make authentication and have "Accessory connected" like in 6110*/
483   F_NETMON, /*Netmonitor available*/ /*10*/
484   F_CALER61,/*Caller groups in 6110 style - 5 groups with members*/
485   F_KEYB,   /*We can press keys*/
486   F_SMSCDEF,/*SMSC can have default recipient*/
487   F_SPEED,  /*We can handle speed dials*/
488   F_SCRSAV, /*We have screen savers*/
489   F_DTMF,   /*We can handle DTMF sequences*/
490   F_NOPOWER,/*We must get power/battery info from netmonitor*/
491
492   F_STANIM, /*Startup logo animated or static*/
493   F_STA   , /*Startup logo static*/
494   F_STA62 , /*Startup logo static size 6210*/ /*20*/
495   F_STA71 , /*Startup logo static size 7110*/
496
497   F_PROF61, /*Profiles numbered like in N6110*/
498   F_PROF51, /*Profiles numbered like in N5110*/
499   F_PROF33, /*Profiles numbered like in N3310.Unicode names*/
500
501   F_RING_SM,/*Binary ringtone in Smart Messaging*/
502   F_RINGBIN,/*Binary ringtone in binary format*/
503
504   F_WAP     /*WAP functions available*/
505 } feat_index;
506
507 typedef enum {
508   FN_CALENDAR=0,
509   FN_NETMONITOR,
510   FN_CALLERGROUPS,
511   FN_PHONEBOOK,
512   FN_AUTHENTICATION,
513   FN_DATACALLS,
514   FN_KEYPRESS,
515   FN_SMSCDEFAULT,
516   FN_SPEEDDIAL,
517   FN_SCREENSAVER,
518   FN_DTMF, /*10*/
519   FN_SMS,
520   FN_NOPOWERFRAME,
521   FN_STARTUP,
522   FN_PROFILES,
523   FN_RINGTONES,
524   FN_WAP
525 } featnum_index;
526
527 /* For models table */
528 typedef struct {
529   char *model;
530   char *number;
531   feat_index features[17];  
532 } OnePhoneModel;
533
534 extern char *GetModelName ();
535 extern int GetModelFeature (featnum_index num);
536
537 #ifndef UCLINUX
538 extern bool AppendLog(u8 *buffer, int length,bool format);
539 extern bool AppendLogText(u8 *buffer,bool format);
540 #else /* UCLINUX */
541 #define AppendLog(buffer,length,format)
542 #define AppendLogText(buffer,format)
543 #endif /* UCLINUX */
544
545 typedef struct {
546   int                SIMPhonebookUsed;
547   int                SIMPhonebookSize;
548   GSM_PhonebookEntry SIMPhonebook[250];
549
550   int                PhonePhonebookUsed;
551   int                PhonePhonebookSize;
552   GSM_PhonebookEntry PhonePhonebook[500];
553
554   bool               CallerAvailable;
555   GSM_Bitmap         CallerGroups[5];
556
557   bool               SpeedAvailable;
558   GSM_SpeedDial      SpeedDials[8];
559
560   bool               OperatorLogoAvailable;
561   GSM_Bitmap         OperatorLogo;
562
563   bool               StartupLogoAvailable;
564   GSM_Bitmap         StartupLogo;
565
566   GSM_Bitmap         StartupText;
567 } GSM_Backup;
568
569 #endif  /* __gsm_api_h */