From 88b0d33b8b0b1f6ae320cfc863ca6a47fa8fec22 Mon Sep 17 00:00:00 2001 From: zautrix Date: Sat, 07 Aug 2004 17:24:40 +0000 Subject: Initial revision --- (limited to 'gammu/emb/common/phone/nokia/dct3/n9210.c') 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 +#include + +#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: + */ -- cgit v0.9.0.2