summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common/phone/nokia/dct3/n9210.c
Side-by-side diff
Diffstat (limited to 'gammu/emb/common/phone/nokia/dct3/n9210.c') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/phone/nokia/dct3/n9210.c396
1 files changed, 396 insertions, 0 deletions
diff --git a/gammu/emb/common/phone/nokia/dct3/n9210.c b/gammu/emb/common/phone/nokia/dct3/n9210.c
new file mode 100644
index 0000000..e82d530
--- a/dev/null
+++ b/gammu/emb/common/phone/nokia/dct3/n9210.c
@@ -0,0 +1,396 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#include "../../../gsmstate.h"
+
+#ifdef GSM_ENABLE_NOKIA9210
+
+#include <string.h>
+#include <time.h>
+
+#include "../../../misc/coding/coding.h"
+#include "../../../gsmcomon.h"
+#include "../../../service/gsmlogo.h"
+#include "../../pfunc.h"
+#include "../nfunc.h"
+#include "n9210.h"
+#include "dct3func.h"
+
+static GSM_Error N9210_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char OpReq[] = {N6110_FRAME_HEADER, 0x70};
+
+ s->Phone.Data.Bitmap=Bitmap;
+ switch (Bitmap->Type) {
+ case GSM_OperatorLogo:
+ smprintf(s, "Getting operator logo\n");
+ /* This is like DCT3_GetNetworkInfo */
+ return GSM_WaitFor (s, OpReq, 4, 0x0a, 4, ID_GetBitmap);
+ case GSM_StartupLogo:
+ smprintf(s, "Getting startup logo\n");
+ return N71_92_GetPhoneSetting(s, ID_GetBitmap, 0x15);
+ case GSM_WelcomeNote_Text:
+ smprintf(s, "Getting welcome note\n");
+ return N71_92_GetPhoneSetting(s, ID_GetBitmap, 0x02);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N9210_ReplySetOpLogo(GSM_Protocol_Message msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Operator logo clear/set\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N9210_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error error;
+ GSM_Phone_Bitmap_Types Type;
+ int Width, Height, i,count=3;
+ unsigned char req[600] = { N7110_FRAME_HEADER };
+ unsigned char reqStartup[1000] = {
+ N6110_FRAME_HEADER, 0xec,
+ 0x15, /* Startup Logo setting */
+ 0x04, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0x02, 0xc0, 0x54, 0x00, 0x03, 0xc0,
+ 0xf8, 0xf8, 0x01, 0x04};
+ unsigned char reqStartupText[500] = {
+ N7110_FRAME_HEADER, 0xec,
+ 0x02}; /* Startup Text setting */
+ unsigned char reqClrOp[] = {
+ N7110_FRAME_HEADER, 0xAF,
+ 0x02}; /* Number of logo = 0 - 0x04 */
+
+ switch (Bitmap->Type) {
+ case GSM_StartupLogo:
+ if (Bitmap->Location!=1) return ERR_NOTSUPPORTED;
+ Type=GSM_NokiaStartupLogo;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ PHONE_EncodeBitmap(Type, reqStartup + 21, Bitmap);
+ smprintf(s, "Setting startup logo\n");
+ return GSM_WaitFor (s, reqStartup, 21+PHONE_GetBitmapSize(Type,0,0), 0x7A, 4, ID_SetBitmap);
+ case GSM_WelcomeNote_Text:
+ /* Nokia bug: Unicode text is moved one char to left */
+ CopyUnicodeString(reqStartupText + 4, Bitmap->Text);
+ reqStartupText[4] = 0x02;
+ i = 5 + UnicodeLength(Bitmap->Text) * 2;
+ reqStartupText[i++] = 0;
+ reqStartupText[i++] = 0;
+ return GSM_WaitFor (s, reqStartupText, i, 0x7A, 4, ID_SetBitmap);
+ case GSM_OperatorLogo:
+ /* First part for clearing logo */
+ if (!strcmp(Bitmap->NetworkCode,"000 00")) {
+ for (i=0;i<5;i++) {
+ reqClrOp[4] = i;
+ error=GSM_WaitFor (s, reqClrOp, 5, 0x0A, 4, ID_SetBitmap);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ Type=GSM_NokiaOperatorLogo;
+ req[count++] = 0xA3;
+ req[count++] = 0x01;
+ req[count++] = 0x00; /* Logo removed */
+ NOKIA_EncodeNetworkCode(req+count, "000 00");
+ count = count + 3;
+ req[count++] = 0x00;
+ req[count++] = 0x04;
+ req[count++] = 0x08; /* Length of rest + 2 */
+ memcpy(req+count, "\x00\x00\x00\x00\x00\x00", 6);
+ count += 6;
+ error=GSM_WaitFor (s, req, count, 0x0A, 4, ID_SetBitmap);
+ if (error != ERR_NONE) return error;
+ /* We wanted only clear - now exit */
+ if (!strcmp(Bitmap->NetworkCode,"000 00")) return error;
+
+ /* Now setting logo */
+ count=3;
+ req[count++] = 0xA3;
+ req[count++] = 0x01;
+ req[count++] = 0x01; /* Logo set */
+ NOKIA_EncodeNetworkCode(req+count, Bitmap->NetworkCode);
+ count = count + 3;
+ req[count++] = 0x00;
+ req[count++] = 0x04;
+ req[count++] = PHONE_GetBitmapSize(Type,0,0)+8;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ req[count++] = Width;
+ req[count++] = Height;
+ req[count++] = PHONE_GetBitmapSize(Type,0,0);
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ PHONE_EncodeBitmap(Type, req+count, Bitmap);
+ return GSM_WaitFor (s, req, count+PHONE_GetBitmapSize(Type,0,0), 0x0A, 4, ID_SetBitmap);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N9210_ReplyIncomingSMS(GSM_Protocol_Message msg, GSM_StateMachine *s)
+{
+ GSM_SMSMessage sms;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+#ifdef DEBUG
+ smprintf(s, "SMS message received\n");
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = true;
+ DCT3_DecodeSMSFrame(s, &sms,msg.Buffer+5);
+#endif
+ if (Data->EnableIncomingSMS && s->User.IncomingSMS!=NULL) {
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = true;
+ DCT3_DecodeSMSFrame(s, &sms,msg.Buffer+5);
+
+ s->User.IncomingSMS(s->CurrentConfig->Device,sms);
+ }
+ return ERR_NONE;
+}
+
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+static GSM_Error N9210_ReplySetIncomingSMS(GSM_Protocol_Message msg, GSM_StateMachine *s)
+{
+ switch (msg.Buffer[3]) {
+ case 0x0e:
+ s->Phone.Data.EnableIncomingSMS = true;
+ smprintf(s, "Incoming SMS enabled\n");
+ return ERR_NONE;
+ case 0x0f:
+ smprintf(s, "Error enabling incoming SMS\n");
+ switch (msg.Buffer[4]) {
+ case 0x0c:
+ smprintf(s, "No PIN ?\n");
+ return ERR_SECURITYERROR;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+#endif
+
+static GSM_Error N9210_SetIncomingSMS(GSM_StateMachine *s, bool enable)
+{
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0d, 0x00, 0x00, 0x02};
+
+ if (enable!=s->Phone.Data.EnableIncomingSMS) {
+ if (enable) {
+ smprintf(s, "Enabling incoming SMS\n");
+ return GSM_WaitFor (s, req, 7, 0x02, 4, ID_SetIncomingSMS);
+ } else {
+ s->Phone.Data.EnableIncomingSMS = false;
+ smprintf(s, "Disabling incoming SMS\n");
+ }
+ }
+ return ERR_NONE;
+#else
+ return ERR_SOURCENOTAVAILABLE;
+#endif
+}
+
+static GSM_Error N9210_Initialise (GSM_StateMachine *s)
+{
+#ifdef DEBUG
+ DCT3_SetIncomingCB(s,true);
+
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+ N9210_SetIncomingSMS(s,true);
+#endif
+
+#endif
+ return ERR_NONE;
+}
+
+GSM_Error N9210_AnswerCall(GSM_StateMachine *s, int ID, bool all)
+{
+ if (!all) return DCT3DCT4_AnswerCall(s,ID);
+ return DCT3_AnswerAllCalls(s);
+}
+
+static GSM_Reply_Function N9210ReplyFunctions[] = {
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x02,ID_IncomingFrame },
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x03,ID_IncomingFrame },
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+ {N9210_ReplySetIncomingSMS, "\x02",0x03,0x0E,ID_SetIncomingSMS },
+ {N9210_ReplySetIncomingSMS, "\x02",0x03,0x0F,ID_SetIncomingSMS },
+#endif
+ {N9210_ReplyIncomingSMS, "\x02",0x03,0x11,ID_IncomingFrame },
+#ifdef GSM_ENABLE_CELLBROADCAST
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x21,ID_SetIncomingCB },
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x22,ID_SetIncomingCB },
+ {DCT3_ReplyIncomingCB, "\x02",0x03,0x23,ID_IncomingFrame },
+#endif
+ {DCT3_ReplySetSMSC, "\x02",0x03,0x31,ID_SetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x34,ID_GetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x35,ID_GetSMSC },
+
+ {N61_91_ReplySetOpLogo, "\x05",0x03,0x31,ID_SetBitmap },
+ {N61_91_ReplySetOpLogo, "\x05",0x03,0x32,ID_SetBitmap },
+
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_GetNetworkInfo },
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_IncomingFrame },
+ {N71_92_ReplyGetSignalQuality, "\x0A",0x03,0x82,ID_GetSignalQuality },
+ {N9210_ReplySetOpLogo, "\x0A",0x03,0xA4,ID_SetBitmap },
+ {N9210_ReplySetOpLogo, "\x0A",0x03,0xB0,ID_SetBitmap },
+
+ {N71_92_ReplyGetBatteryCharge, "\x17",0x03,0x03,ID_GetBatteryCharge },
+
+ {DCT3_ReplySetDateTime, "\x19",0x03,0x61,ID_SetDateTime },
+ {DCT3_ReplyGetDateTime, "\x19",0x03,0x63,ID_GetDateTime },
+
+ {DCT3_ReplyEnableSecurity, "\x40",0x02,0x64,ID_EnableSecurity },
+ {DCT3_ReplyGetIMEI, "\x40",0x02,0x66,ID_GetIMEI },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_DialVoice },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_CancelCall },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_AnswerCall },
+ {DCT3_ReplyNetmonitor, "\x40",0x02,0x7E,ID_Netmonitor },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetHardware },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetPPM },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCA,ID_GetProductCode },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetManufactureMonth },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetOriginalIMEI },
+
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x02,ID_GetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x02,ID_SetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x15,ID_GetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x15,ID_SetBitmap },
+
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetFirmware },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N9210Phone = {
+ "9210|9210i",
+ N9210ReplyFunctions,
+ N9210_Initialise,
+ PHONE_Terminate,
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ DCT3_GetIMEI,
+ DCT3_GetOriginalIMEI,
+ DCT3_GetManufactureMonth,
+ DCT3_GetProductCode,
+ DCT3_GetHardware,
+ DCT3_GetPPM,
+ NOTSUPPORTED, /* GetSIMIMSI */
+ N71_92_GetDateTime,
+ N71_92_SetDateTime,
+ NOTIMPLEMENTED, /* GetAlarm */
+ NOTIMPLEMENTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTIMPLEMENTED, /* PressKey */
+ NOTIMPLEMENTED, /* Reset */
+ NOTIMPLEMENTED, /* ResetPhoneSettings */
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTIMPLEMENTED, /* SetAutoNetworkLogin */
+ N71_92_GetBatteryCharge,
+ N71_92_GetSignalQuality,
+ DCT3_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ NOTIMPLEMENTED, /* GetMemoryStatus */
+ NOTIMPLEMENTED, /* GetMemory */
+ NOTIMPLEMENTED, /* GetNextMemory */
+ NOTIMPLEMENTED, /* SetMemory */
+ NOTIMPLEMENTED, /* AddMemory */
+ NOTIMPLEMENTED, /* DeleteMemory */
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTIMPLEMENTED, /* GetSpeedDial */
+ NOTIMPLEMENTED, /* SetSpeedDial */
+ DCT3_GetSMSC,
+ DCT3_SetSMSC, /* FIXME: test it */
+ NOTIMPLEMENTED, /* GetSMSStatus */
+ NOTIMPLEMENTED, /* GetSMS */
+ NOTIMPLEMENTED, /* GetNextSMS */
+ NOTIMPLEMENTED, /* SetSMS */
+ NOTIMPLEMENTED, /* AddSMS */
+ NOTIMPLEMENTED, /* DeleteSMS */
+ DCT3_SendSMSMessage,
+ NOTSUPPORTED, /* SendSavedSMS */
+ N9210_SetIncomingSMS,
+ DCT3_SetIncomingCB,
+ NOTIMPLEMENTED, /* GetSMSFolders */
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ DCT3_DialVoice,
+ N9210_AnswerCall,
+ DCT3_CancelCall,
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NOTSUPPORTED, /* SetIncomingCall */
+ NOTIMPLEMENTED, /* SetIncomingUSSD */
+ NOTSUPPORTED, /* SendDTMF */
+ NOTIMPLEMENTED, /* GetRingtone */
+ NOTIMPLEMENTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTIMPLEMENTED, /* GetWAPBookmark */
+ NOTIMPLEMENTED, /* SetWAPBookmark */
+ NOTIMPLEMENTED, /* DeleteWAPBookmark */
+ NOTIMPLEMENTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ N9210_GetBitmap,
+ N9210_SetBitmap,
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ NOTSUPPORTED, /* GetCalendarStatus */
+ NOTSUPPORTED, /* GetCalendar */
+ NOTSUPPORTED, /* GetNextCalendar */
+ NOTSUPPORTED, /* SetCalendar */
+ NOTSUPPORTED, /* AddCalendar */
+ NOTSUPPORTED, /* DeleteCalendar */
+ NOTSUPPORTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNote */
+ NOTIMPLEMENTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFile */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED /* SetGPRSAccessPoint */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */