summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common/protocol
Side-by-side diff
Diffstat (limited to 'gammu/emb/common/protocol') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/protocol/at/at.c6
-rw-r--r--gammu/emb/common/protocol/nokia/fbus2.c6
-rw-r--r--gammu/emb/common/protocol/nokia/fbus2.h6
-rw-r--r--gammu/emb/common/protocol/nokia/mbus2.c2
-rw-r--r--gammu/emb/common/protocol/nokia/mbus2.h2
-rw-r--r--gammu/emb/common/protocol/nokia/phonet.c5
-rw-r--r--gammu/emb/common/protocol/nokia/phonet.h5
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:
*/