-rw-r--r-- | gammu/emb/common/protocol/at/at.c | 6 | ||||
-rw-r--r-- | gammu/emb/common/protocol/nokia/fbus2.c | 6 | ||||
-rw-r--r-- | gammu/emb/common/protocol/nokia/fbus2.h | 6 | ||||
-rw-r--r-- | gammu/emb/common/protocol/nokia/mbus2.c | 2 | ||||
-rw-r--r-- | gammu/emb/common/protocol/nokia/mbus2.h | 2 | ||||
-rw-r--r-- | gammu/emb/common/protocol/nokia/phonet.c | 5 | ||||
-rw-r--r-- | gammu/emb/common/protocol/nokia/phonet.h | 5 |
7 files changed, 25 insertions, 7 deletions
diff --git a/gammu/emb/common/protocol/at/at.c b/gammu/emb/common/protocol/at/at.c index f4a75b7..f8ddc06 100644 --- a/gammu/emb/common/protocol/at/at.c +++ b/gammu/emb/common/protocol/at/at.c @@ -1,229 +1,233 @@ /* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */ #include "../../gsmstate.h" #if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) #include <stdio.h> #include <string.h> #include "../../gsmcomon.h" #include "at.h" static GSM_Error AT_WriteMessage (GSM_StateMachine *s, unsigned char *buffer, int length, unsigned char type) { int i,sent = 0; GSM_DumpMessageLevel2(s, buffer, length, type); GSM_DumpMessageLevel3(s, buffer, length, type); if (s->Protocol.Data.AT.FastWrite) { while (sent != length) { if ((i = s->Device.Functions->WriteDevice(s,buffer + sent, length - sent)) == 0) { return ERR_DEVICEWRITEERROR; } sent += i; } } else { for (i=0;i<length;i++) { if (s->Device.Functions->WriteDevice(s,buffer+i,1)!=1) return ERR_DEVICEWRITEERROR; /* For some phones like Siemens M20 we need to wait a little * after writing each char. Possible reason: these phones * can't receive so fast chars or there is bug here in Gammu */ my_sleep(1); } my_sleep(400); } return ERR_NONE; } typedef struct { char *text; int lines; } SpecialAnswersStruct; static GSM_Error AT_StateMachine(GSM_StateMachine *s, unsigned char rx_char) { GSM_Protocol_Message Msg2; GSM_Protocol_ATData *d = &s->Protocol.Data.AT; int i; /* These are lines with end of "normal" answers */ static char *StartStrings[] = { "OK" , "ERROR" , "+CME ERROR:" , "+CMS ERROR:" , "+CPIN: " , /*A2D issue*/ NULL}; /* Some info from phone can be inside "normal" answers * It starts with strings written here */ static SpecialAnswersStruct SpecialAnswers[] = { {"_OSIGQ:" ,1}, {"_OBS:" ,1}, {"^SCN:" ,1}, {"+CGREG:" ,1}, {"+CBM:" ,1}, {"+CMT:" ,2}, {"+CMTI:" ,1}, {"+CDS:" ,2}, - {"+CREG:" ,1}, + {"+CREG:" ,1}, {"+CUSD" ,1}, {"RING" ,1}, {"NO CARRIER" ,1}, {"NO ANSWER" ,1}, {"+COLP" ,1}, {"+CLIP" ,1}, + {"SDNDCRC =" ,1}, /* Samsung binary transfer end */ + {NULL ,1}}; +//printf("%c",rx_char); + /* Ignore leading CR, LF and ESC */ if (d->Msg.Length == 0) { if (rx_char == 10 || rx_char == 13 || rx_char == 27) return ERR_NONE; d->LineStart = d->Msg.Length; } if (d->Msg.BufferUsed < d->Msg.Length + 2) { d->Msg.BufferUsed = d->Msg.Length + 2; d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed); } d->Msg.Buffer[d->Msg.Length++] = rx_char; d->Msg.Buffer[d->Msg.Length ] = 0; switch (rx_char) { case 0: break; case 10: case 13: if (!d->wascrlf) d->LineEnd = d->Msg.Length-1; d->wascrlf = true; if (d->Msg.Length > 0 && rx_char == 10 && d->Msg.Buffer[d->Msg.Length-2]==13) { i = 0; while (StartStrings[i] != NULL) { if (strncmp(StartStrings[i],d->Msg.Buffer+d->LineStart,strlen(StartStrings[i])) == 0) { s->Phone.Data.RequestMsg = &d->Msg; s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s); d->Msg.Length = 0; break; } i++; } if (d->Msg.Length == 0) break; i = 0; while (SpecialAnswers[i].text != NULL) { if (strncmp(SpecialAnswers[i].text,d->Msg.Buffer+d->LineStart,strlen(SpecialAnswers[i].text)) == 0) { /* We need something better here */ if (s->Phone.Data.RequestID == ID_GetNetworkInfo && strncmp(SpecialAnswers[i].text,"+CREG:",6) == 0) { i++; continue; } d->SpecialAnswerStart = d->LineStart; d->SpecialAnswerLines = SpecialAnswers[i].lines; } i++; } if (d->SpecialAnswerLines == 1) { /* This is end of special answer. We copy it and send to phone module */ Msg2.Buffer = malloc(d->LineEnd - d->SpecialAnswerStart + 3); memcpy(Msg2.Buffer,d->Msg.Buffer+d->SpecialAnswerStart,d->LineEnd - d->SpecialAnswerStart + 2); Msg2.Length = d->LineEnd - d->SpecialAnswerStart + 2; Msg2.Buffer[Msg2.Length] = 0; s->Phone.Data.RequestMsg = &Msg2; s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s); free(Msg2.Buffer); /* We cut special answer from main buffer */ d->Msg.Length = d->SpecialAnswerStart; if (d->Msg.Length != 0) d->Msg.Length = d->Msg.Length - 2; /* We need to find earlier values of all variables */ d->wascrlf = false; d->LineStart = 0; for (i=0;i<d->Msg.Length;i++) { switch(d->Msg.Buffer[i]) { case 0: break; case 10: case 13: if (!d->wascrlf) d->LineEnd = d->Msg.Length-1; d->wascrlf = true; break; default: if (d->wascrlf) { d->LineStart = d->Msg.Length-1; d->wascrlf = false; } } } d->Msg.Buffer[d->Msg.Length] = 0; } if (d->SpecialAnswerLines > 0) d->SpecialAnswerLines--; } break; case 'T': /* When CONNECT string received, we know there will not follow * anything AT related, after CONNECT can follow ppp data, alcabus * data and also other things. */ if (strncmp(d->Msg.Buffer+d->LineStart, "CONNECT", 7) == 0) { s->Phone.Data.RequestMsg = &d->Msg; s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s); d->LineStart = -1; d->Msg.Length = 0; break; } default: if (d->wascrlf) { d->LineStart = d->Msg.Length-1; d->wascrlf = false; } if (d->EditMode) { if (strlen(d->Msg.Buffer+d->LineStart) == 2 && strncmp(d->Msg.Buffer+d->LineStart,"> ",2)==0) { s->Phone.Data.RequestMsg = &d->Msg; s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s); } } } return ERR_NONE; } static GSM_Error AT_Initialise(GSM_StateMachine *s) { GSM_Protocol_ATData *d = &s->Protocol.Data.AT; d->Msg.Buffer = NULL; d->Msg.BufferUsed = 0; d->Msg.Length = 0; d->Msg.Type = 0; d->SpecialAnswerLines = 0; d->LineStart = -1; d->LineEnd = -1; d->wascrlf = false; d->EditMode = false; d->FastWrite = false; s->Device.Functions->DeviceSetDtrRts(s,true,true); return s->Device.Functions->DeviceSetSpeed(s,s->Speed); } static GSM_Error AT_Terminate(GSM_StateMachine *s) { free(s->Protocol.Data.AT.Msg.Buffer); return ERR_NONE; } GSM_Protocol_Functions ATProtocol = { AT_WriteMessage, AT_StateMachine, AT_Initialise, AT_Terminate }; #endif /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */ diff --git a/gammu/emb/common/protocol/nokia/fbus2.c b/gammu/emb/common/protocol/nokia/fbus2.c index 8b3e024..2b41f8b 100644 --- a/gammu/emb/common/protocol/nokia/fbus2.c +++ b/gammu/emb/common/protocol/nokia/fbus2.c @@ -1,194 +1,198 @@ /* (c) 2002-2003 by Marcin Wiacek */ -/* based on some work from Gnokii and MyGnokii */ +/* based on some work from MyGnokii (www.mwiacek.com) */ +/* Based on some work from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later + */ #include "../../gsmstate.h" #if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2DKU5) || defined(GSM_ENABLE_FBUS2PL2303) #include <stdio.h> #include <string.h> #include "../../gsmcomon.h" #include "fbus2.h" static GSM_Error FBUS2_WriteFrame(GSM_StateMachine *s, unsigned char *MsgBuffer, int MsgLength, unsigned char MsgType) { unsigned char buffer2[FBUS2_MAX_TRANSMIT_LENGTH + 10]; unsigned char checksum=0; int i, len, sent; buffer2[0] = FBUS2_FRAME_ID; if (s->ConnectionType==GCT_FBUS2IRDA) buffer2[0] = FBUS2_IRDA_FRAME_ID; buffer2[1] = FBUS2_DEVICE_PHONE; //destination buffer2[2] = FBUS2_DEVICE_PC; //source buffer2[3] = MsgType; buffer2[4] = MsgLength / 256; buffer2[5] = MsgLength % 256; memcpy(buffer2 + 6, MsgBuffer, MsgLength); len = MsgLength + 6; /* Odd messages require additional 0x00 byte */ if (MsgLength % 2) buffer2[len++] = 0x00; checksum = 0; for (i = 0; i < len; i+=2) checksum ^= buffer2[i]; buffer2[len++] = checksum; checksum = 0; for (i = 1; i < len; i+=2) checksum ^= buffer2[i]; buffer2[len++] = checksum; /* Sending to phone */ sent=s->Device.Functions->WriteDevice(s,buffer2,len); if (sent!=len) return ERR_DEVICEWRITEERROR; return ERR_NONE; } static GSM_Error FBUS2_WriteMessage (GSM_StateMachine *s, unsigned char *MsgBuffer, int MsgLength, unsigned char MsgType) { int i, nom, togo, thislength; /* number of messages, ... */ unsigned char buffer2[FBUS2_MAX_TRANSMIT_LENGTH + 2], seqnum; GSM_Protocol_FBUS2Data *d = &s->Protocol.Data.FBUS2; GSM_Error error; GSM_DumpMessageLevel3(s, MsgBuffer, MsgLength, MsgType); nom = (MsgLength + FBUS2_MAX_TRANSMIT_LENGTH - 1) / FBUS2_MAX_TRANSMIT_LENGTH; togo = MsgLength; for (i = 0; i < nom; i++) { seqnum = d->MsgSequenceNumber; if (i==0) seqnum = seqnum + 0x40; d->MsgSequenceNumber = (d->MsgSequenceNumber + 1) & 0x07; thislength = togo; if (togo > FBUS2_MAX_TRANSMIT_LENGTH) thislength = FBUS2_MAX_TRANSMIT_LENGTH; memcpy(buffer2, MsgBuffer + (MsgLength - togo), thislength); buffer2[thislength] = nom - i; buffer2[thislength + 1] = seqnum; togo = togo - thislength; GSM_DumpMessageLevel2(s, buffer2, thislength, MsgType); error=FBUS2_WriteFrame(s, buffer2, thislength + 2, MsgType); if (error!=ERR_NONE) return error; } return ERR_NONE; } static GSM_Error FBUS2_SendAck(GSM_StateMachine *s, unsigned char MsgType, unsigned char MsgSequence) { unsigned char buffer2[2]; buffer2[0] = MsgType; buffer2[1] = MsgSequence; if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) { smprintf(s,"[Sending Ack of type %02x, seq %x]\n",buffer2[0],buffer2[1]); } /* Sending to phone */ return FBUS2_WriteFrame(s, buffer2, 2, FBUS2_ACK_BYTE); } static GSM_Error FBUS2_StateMachine(GSM_StateMachine *s, unsigned char rx_char) { GSM_Protocol_FBUS2Data *d = &s->Protocol.Data.FBUS2; unsigned char frm_num, seq_num; bool correct = false; /* XOR the byte with the earlier checksum */ d->Msg.CheckSum[d->Msg.Count & 1] ^= rx_char; if (d->MsgRXState == RX_GetMessage) { d->Msg.Buffer[d->Msg.Count] = rx_char; d->Msg.Count++; /* This is not last byte in frame */ if (d->Msg.Count != d->Msg.Length+(d->Msg.Length%2)+2) return ERR_NONE; /* Checksum is incorrect */ if (d->Msg.CheckSum[0] != d->Msg.CheckSum[1]) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s,"[ERROR: checksum]\n"); } free(d->Msg.Buffer); d->Msg.Length = 0; d->Msg.Buffer = NULL; d->MsgRXState = RX_Sync; return ERR_NONE; } seq_num = d->Msg.Buffer[d->Msg.Length-1]; if (d->Msg.Type == FBUS2_ACK_BYTE) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) { smprintf(s, "[Received Ack of type %02x, seq %02x]\n",d->Msg.Buffer[0],seq_num); } d->MsgRXState = RX_Sync; return ERR_NONE; } frm_num = d->Msg.Buffer[d->Msg.Length-2]; if ((seq_num & 0x40) == 0x40) { d->FramesToGo = frm_num; d->MultiMsg.Length = 0; d->MultiMsg.Type = d->Msg.Type; d->MultiMsg.Destination = d->Msg.Destination; d->MultiMsg.Source = d->Msg.Source; } if ((seq_num & 0x40) != 0x40 && d->FramesToGo != frm_num) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s, "[ERROR: Missed part of multiframe msg]\n"); } free(d->Msg.Buffer); d->Msg.Length = 0; d->Msg.Buffer = NULL; d->MsgRXState = RX_Sync; return ERR_NONE; } if ((seq_num & 0x40) != 0x40 && d->Msg.Type != d->MultiMsg.Type) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s, "[ERROR: Multiframe msg in multiframe msg]\n"); } free(d->Msg.Buffer); d->Msg.Length = 0; d->Msg.Buffer = NULL; d->MsgRXState = RX_Sync; return ERR_NONE; } if (d->MultiMsg.BufferUsed < d->MultiMsg.Length+d->Msg.Length-2) { d->MultiMsg.BufferUsed = d->MultiMsg.Length+d->Msg.Length-2; d->MultiMsg.Buffer = (unsigned char *)realloc(d->MultiMsg.Buffer,d->MultiMsg.BufferUsed); } memcpy(d->MultiMsg.Buffer+d->MultiMsg.Length,d->Msg.Buffer,d->Msg.Length-2); d->MultiMsg.Length = d->MultiMsg.Length+d->Msg.Length-2; free(d->Msg.Buffer); diff --git a/gammu/emb/common/protocol/nokia/fbus2.h b/gammu/emb/common/protocol/nokia/fbus2.h index 5dd45d7..8dbcb07 100644 --- a/gammu/emb/common/protocol/nokia/fbus2.h +++ b/gammu/emb/common/protocol/nokia/fbus2.h @@ -1,38 +1,42 @@ /* (c) 2002-2003 by Marcin Wiacek */ -/* based on some work from Gnokii and MyGnokii */ +/* based on some work from MyGnokii (www.mwiacek.com) */ +/* Based on some work from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later + */ #ifndef fbus2_h #define fbus2_h #include "../protocol.h" #define FBUS2_FRAME_ID 0x1e #define FBUS2_IRDA_FRAME_ID 0x1c #define FBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */ #define FBUS2_DEVICE_PC 0x0c /* Our PC */ #define FBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */ #define FBUS2_MAX_TRANSMIT_LENGTH 120 typedef struct { int MsgSequenceNumber; int MsgRXState; int FramesToGo; GSM_Protocol_Message MultiMsg; GSM_Protocol_Message Msg; } GSM_Protocol_FBUS2Data; #ifndef GSM_USED_SERIALDEVICE # define GSM_USED_SERIALDEVICE #endif #if defined(GSM_ENABLE_BLUEFBUS2) # ifndef GSM_USED_BLUETOOTHDEVICE # define GSM_USED_BLUETOOTHDEVICE # endif #endif #endif /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */ diff --git a/gammu/emb/common/protocol/nokia/mbus2.c b/gammu/emb/common/protocol/nokia/mbus2.c index f07d6c5..8353b46 100644 --- a/gammu/emb/common/protocol/nokia/mbus2.c +++ b/gammu/emb/common/protocol/nokia/mbus2.c @@ -1,194 +1,194 @@ /* (c) 2001-2003 by Marcin Wiacek */ -/* based on some work from MyGnokii */ +/* based on some work from MyGnokii (www.mwiacek.com) */ #include "../../gsmstate.h" #ifdef GSM_ENABLE_MBUS2 #include <stdio.h> #include <string.h> #include "../../gsmcomon.h" #include "mbus2.h" static GSM_Error MBUS2_WriteMessage (GSM_StateMachine *s, unsigned char *MsgBuffer, int MsgLength, unsigned char MsgType) { unsigned char *buffer2, checksum = 0; GSM_Protocol_MBUS2Data *d = &s->Protocol.Data.MBUS2; int i, sent, len; GSM_DumpMessageLevel3(s, MsgBuffer, MsgLength, MsgType); buffer2 = (unsigned char *)malloc(MsgLength + 8); buffer2[0] = MBUS2_FRAME_ID; buffer2[1] = MBUS2_DEVICE_PHONE; // destination buffer2[2] = MBUS2_DEVICE_PC; // source buffer2[3] = MsgType; buffer2[4] = MsgLength / 256; buffer2[5] = MsgLength % 256; memcpy(buffer2 + 6, MsgBuffer, MsgLength); len = 6 + MsgLength; /* According to http://www.flosys.com/tdma/n5160.html some phones * can have problems with checksum equal 0x1F. Phones can recognize * received frame, but won't send ACK for it. When checksum is 0x1F, * we increment the sequence number */ do { d->MsgSequenceNumber++; buffer2[len] = d->MsgSequenceNumber; /* Calculating checksum */ checksum = 0; for (i = 0; i < len + 1; i++) checksum ^= buffer2[i]; } while (checksum == 0x1f); buffer2[len++] = d->MsgSequenceNumber; buffer2[len++] = checksum; GSM_DumpMessageLevel2(s, buffer2+6, MsgLength, MsgType); /* Sending to phone */ my_sleep(10); sent=s->Device.Functions->WriteDevice(s,buffer2,len); free(buffer2); if (sent!=len) return ERR_DEVICEWRITEERROR; return ERR_NONE; } static GSM_Error MBUS2_SendAck(GSM_StateMachine *s, unsigned char type, unsigned char sequence) { GSM_Device_Functions *Device = s->Device.Functions; unsigned char buffer2[6]; int i; buffer2[0] = MBUS2_FRAME_ID; buffer2[1] = MBUS2_DEVICE_PHONE; //destination buffer2[2] = MBUS2_DEVICE_PC; //source buffer2[3] = MBUS2_ACK_BYTE; buffer2[4] = sequence; buffer2[5] = 0; /* Calculating checksum */ for (i = 0; i < 5; i++) buffer2[5] ^= buffer2[i]; if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) { smprintf(s,"[Sending Ack of type %02x, seq: %x]\n",type,sequence); } /* Sending to phone */ my_sleep(10); if (Device->WriteDevice(s,buffer2,6)!=6) return ERR_DEVICEWRITEERROR; return ERR_NONE; } static GSM_Error MBUS2_StateMachine(GSM_StateMachine *s, unsigned char rx_char) { GSM_Phone_Functions *Phone = s->Phone.Functions; GSM_Protocol_MBUS2Data *d = &s->Protocol.Data.MBUS2; d->Msg.CheckSum[0] = d->Msg.CheckSum[1]; d->Msg.CheckSum[1] ^= rx_char; if (d->MsgRXState == RX_GetMessage) { d->Msg.Buffer[d->Msg.Count] = rx_char; d->Msg.Count++; /* This is not last byte in frame */ if (d->Msg.Count != d->Msg.Length+2) return ERR_NONE; /* Checksum is incorrect */ if (d->Msg.CheckSum[0] != rx_char) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s,"[ERROR: checksum]\n"); } d->MsgRXState = RX_Sync; return ERR_NONE; } if (d->Msg.Destination != MBUS2_DEVICE_PHONE) { MBUS2_SendAck(s, d->Msg.Type, d->Msg.Buffer[d->Msg.Count-2]); s->Phone.Data.RequestMsg = &d->Msg; s->Phone.Data.DispatchError = Phone->DispatchMessage(s); } d->MsgRXState = RX_Sync; return ERR_NONE; } if (d->MsgRXState == RX_GetLength2) { if (d->Msg.Type == MBUS2_ACK_BYTE) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) { smprintf(s,"[Received Ack]\n"); } d->MsgRXState = RX_Sync; return ERR_NONE; } d->Msg.Length = d->Msg.Length + rx_char; if (d->Msg.BufferUsed < d->Msg.Length+2) { d->Msg.BufferUsed = d->Msg.Length+2; d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed); } d->MsgRXState = RX_GetMessage; return ERR_NONE; } if (d->MsgRXState == RX_GetLength1) { d->Msg.Length = rx_char * 256; d->MsgRXState = RX_GetLength2; return ERR_NONE; } if (d->MsgRXState == RX_GetType) { d->Msg.Type = rx_char; d->MsgRXState = RX_GetLength1; return ERR_NONE; } if (d->MsgRXState == RX_GetSource) { if (rx_char != MBUS2_DEVICE_PHONE && rx_char != MBUS2_DEVICE_PC) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s,"[ERROR: incorrect char - %02x, not %02x and %02x]\n", rx_char, MBUS2_DEVICE_PHONE, MBUS2_DEVICE_PC); } d->MsgRXState = RX_Sync; return ERR_NONE; } d->Msg.Source = rx_char; d->MsgRXState = RX_GetType; return ERR_NONE; } if (d->MsgRXState == RX_GetDestination) { if (rx_char != MBUS2_DEVICE_PC && rx_char != MBUS2_DEVICE_PHONE) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s,"[ERROR: incorrect char - %02x, not %02x and %02x]\n", rx_char, MBUS2_DEVICE_PHONE, MBUS2_DEVICE_PC); } d->MsgRXState = RX_Sync; return ERR_NONE; } d->Msg.Destination = rx_char; d->MsgRXState = RX_GetSource; return ERR_NONE; } if (d->MsgRXState == RX_Sync) { if (rx_char != MBUS2_FRAME_ID) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || diff --git a/gammu/emb/common/protocol/nokia/mbus2.h b/gammu/emb/common/protocol/nokia/mbus2.h index 86fcab6..5dbd8cb 100644 --- a/gammu/emb/common/protocol/nokia/mbus2.h +++ b/gammu/emb/common/protocol/nokia/mbus2.h @@ -1,28 +1,28 @@ /* (c) 2001-2003 by Marcin Wiacek */ -/* based on some work from MyGnokii */ +/* based on some work from MyGnokii (www.mwiacek.com) */ #ifndef mbus2_h #define mbus2_h #include "../protocol.h" #define MBUS2_FRAME_ID 0x1f #define MBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */ #define MBUS2_DEVICE_PC 0x10 /* Our PC (MBUS) */ #define MBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */ typedef struct { int MsgSequenceNumber; int MsgRXState; GSM_Protocol_Message Msg; } GSM_Protocol_MBUS2Data; #ifndef GSM_USED_SERIALDEVICE # define GSM_USED_SERIALDEVICE #endif #endif /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */ diff --git a/gammu/emb/common/protocol/nokia/phonet.c b/gammu/emb/common/protocol/nokia/phonet.c index bc5717d..db5bd72 100644 --- a/gammu/emb/common/protocol/nokia/phonet.c +++ b/gammu/emb/common/protocol/nokia/phonet.c @@ -1,194 +1,197 @@ /* (c) 2002-2003 by Marcin Wiacek */ -/* based on some work from Gnokii */ +/* Based on some work from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later + */ #include "../../gsmstate.h" #if defined(GSM_ENABLE_IRDA) || defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_BLUEPHONET) #include <stdio.h> #include <string.h> #include "../../gsmcomon.h" #include "phonet.h" static GSM_Error PHONET_WriteMessage (GSM_StateMachine *s, unsigned char *MsgBuffer, int MsgLength, unsigned char MsgType) { unsigned char *buffer2; int sent; GSM_DumpMessageLevel3(s, MsgBuffer, MsgLength, MsgType); buffer2 = (unsigned char *)malloc(MsgLength + 6); buffer2[0] = PHONET_FRAME_ID, buffer2[1] = PHONET_DEVICE_PHONE; //destination buffer2[2] = PHONET_DEVICE_PC; //source if (s->ConnectionType==GCT_PHONETBLUE || s->ConnectionType==GCT_BLUEPHONET) { buffer2[0] = PHONET_BLUE_FRAME_ID; buffer2[1] = PHONET_DEVICE_PHONE; //destination buffer2[2] = PHONET_BLUE_DEVICE_PC; //source } buffer2[3] = MsgType; buffer2[4] = MsgLength / 256; buffer2[5] = MsgLength % 256; memcpy(buffer2 + 6, MsgBuffer, MsgLength); GSM_DumpMessageLevel2(s, buffer2+6, MsgLength, MsgType); /* Sending to phone */ sent = s->Device.Functions->WriteDevice(s,buffer2,MsgLength+6); free(buffer2); if (sent!=MsgLength+6) return ERR_DEVICEWRITEERROR; return ERR_NONE; } static GSM_Error PHONET_StateMachine(GSM_StateMachine *s, unsigned char rx_char) { GSM_Protocol_PHONETData *d = &s->Protocol.Data.PHONET; bool correct = false; if (d->MsgRXState==RX_GetMessage) { d->Msg.Buffer[d->Msg.Count] = rx_char; d->Msg.Count++; /* This is not last byte in frame */ if (d->Msg.Count != d->Msg.Length) return ERR_NONE; s->Phone.Data.RequestMsg = &d->Msg; s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s); free(d->Msg.Buffer); d->Msg.Length = 0; d->Msg.Buffer = NULL; d->MsgRXState = RX_Sync; return ERR_NONE; } if (d->MsgRXState==RX_GetLength2) { d->Msg.Length = d->Msg.Length + rx_char; d->Msg.Buffer = (unsigned char *)malloc(d->Msg.Length); d->MsgRXState = RX_GetMessage; return ERR_NONE; } if (d->MsgRXState==RX_GetLength1) { d->Msg.Length = rx_char * 256; d->MsgRXState = RX_GetLength2; return ERR_NONE; } if (d->MsgRXState==RX_GetType) { d->Msg.Type = rx_char; d->MsgRXState = RX_GetLength1; return ERR_NONE; } if (d->MsgRXState==RX_GetSource) { if (rx_char != PHONET_DEVICE_PHONE) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s,"[ERROR: incorrect char - %02x, not %02x]\n", rx_char, PHONET_DEVICE_PHONE); } d->MsgRXState = RX_Sync; return ERR_NONE; } d->Msg.Source = rx_char; d->MsgRXState = RX_GetType; return ERR_NONE; } if (d->MsgRXState==RX_GetDestination) { switch (s->ConnectionType) { case GCT_IRDAPHONET: if (rx_char == PHONET_DEVICE_PC) correct = true; break; case GCT_PHONETBLUE: case GCT_BLUEPHONET: if (rx_char == PHONET_BLUE_DEVICE_PC) correct = true; break; default: break; } if (!correct) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s,"[ERROR: incorrect char - %02x, not %02x]\n", rx_char, PHONET_DEVICE_PC); } d->MsgRXState = RX_Sync; return ERR_NONE; } d->Msg.Destination = rx_char; d->MsgRXState = RX_GetSource; return ERR_NONE; } if (d->MsgRXState==RX_Sync) { switch (s->ConnectionType) { case GCT_IRDAPHONET: if (rx_char == PHONET_FRAME_ID) correct = true; break; case GCT_PHONETBLUE: case GCT_BLUEPHONET: if (rx_char == PHONET_BLUE_FRAME_ID) correct = true; break; default: break; } if (!correct) { if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR || s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) { smprintf(s,"[ERROR: incorrect char - %02x, not %02x]\n", rx_char, PHONET_FRAME_ID); } return ERR_NONE; } d->Msg.Count = 0; d->MsgRXState = RX_GetDestination; return ERR_NONE; } return ERR_NONE; } static GSM_Error PHONET_Initialise(GSM_StateMachine *s) { int total = 0, i, n; GSM_Protocol_PHONETData *d = &s->Protocol.Data.PHONET; unsigned char req[50]; d->Msg.Length = 0; d->Msg.Buffer = NULL; d->MsgRXState = RX_Sync; if (s->ConnectionType == GCT_PHONETBLUE || s->ConnectionType == GCT_BLUEPHONET) { /* Send frame in PHONET style */ req[0] = PHONET_BLUE_FRAME_ID; req[1] = PHONET_DEVICE_PHONE; req[2] = PHONET_BLUE_DEVICE_PC; req[3] = 0xD0; req[4] = 0x00; req[5] = 0x01; req[6] = 0x04; if (s->Device.Functions->WriteDevice(s,req,7) != 7) return ERR_DEVICEWRITEERROR; while (total < 7) { n = s->Device.Functions->ReadDevice(s, req + total, 50 - total); total += n; } /* Answer frame in PHONET style */ req[10] = PHONET_BLUE_FRAME_ID; req[11] = PHONET_BLUE_DEVICE_PC; req[12] = PHONET_DEVICE_PHONE; req[13] = 0xD0; req[14] = 0x00; req[15] = 0x01; req[16] = 0x05; for (i = 0; i < 7; i++) { if (req[i] != req[10+i]) { smprintf(s,"Incorrect byte in the answer\n"); return ERR_UNKNOWN; } } diff --git a/gammu/emb/common/protocol/nokia/phonet.h b/gammu/emb/common/protocol/nokia/phonet.h index 2f6e836..e750bbd 100644 --- a/gammu/emb/common/protocol/nokia/phonet.h +++ b/gammu/emb/common/protocol/nokia/phonet.h @@ -1,35 +1,38 @@ /* (c) 2002-2003 by Marcin Wiacek */ -/* based on some work from Gnokii */ +/* Based on some work from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later + */ #ifndef PHONET_h #define PHONET_h #include "../protocol.h" #define PHONET_FRAME_ID 0x14 #define PHONET_BLUE_FRAME_ID 0x19 #define PHONET_DEVICE_PHONE 0x00 /* Nokia mobile phone */ #define PHONET_DEVICE_PC 0x0c /* Our PC */ #define PHONET_BLUE_DEVICE_PC 0x10 /* Our PC */ typedef struct { int MsgRXState; GSM_Protocol_Message Msg; } GSM_Protocol_PHONETData; #if defined(GSM_ENABLE_IRDAPHONET) # ifndef GSM_USED_IRDADEVICE # define GSM_USED_IRDADEVICE # endif #endif #if defined(GSM_ENABLE_BLUEPHONET) # ifndef GSM_USED_BLUETOOTHDEVICE # define GSM_USED_BLUETOOTHDEVICE # endif #endif #endif /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */ |