X-Git-Url: http://git.jankratochvil.net/?p=gnokii.git;a=blobdiff_plain;f=common%2Fphones%2Fnk6100.c;fp=common%2Fphones%2Fnk6100.c;h=f7f1d4cce755560365660c327b8e3c32cd1ea29f;hp=582367ee25e12c3d12d313c38a82c9074864a698;hb=1379b6d01c3c3bd082a8ab32433450d8a2f3419c;hpb=a363234939c6030f24d092e9d4d97ee40f50ce03 diff --git a/common/phones/nk6100.c b/common/phones/nk6100.c index 582367e..f7f1d4c 100644 --- a/common/phones/nk6100.c +++ b/common/phones/nk6100.c @@ -1,5 +1,4 @@ /* - $Id$ G N O K I I @@ -14,6 +13,19 @@ This file provides functions specific to the 6100 series. See README for more details on supported mobile phones. + $Log$ + Revision 1.1.1.3 2002/04/03 00:08:09 short + Found in "gnokii-working" directory, some November-patches version + + Revision 1.3 2001/08/17 00:01:53 pkot + Fixed a typo in 6100.c (me) + + Revision 1.2 2001/08/09 12:34:34 pkot + 3330 and 6250 support - I have no idea if it does work (mygnokii) + + Revision 1.1 2001/07/09 23:55:35 pkot + Initial support for 6100 series in the new structure (me) + */ #include @@ -35,46 +47,11 @@ /* Some globals */ -static const SMSMessage_Layout nk6100_deliver = { - true, - 0, 11, 0, 0, 6, 0, 0, -1, 23, 22, 0, 20, - 8, true, 24, true, 36, -1, - 5, 4, - 43, true -}; - -static const SMSMessage_Layout nk6100_submit = { - true, - -1, 20, 20, 20, 6, 21, 22, -1, 24, 23, 20, 20, - 8, true, 25, true, 37, -1, - -1, -1, - 44, true -}; - -static const SMSMessage_Layout nk6100_delivery_report = { - true, - 0, 0, 0, 0, 6, 0, 0, 0, 22, 21, -1, 20, - 8, true, 24, true, 35, 42, - 5, 4, - 22, true -}; - -static const SMSMessage_Layout nk6100_picture = { - false, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, true, 0, true, 0, 0, - 0, 0, - 0, true -}; - -static SMSMessage_PhoneLayout nk6100_layout; - static unsigned char MagicBytes[4] = { 0x00, 0x00, 0x00, 0x00 }; static GSM_IncomingFunctionType IncomingFunctions[] = { { 0x64, IncomingPhoneInfo }, { 0xd2, IncomingModelInfo }, - { 0x14, IncomingSMS }, { 0x03, Incoming0x03 }, { 0x0a, Incoming0x0a }, { 0x17, Incoming0x17 }, @@ -108,28 +85,35 @@ static GSM_Error Functions(GSM_Operation op, GSM_Data *data, GSM_Statemachine *s switch (op) { case GOP_Init: return Initialise(state); + break; case GOP_GetModel: return GetModelName(data, state); + break; case GOP_GetRevision: return GetRevision(data, state); + break; case GOP_GetImei: return GetIMEI(data, state); + break; case GOP_Identify: return Identify(data, state); + break; case GOP_GetBatteryLevel: return GetBatteryLevel(data, state); + break; case GOP_GetRFLevel: return GetRFLevel(data, state); + break; case GOP_GetMemoryStatus: return GetMemoryStatus(data, state); - case GOP_GetSMS: - return GetSMSMessage(data, state); + break; default: return GE_NOTIMPLEMENTED; + break; } } -/* static bool LinkOK = true; */ +static bool LinkOK = true; /* Initialise is the only function allowed to 'use' state */ static GSM_Error Initialise(GSM_Statemachine *state) @@ -137,40 +121,40 @@ static GSM_Error Initialise(GSM_Statemachine *state) GSM_Data data; char model[10]; GSM_Error err; + int try = 0, connected = 0; /* Copy in the phone info */ memcpy(&(state->Phone), &phone_nokia_6100, sizeof(GSM_Phone)); - /* SMS Layout */ - nk6100_layout.Type = 7; - nk6100_layout.Deliver = nk6100_deliver; - nk6100_layout.Submit = nk6100_submit; - nk6100_layout.DeliveryReport = nk6100_delivery_report; - nk6100_layout.Picture = nk6100_picture; - layout = nk6100_layout; - - switch (state->Link.ConnectionType) { - case GCT_Serial: - err = FBUS_Initialise(&(state->Link), state, 0); - break; - case GCT_Infrared: - err = PHONET_Initialise(&(state->Link), state); - break; - default: - return GE_NOTSUPPORTED; - } + while (!connected) { + switch (state->Link.ConnectionType) { + case GCT_Serial: + if (try > 1) return GE_NOTSUPPORTED; + err = FBUS_Initialise(&(state->Link), state); + break; + case GCT_Infrared: + if (try > 0) return GE_NOTSUPPORTED; + err = PHONET_Initialise(&(state->Link), state); + break; + default: + return GE_NOTSUPPORTED; + break; + } - if (err != GE_NONE) { - dprintf("Error in link initialisation\n"); - return GE_NOTSUPPORTED; - } - - SM_Initialise(state); + if (err != GE_NONE) { + dprintf("Error in link initialisation\n"); + try++; + continue; + } + + SM_Initialise(state); - /* Now test the link and get the model */ - GSM_DataClear(&data); - data.Model = model; - if (state->Phone.Functions(GOP_GetModel, &data, state) != GE_NONE) return GE_NOTSUPPORTED; + /* Now test the link and get the model */ + GSM_DataClear(&data); + data.Model = model; + if (state->Phone.Functions(GOP_GetModel, &data, state) != GE_NONE) try++; + else connected = 1; + } return GE_NONE; } @@ -278,7 +262,7 @@ static GSM_Error Incoming0x03(int messagetype, unsigned char *message, int lengt if (message[5] != 0xff) { 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]); + dprintf(_("Memory status - location = %d\n"), (message[8] << 8) + message[9]); return GE_NONE; } else { dprintf("Unknown error getting mem status\n"); @@ -298,9 +282,8 @@ static GSM_Error Incoming0x03(int messagetype, unsigned char *message, int lengt static GSM_Error Identify(GSM_Data *data, GSM_Statemachine *state) { unsigned char req[] = { FBUS_FRAME_HEADER, 0x10 }; - + dprintf("Identifying...\n"); - PNOK_GetManufacturer(data->Manufacturer); if (SM_SendMessage(state, 4, 0x64, req) != GE_NONE) return GE_NOTREADY; SM_WaitFor(state, data, 0x64); SM_Block(state, data, 0x64); /* waits for all requests */ @@ -338,17 +321,17 @@ static GSM_Error IncomingPhoneInfo(int messagetype, unsigned char *message, int dprintf("Received revision %s\n", data->Revision); } - dprintf("Message: Mobile phone identification received:\n"); - dprintf("\tIMEI: %s\n", data->Imei); - dprintf("\tModel: %s\n", data->Model); - dprintf("\tProduction Code: %s\n", message + 31); - dprintf("\tHW: %s\n", message + 39); - dprintf("\tFirmware: %s\n", message + 44); + dprintf(_("Message: Mobile phone identification received:\n")); + dprintf(_(" IMEI: %s\n"), data->Imei); + dprintf(_(" Model: %s\n"), data->Model); + dprintf(_(" Production Code: %s\n"), message + 31); + dprintf(_(" HW: %s\n"), message + 39); + dprintf(_(" Firmware: %s\n"), message + 44); /* These bytes are probably the source of the "Accessory not connected" messages on the phone when trying to emulate NCDS... I hope.... UPDATE: of course, now we have the authentication algorithm. */ - dprintf("\tMagic bytes: %02x %02x %02x %02x\n", message[50], message[51], message[52], message[53]); + dprintf(_(" Magic bytes: %02x %02x %02x %02x\n"), message[50], message[51], message[52], message[53]); MagicBytes[0] = message[50]; MagicBytes[1] = message[51]; @@ -374,7 +357,7 @@ static GSM_Error IncomingModelInfo(int messagetype, unsigned char *message, int data->Revision[GSM_MAX_REVISION_LENGTH - 1] = 0; } #endif - dprintf("Phone info:\n%s\n", message + 4); + dprintf(_("Phone info:\n%s\n"), message + 4); return GE_NONE; } @@ -417,89 +400,3 @@ static int GetMemoryType(GSM_MemoryType memory_type) } return (result); } - -static GSM_Error GetSMSMessage(GSM_Data *data, GSM_Statemachine *state) -{ - unsigned char req[] = { FBUS_FRAME_HEADER, 0x07, 0x02 /* Unknown */, 0x00 /* Location */, 0x01, 0x64}; - - req[5] = data->SMSMessage->Number; - - if (SM_SendMessage(state, 8, 0x02, req) != GE_NONE) return GE_NOTREADY; - return SM_Block(state, data, 0x14); -} - -static GSM_Error IncomingSMS(int messagetype, unsigned char *message, int length, GSM_Data *data) -{ - int i; - - switch (message[3]) { - /* save sms succeeded */ - case 0x05: - dprintf("Message stored at %d\n", message[5]); - break; - /* save sms failed */ - case 0x06: - dprintf("SMS saving failed:\n"); - switch (message[4]) { - case 0x02: - dprintf("\tAll locations busy.\n"); - return GE_MEMORYFULL; - case 0x03: - dprintf("\tInvalid location!\n"); - return GE_INVALIDSMSLOCATION; - default: - dprintf("\tUnknown reason.\n"); - return GE_UNKNOWN; - } - /* read sms */ - case 0x08: - for (i = 0; i < length; 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)); - - /* Short Message status */ - DecodePDUSMS(message, data->SMSMessage, length); - - break; - /* read sms failed */ - case 0x09: - dprintf("SMS reading failed:\n"); - switch (message[4]) { - case 0x02: - dprintf("\tInvalid location!\n"); - return GE_INVALIDSMSLOCATION; - case 0x07: - dprintf("\tEmpty SMS location.\n"); - return GE_EMPTYSMSLOCATION; - default: - dprintf("\tUnknown reason.\n"); - return GE_UNKNOWN; - } - /* delete sms succeeded */ - case 0x0b: - dprintf("Message: SMS deleted successfully.\n"); - break; - /* sms status succeded */ - case 0x37: - dprintf("Message: SMS Status Received\n"); - dprintf("\tThe number of messages: %d\n", message[10]); - dprintf("\tUnread messages: %d\n", message[11]); - data->SMSStatus->Unread = message[11]; - data->SMSStatus->Number = message[10]; - break; - /* sms status failed */ - case 0x38: - dprintf("Message: SMS Status error, probably not authorized by PIN\n"); - return GE_INTERNALERROR; - /* unknown */ - default: - dprintf("Unknown message.\n"); - return GE_UNKNOWN; - } - return GE_NONE; -}