The various routines are called P7110_(whatever).
$Log$
- Revision 1.1.1.1 2001/11/25 21:59:13 short
- :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
-
- Revision 1.27 2001/11/22 17:56:53 pkot
- smslib update. sms sending
-
- Revision 1.26 2001/11/19 17:09:59 pkot
- Bugfixes
-
- Revision 1.25 2001/11/19 16:24:31 pkot
- Grrrr... I should have check if I have fixed this typo
-
- Revision 1.24 2001/11/19 15:53:16 pkot
- Typos
-
- Revision 1.23 2001/11/19 13:46:42 pkot
- reading unread SMS in 6210 from Inbox. Folder updates (Markus Plail)
-
- Revision 1.22 2001/11/17 20:18:32 pkot
- Added dau9p connection type for 6210/7110
-
- Revision 1.21 2001/11/17 16:44:07 pkot
- Cleanup. Reading SMS for 6100 series. Not that it has some bugs more and does not support UDH yet
-
- Revision 1.20 2001/11/15 12:15:04 pkot
- smslib updates. begin work on sms in 6100 series
-
- Revision 1.19 2001/11/15 12:12:34 pkot
- 7110 and 6110 series phones introduce as Nokia
-
- Revision 1.18 2001/11/15 12:04:06 pkot
- Faster initialization for 6100 series (don't check for dlr3 cable)
-
- Revision 1.17 2001/11/14 10:48:03 pkot
- 6210/7110 debug cleanups
-
- Revision 1.16 2001/11/13 16:12:21 pkot
- Preparing libsms to get to work. 6210/7110 SMS and SMS Folder updates
+ Revision 1.1.1.5 2002/04/03 00:08:10 short
+ Found in "gnokii-working" directory, some November-patches version
Revision 1.15 2001/11/08 16:47:48 pkot
Start fiddling with 7110 and SMS
Revision 1.1 2001/01/14 22:46:59 chris
Preliminary 7110 support (dlr9 only) and the beginnings of a new structure
+
*/
#include <string.h>
return P7110_GetCalendarNote(data, state);
case GOP_GetSMS:
return P7110_GetSMS(data, state);
- case GOP_SendSMS:
- return P7110_SendSMS(data, state);
-/* I'm not sure yet if folder functions will be shared or local
+/* I'm not suer yet if folder functions will be shared or local
case GOP_GetSMSFolders:
return P7110_GetSMSFolders(data, state);
case GOP_GetSMSFolderStatus:
/* Copy in the phone info */
memcpy(&(state->Phone), &phone_nokia_7110, sizeof(GSM_Phone));
- dprintf("Connecting\n");
while (!connected) {
switch (state->Link.ConnectionType) {
- case GCT_DAU9P:
- if (try == 0) try = 1;
case GCT_Serial:
if (try > 1) return GE_NOTSUPPORTED;
- err = FBUS_Initialise(&(state->Link), state, 1 - try);
+ err = FBUS_Initialise(&(state->Link), state);
break;
case GCT_Infrared:
case GCT_Irda:
}
if (err != GE_NONE) {
- dprintf("Error in link initialisation: %d\n", err);
+ dprintf("Error in link initialisation\n");
try++;
continue;
}
*(data->BatteryLevel) = message[5];
dprintf("Battery level %f\n",*(data->BatteryLevel));
}
+ return GE_NONE;
break;
default:
dprintf("Unknown subtype of type 0x17 (%d)\n", message[3]);
return GE_UNKNOWN;
+ break;
}
- return GE_NONE;
}
static GSM_Error P7110_GetRFLevel(GSM_Data *data, GSM_Statemachine *state)
}
blockstart += blockstart[1];
}
+ return GE_NONE;
break;
case 0x82:
if (data->RFLevel) {
*(data->RFLevel) = message[4];
dprintf("RF level %f\n",*(data->RFLevel));
}
+ return GE_NONE;
break;
case 0xa4:
dprintf("Op Logo Set OK\n");
- break;
+ return GE_NONE;
default:
dprintf("Unknown subtype of type 0x0a (%d)\n", message[3]);
return GE_UNKNOWN;
+ break;
}
- return GE_NONE;
}
static GSM_Error P7110_GetMemoryStatus(GSM_Data *data, GSM_Statemachine *state)
data->MemoryStatus->Used = (message[16] << 8) + message[17];
data->MemoryStatus->Free = ((message[14] << 8) + message[15]) - data->MemoryStatus->Used;
dprintf("Memory status - location = %d\n", (message[8] << 8) + message[9]);
+ return GE_NONE;
} else {
dprintf("Unknown error getting mem status\n");
return GE_NOTIMPLEMENTED;
+
}
}
+ return GE_NONE;
break;
case 0x08: /* Read Memory response */
if (data->PhonebookEntry) {
}
blockstart += blockstart[3];
}
+ return GE_NONE;
break;
case 0x0c:
switch (message[6]) {
- case 0x3d: return GE_PHBOOKWRITEFAILED;
- case 0x3e: return GE_PHBOOKWRITEFAILED;
- default: return GE_NONE;
+ case 0x3d: return GE_PHBOOKWRITEFAILED; break;
+ case 0x3e: return GE_PHBOOKWRITEFAILED; break;
+ default: return GE_NONE; break;
}
break;
default:
dprintf("Unknown subtype of type 0x03 (%d)\n", message[3]);
return GE_UNKNOWN;
+ break;
}
- return GE_NONE;
}
/* Just as an example.... */
unsigned char req2[] = {FBUS_FRAME_HEADER, 0x03, 0x01, 0x32};
dprintf("Identifying...\n");
- PNOK_GetManufacturer(data->Manufacturer);
if (SM_SendMessage(state, 4, 0x1b, req) != GE_NONE) return GE_NOTREADY;
if (SM_SendMessage(state, 6, 0x1b, req2) != GE_NONE) return GE_NOTREADY;
SM_WaitFor(state, data, 0x1b);
snprintf(data->Imei, GSM_MAX_IMEI_LENGTH, "%s", message + 4);
dprintf("Received imei %s\n",data->Imei);
}
+ return GE_NONE;
break;
case 04:
if (data->Model) {
snprintf(data->Revision, GSM_MAX_REVISION_LENGTH, "%s", message + 7);
dprintf("Received revision %s\n",data->Revision);
}
+ return GE_NONE;
break;
default:
dprintf("Unknown subtype of type 0x1b (%d)\n", message[3]);
return GE_UNKNOWN;
+ break;
}
- return GE_NONE;
}
/* handle messages of type 0x14 (SMS Handling, Folders, Logos.. */
static GSM_Error P7110_IncomingFolder(int messagetype, unsigned char *message, int length, GSM_Data *data)
{
- int i, j;
- int nextfolder = 0x10;
- bool found;
-
+#if 0
+ int off, offset;
+ int wc,i,j,tmp=0;
switch (message[3]) {
/* getfolders */
case 0x7B:
i = 5;
- memset(data->SMSFolderList, 0, sizeof(SMS_FolderList));
- dprintf("Message: %d SMS Folders received:\n", message[4]);
-
- strcpy(data->SMSFolderList->Folder[1].Name, " ");
- data->SMSFolderList->number = message[4];
+ data->SMSFolders->number = message[4];
+ dprintf("Message: %d SMS Folders received:\n", data->SMSFolders->number);
for (j = 0; j < message[4]; j++) {
- int len;
- strcpy(data->SMSFolderList->Folder[j].Name, " ");
- data->SMSFolderList->FolderID[j] = message[i];
- dprintf("Folder Index: %d", data->SMSFolderList->FolderID[j]);
- i += 2;
+ strcpy(data->SMSFolders->Folder[j].Name, " ");
+ data->SMSFolders->FoldersID[j] = message[i];
+ dprintf("Folder Index: %d", data->SMSFolders->FoldersID[j]);
+ i = i + 2;
dprintf(" Folder name: ");
- len = 0;
- /* search for next folder's index number, i.e. length of folder name */
- while (message[i+1] != nextfolder && i < length) {
- i += 2;
- len++;
- }
- /* see nk7110.txt */
- nextfolder += 0x08;
- if (nextfolder == 0x28) nextfolder++;
- i -= 2 * len +1;
- DecodeUnicode(data->SMSFolderList->Folder[j].Name, message + i, len);
- dprintf("%s\n", data->SMSFolderList->Folder[j].Name);
- i += 2 * len + 2;
+ tmp = 0;
+ while ((message[i] != 0x00) & (message[i+1] == 0x00)) {
+ wc = message[i] | (message[i+1] << 8);
+ data->SMSFolders->Folder[j].Name[tmp] = DecodeWithUnicodeAlphabet(wc);
+ dprintf("%c", data->SMSFolders->Folder[j].Name[tmp]);
+ tmp++;
+ i = i + 2;
+ }
+ dprintf("\n");
+ tmp = 0;
+ i = i + 1;
}
break;
/* getfolderstatus */
case 0x6C:
- memset(data->SMSFolder, 0, sizeof(SMS_Folder));
dprintf("Message: SMS Folder status received: \n" );
- data->SMSFolder->FolderID = data->SMSMessage->MemoryType;
- data->SMSFolder->number = (message[5] * 256) + message[5];
- dprintf("Message: Number of Entries: %i\n" , data->SMSFolder->number);
+ data->OneSMSFolder->number = (message[5] * 256) + message[5];
+ dprintf("Message: Number of Entries: %i\n" , data->OneSMSFolder->number);
dprintf("Message: IDs of Entries : ");
- for (i = 0; i < message[4] * 256 + message[5]; i++) {
- data->SMSFolder->locations[i] = message[6+(i*2)] * 256 + message[(i*2)+7];
- dprintf("%d, ", data->SMSFolder->locations[i]);
+ for (i=0;i<message[4]*256+message[5];i++) {
+ data->OneSMSFolder->locations[i]=message[6+(i*2)]*256+message[(i*2)+7];
+ dprintf("%d, ", data->OneSMSFolder->locations[i]);
}
dprintf("\n");
break;
/* getsms */
case 0x08:
- for (i = 0; i < length; i ++)
+ for (i = 0; i < length-2; i ++)
if (isprint(message[i]))
dprintf("[%02x%c]", message[i], message[i]);
else
dprintf("[%02x ]", message[i]);
dprintf("\n");
- memset(data->SMSMessage, 0, sizeof(GSM_SMSMessage));
-
- /* Number of SMS in folder */
- data->SMSMessage->Number = message[7];
-
- /* MessageType/FolderID */
- data->SMSMessage->MemoryType = message[5];
+ dprintf("Message: Getting SMS %i " , data->SMSMessage->Location);
+ dprintf("in Folder %i\n", data->SMSMessage->Destination);
+ if (message[5] != data->SMSMessage->Destination) {
+ dprintf("Invalid SMS location (Folder)\n");
+ return GE_INVALIDSMSLOCATION;
+ }
+ if ((message[6] * 256 + message[7]) != data->SMSMessage->Location) {
+ dprintf("Invalid SMS location (ID)\n");
+ return GE_INVALIDSMSLOCATION;
+ }
- /* These offsets are 6210/7110 series specific */
- /* Short Message status */
- data->SMSMessage->Status = message[4];
- dprintf("\tStatus: ");
- switch (data->SMSMessage->Status) {
- case SMS_Read:
- dprintf("READ\n");
- break;
- case SMS_Unread:
- dprintf("UNREAD\n");
- break;
- case SMS_Sent:
- dprintf("SENT\n");
- break;
- case SMS_Unsent:
- dprintf("UNSENT\n");
- break;
- default:
- dprintf("UNKNOWN\n");
- break;
- }
- /* See if message# is given back by phone. If not and status is unread */
- /* we want it, if status is not unread it's a "random" message given back */
- /* by the phone because we want a message of which the # doesn't exist */
- found = false;
- for (i = 0; i < data->SMSFolder->number; i++) {
- if (data->SMSMessage->Number == data->SMSFolder->locations[i])
- found = true;
- }
- if (found==false && data->SMSMessage->Status != SMS_Unread) return GE_INVALIDSMSLOCATION;
+ /* Status see nk7110.txt */
+ data->SMSMessage->Status = message[4];
- DecodePDUSMS(message + 6, data->SMSMessage, length);
+ if (message[8]==0x01) data->SMSMessage->Type = SMS_Deliver_Report;
+ offset=4;
+ if (data->SMSMessage->Status == SMS_MO_SENT) offset=5;
+ off = 0;
+ if (message[9+12] & 0x40) { /* UDH header available */
+ off = (message[9+31+offset] + 1); /* Length of UDH header */
+
+ dprintf(" UDH header available (length %i)\n",off);
+ }
+
+ DecodeSMSHeader(message, length, data->SMSMessage, 9, offset);
+ DecodeTextSMS(message, length, data->SMSMessage, 9, offset, off);
+
break;
-
- /* get list of SMS pictures */
- case 0x97:
- dprintf("Getting list of SMS pictures...\n");
- for (i = 0; i < length; i ++)
- if (isprint(message[i]))
- dprintf("[%02x%c]", message[i], message[i]);
- else
- dprintf("[%02x ]", message[i]);
- dprintf("\n");
- break;
+
default:
- for (i = 0; i < length; i ++)
+ for (i = 0; i < length-2; i ++)
if (isprint(message[i]))
dprintf("[%02x%c]", message[i], message[i]);
else
dprintf("[%02x ]", message[i]);
dprintf("\n");
dprintf("Message: Unknown message of type 14 : %d length: %d\n", message[3], length);
- return GE_UNKNOWN;
+ break;
}
+#endif
return GE_NONE;
}
static GSM_Error P7110_GetSMS(GSM_Data *data, GSM_Statemachine *state)
{
- unsigned char req_folders[] = {FBUS_FRAME_HEADER, 0x7a, 0x00, 0x00};
- unsigned char req_status[] = {FBUS_FRAME_HEADER, 0x6b,
- 0x08, // Folder ID
- 0x0f, 0x01};
- unsigned char req_sms[] = {FBUS_FRAME_HEADER, 0x07,
+ unsigned char req[] = {FBUS_FRAME_HEADER, 0x07,
0x08, // FolderID
0x00,
0x01, // Location
0x01, 0x65, 0x01};
- unsigned char req_list[] = {FBUS_FRAME_HEADER, 0x96,
- 0x09, /* location */
- 0x0f, 0x07};
- GSM_Error error;
-
- /* just testiung picture listing */
- req_list[4] = data->SMSMessage->MemoryType;
- if (SM_SendMessage(state, 7, 0x14, req_list) != GE_NONE) return GE_NOTREADY;
- error = SM_Block(state, data, 0x14);
-
- /* see if the message we want is from the last read folder, i.e. */
- /* we don't have to get folder status again */
- if (data->SMSMessage->MemoryType != data->SMSFolder->FolderID) {
-
- dprintf("Getting list of SMS folders...\n");
- if (SM_SendMessage(state, 6, 0x14, req_folders) != GE_NONE) return GE_NOTREADY;
- error = SM_Block(state, data, 0x14);
-
- if (data->SMSMessage->MemoryType > data->SMSFolderList->FolderID[data->SMSFolderList->number-1])
- return GE_INVALIDMEMORYTYPE;
- data->SMSFolder->FolderID = data->SMSMessage->MemoryType;
- req_status[4] = data->SMSMessage->MemoryType;
-
- dprintf("Getting entries for SMS folder %i...\n", data->SMSMessage->MemoryType);
- if (SM_SendMessage(state, 7, 0x14, req_status) != GE_NONE) return GE_NOTREADY;
- error = SM_Block(state, data, 0x14);
- }
-
+
dprintf("Getting SMS...\n");
- req_sms[4] = data->SMSMessage->MemoryType;
- req_sms[6] = data->SMSMessage->Number;
- if (SM_SendMessage(state, 10, 0x14, req_sms) != GE_NONE) return GE_NOTREADY;
+ req[4] = data->SMSMessage->MemoryType;
+ req[6] = data->SMSMessage->Location;
+ if (SM_SendMessage(state, 10, 0x14, req) != GE_NONE) return GE_NOTREADY;
return SM_Block(state, data, 0x14);
}
-static GSM_Error P7110_GetPicture(GSM_Data *data, GSM_Statemachine *state)
-{
- unsigned char req_list[] = {FBUS_FRAME_HEADER, 0x96,
- 0x09, /* location */
- 0x0f, 0x07};
- if (SM_SendMessage(state, 7, 0x14, req_list) != GE_NONE) return GE_NOTREADY;
- return SM_Block(state, data, 0x14);
-}
-#if 0
static GSM_Error P7110_GetSMSFolders(GSM_Data *data, GSM_Statemachine *state)
{
unsigned char req[] = {FBUS_FRAME_HEADER, 0x7A, 0x00, 0x00};
static GSM_Error P7110_GetSMSFolderStatus(GSM_Data *data, GSM_Statemachine *state)
{
+#if 0
unsigned char req[] = {FBUS_FRAME_HEADER, 0x6B,
0x08, // Folder ID
0x0F, 0x01};
- req[4] = data->SMSFolder->FolderID;
+ req[4] = data->OneSMSFolder->FolderID;
dprintf("Getting SMS Folder Status...\n");
if (SM_SendMessage(state, 7, 0x14, req) != GE_NONE) return GE_NOTREADY;
return SM_Block(state, data, 0x14);
-}
#endif
-
-static GSM_Error P7110_SendSMS(GSM_Data *data, GSM_Statemachine *state)
-{
- unsigned char req[256] = {FBUS_FRAME_HEADER, 0x01, 0x02, 0x00};
- unsigned char smsc_req[] = {FBUS_FRAME_HEADER, 0x33, 0x64, 0x00};
- int length, i;
-
- if (data->SMSMessage->MessageCenter.No) {
- data->MessageCenter = &data->SMSMessage->MessageCenter;
- P7110_GetSMSCenter(data, state);
-// SM_SendMessage(state, 6, 0x02, smsc_req);
-// SM_Block(state, data, 0x02);
- }
-
- length = EncodePDUSMS(data->SMSMessage, req + 6);
- if (!length) return GE_SMSWRONGFORMAT;
- dprintf("Sending SMS...(%d)\n", length);
- for (i = 0; i < length + 6; i++) {
- dprintf("%02x ", req[i]);
- }
- dprintf("\n");
- if (SM_SendMessage(state, length+6, 0x02, req) != GE_NONE) return GE_NOTREADY;
- return SM_Block(state, data, 0x02);
+ return GE_NONE;
}
static GSM_Error P7110_IncomingSMS(int messagetype, unsigned char *message, int length, GSM_Data *data)
{
GSM_Error e = GE_NONE;
- int digits, bytes, i;
-
- if (!data) return GE_INTERNALERROR;
+ int digits, bytes;
+
+ if (!data || !data->MessageCenter) return GE_INTERNALERROR;
switch (message[3]) {
case P7110_SUBSMS_SMSC_RCVD:
- dprintf("SMSC Received\n");
/* FIXME: Implement all these in gsm-sms.c */
data->MessageCenter->No = message[4];
data->MessageCenter->Format = message[6];
data->MessageCenter->Validity = message[8]; /* due to changes in format */
+
digits = message[9];
bytes = message[21] - 1;
sprintf(data->MessageCenter->Name, "%s", message + 33);
- strcpy(data->MessageCenter->Recipient, GetBCDNumber(message+9));
- strcpy(data->MessageCenter->Number, GetBCDNumber(message+21));
- data->MessageCenter->Type = message[22];
-
if (strlen(data->MessageCenter->Recipient) == 0) {
sprintf(data->MessageCenter->Recipient, "(none)");
}
}
break;
-
case P7110_SUBSMS_SMS_SENT:
- dprintf("SMS sent\n");
- e = GE_SMSSENDOK;
- break;
-
case P7110_SUBSMS_SEND_FAIL:
- dprintf("SMS sending failed\n");
- e = GE_SMSSENDFAILED;
- break;
-
case P7110_SUBSMS_SMS_RCVD:
case P7110_SUBSMS_CELLBRD_OK:
case P7110_SUBSMS_CELLBRD_FAIL:
dprintf("Subtype 0x%02x of type 0x%02x (SMS handling) not implemented\n", message[3], P7110_MSG_SMS);
e = GE_NOTIMPLEMENTED;
break;
-
default:
dprintf("Unknown subtype of type 0x%02x (SMS handling): 0x%02x\n", P7110_MSG_SMS, message[3]);
e = GE_UNKNOWN;
static GSM_Error P7110_GetSMSCenter(GSM_Data *data, GSM_Statemachine *state)
{
GSM_Error error;
- unsigned char req[] = {FBUS_FRAME_HEADER, P7110_SUBSMS_GET_SMSC, 0x64, 0x00};
+ unsigned char req[2000] = {FBUS_FRAME_HEADER, P7110_SUBSMS_GET_SMSC, 0x64, 0x00};
req[5] = data->MessageCenter->No;
static GSM_Error P7110_GetClock(char req_type, GSM_Data *data, GSM_Statemachine *state)
{
GSM_Error error;
- unsigned char req[] = {FBUS_FRAME_HEADER, req_type};
+ unsigned char req[2000] = {FBUS_FRAME_HEADER, req_type};
if (SM_SendMessage(state, 4, P7110_MSG_CLOCK, req) != GE_NONE) return GE_NOTREADY;
error = SM_Block(state, data, P7110_MSG_CLOCK);
static GSM_Error P7110_GetCalendarNote(GSM_Data *data, GSM_Statemachine *state)
{
GSM_Error error = GE_NOTREADY;
- unsigned char req[] = {FBUS_FRAME_HEADER, P7110_SUBCAL_GET_NOTE, 0x00, 0x00};
- unsigned char date[] = {FBUS_FRAME_HEADER, P7110_SUBCLO_GET_DATE};
+ unsigned char req[2000] = {FBUS_FRAME_HEADER, P7110_SUBCAL_GET_NOTE, 0x00, 0x00};
+ unsigned char date[2000] = {FBUS_FRAME_HEADER, P7110_SUBCLO_GET_DATE};
GSM_Data tmpdata;
GSM_DateTime tmptime;