summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common/protocol/at/at.c
authorzautrix <zautrix>2004-10-05 11:13:51 (UTC)
committer zautrix <zautrix>2004-10-05 11:13:51 (UTC)
commit50ab40e1e02ad7c65c17a78d08116a808b1257aa (patch) (unidiff)
tree0d1939e2297fa7bbd8e1f2030f154463854164c6 /gammu/emb/common/protocol/at/at.c
parentcf8616f64f20e5448d4ff644f7cc15750cf3f85f (diff)
downloadkdepimpi-50ab40e1e02ad7c65c17a78d08116a808b1257aa.zip
kdepimpi-50ab40e1e02ad7c65c17a78d08116a808b1257aa.tar.gz
kdepimpi-50ab40e1e02ad7c65c17a78d08116a808b1257aa.tar.bz2
updated to latest gammu version
Diffstat (limited to 'gammu/emb/common/protocol/at/at.c') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/protocol/at/at.c6
1 files changed, 5 insertions, 1 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
@@ -21,104 +21,108 @@ static GSM_Error AT_WriteMessage (GSM_StateMachine *s, unsigned char *buffer,
21 while (sent != length) { 21 while (sent != length) {
22 if ((i = s->Device.Functions->WriteDevice(s,buffer + sent, length - sent)) == 0) { 22 if ((i = s->Device.Functions->WriteDevice(s,buffer + sent, length - sent)) == 0) {
23 return ERR_DEVICEWRITEERROR; 23 return ERR_DEVICEWRITEERROR;
24 } 24 }
25 sent += i; 25 sent += i;
26 } 26 }
27 } else { 27 } else {
28 for (i=0;i<length;i++) { 28 for (i=0;i<length;i++) {
29 if (s->Device.Functions->WriteDevice(s,buffer+i,1)!=1) return ERR_DEVICEWRITEERROR; 29 if (s->Device.Functions->WriteDevice(s,buffer+i,1)!=1) return ERR_DEVICEWRITEERROR;
30 /* For some phones like Siemens M20 we need to wait a little 30 /* For some phones like Siemens M20 we need to wait a little
31 * after writing each char. Possible reason: these phones 31 * after writing each char. Possible reason: these phones
32 * can't receive so fast chars or there is bug here in Gammu */ 32 * can't receive so fast chars or there is bug here in Gammu */
33 my_sleep(1); 33 my_sleep(1);
34 } 34 }
35 my_sleep(400); 35 my_sleep(400);
36 } 36 }
37 37
38 return ERR_NONE; 38 return ERR_NONE;
39} 39}
40 40
41typedef struct { 41typedef struct {
42 char*text; 42 char*text;
43 intlines; 43 intlines;
44} SpecialAnswersStruct; 44} SpecialAnswersStruct;
45 45
46static GSM_Error AT_StateMachine(GSM_StateMachine *s, unsigned char rx_char) 46static GSM_Error AT_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
47{ 47{
48 GSM_Protocol_Message Msg2; 48 GSM_Protocol_Message Msg2;
49 GSM_Protocol_ATData *d = &s->Protocol.Data.AT; 49 GSM_Protocol_ATData *d = &s->Protocol.Data.AT;
50 int i; 50 int i;
51 51
52 /* These are lines with end of "normal" answers */ 52 /* These are lines with end of "normal" answers */
53 static char *StartStrings[] = { 53 static char *StartStrings[] = {
54 "OK" , "ERROR" , 54 "OK" , "ERROR" ,
55 "+CME ERROR:" , "+CMS ERROR:", 55 "+CME ERROR:" , "+CMS ERROR:",
56 56
57 "+CPIN: " ,/*A2D issue*/ 57 "+CPIN: " ,/*A2D issue*/
58 58
59 NULL}; 59 NULL};
60 60
61 /* Some info from phone can be inside "normal" answers 61 /* Some info from phone can be inside "normal" answers
62 * It starts with strings written here 62 * It starts with strings written here
63 */ 63 */
64 static SpecialAnswersStructSpecialAnswers[] = { 64 static SpecialAnswersStructSpecialAnswers[] = {
65 {"_OSIGQ:" ,1}, {"_OBS:",1}, 65 {"_OSIGQ:" ,1}, {"_OBS:",1},
66 {"^SCN:" ,1}, {"+CGREG:",1}, 66 {"^SCN:" ,1}, {"+CGREG:",1},
67 {"+CBM:" ,1}, {"+CMT:",2}, 67 {"+CBM:" ,1}, {"+CMT:",2},
68 {"+CMTI:" ,1}, {"+CDS:",2}, 68 {"+CMTI:" ,1}, {"+CDS:",2},
69 {"+CREG:",1}, 69 {"+CREG:" ,1}, {"+CUSD",1},
70 70
71 {"RING" ,1}, {"NO CARRIER",1}, 71 {"RING" ,1}, {"NO CARRIER",1},
72 {"NO ANSWER" ,1}, {"+COLP",1}, 72 {"NO ANSWER" ,1}, {"+COLP",1},
73 {"+CLIP",1}, 73 {"+CLIP",1},
74 74
75 {"SDNDCRC =" ,1},/* Samsung binary transfer end */
76
75 {NULL ,1}}; 77 {NULL ,1}};
76 78
79//printf("%c",rx_char);
80
77 /* Ignore leading CR, LF and ESC */ 81 /* Ignore leading CR, LF and ESC */
78 if (d->Msg.Length == 0) { 82 if (d->Msg.Length == 0) {
79 if (rx_char == 10 || rx_char == 13 || rx_char == 27) return ERR_NONE; 83 if (rx_char == 10 || rx_char == 13 || rx_char == 27) return ERR_NONE;
80 d->LineStart = d->Msg.Length; 84 d->LineStart = d->Msg.Length;
81 } 85 }
82 86
83 if (d->Msg.BufferUsed < d->Msg.Length + 2) { 87 if (d->Msg.BufferUsed < d->Msg.Length + 2) {
84 d->Msg.BufferUsed= d->Msg.Length + 2; 88 d->Msg.BufferUsed= d->Msg.Length + 2;
85 d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed); 89 d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed);
86 } 90 }
87 d->Msg.Buffer[d->Msg.Length++] = rx_char; 91 d->Msg.Buffer[d->Msg.Length++] = rx_char;
88 d->Msg.Buffer[d->Msg.Length ] = 0; 92 d->Msg.Buffer[d->Msg.Length ] = 0;
89 93
90 switch (rx_char) { 94 switch (rx_char) {
91 case 0: 95 case 0:
92 break; 96 break;
93 case 10: 97 case 10:
94 case 13: 98 case 13:
95 if (!d->wascrlf) d->LineEnd = d->Msg.Length-1; 99 if (!d->wascrlf) d->LineEnd = d->Msg.Length-1;
96 d->wascrlf = true; 100 d->wascrlf = true;
97 if (d->Msg.Length > 0 && rx_char == 10 && d->Msg.Buffer[d->Msg.Length-2]==13) { 101 if (d->Msg.Length > 0 && rx_char == 10 && d->Msg.Buffer[d->Msg.Length-2]==13) {
98 i = 0; 102 i = 0;
99 while (StartStrings[i] != NULL) { 103 while (StartStrings[i] != NULL) {
100 if (strncmp(StartStrings[i],d->Msg.Buffer+d->LineStart,strlen(StartStrings[i])) == 0) { 104 if (strncmp(StartStrings[i],d->Msg.Buffer+d->LineStart,strlen(StartStrings[i])) == 0) {
101 s->Phone.Data.RequestMsg= &d->Msg; 105 s->Phone.Data.RequestMsg= &d->Msg;
102 s->Phone.Data.DispatchError= s->Phone.Functions->DispatchMessage(s); 106 s->Phone.Data.DispatchError= s->Phone.Functions->DispatchMessage(s);
103 d->Msg.Length = 0; 107 d->Msg.Length = 0;
104 break; 108 break;
105 } 109 }
106 i++; 110 i++;
107 } 111 }
108 if (d->Msg.Length == 0) break; 112 if (d->Msg.Length == 0) break;
109 113
110 i = 0; 114 i = 0;
111 while (SpecialAnswers[i].text != NULL) { 115 while (SpecialAnswers[i].text != NULL) {
112 if (strncmp(SpecialAnswers[i].text,d->Msg.Buffer+d->LineStart,strlen(SpecialAnswers[i].text)) == 0) { 116 if (strncmp(SpecialAnswers[i].text,d->Msg.Buffer+d->LineStart,strlen(SpecialAnswers[i].text)) == 0) {
113 /* We need something better here */ 117 /* We need something better here */
114 if (s->Phone.Data.RequestID == ID_GetNetworkInfo && strncmp(SpecialAnswers[i].text,"+CREG:",6) == 0) { 118 if (s->Phone.Data.RequestID == ID_GetNetworkInfo && strncmp(SpecialAnswers[i].text,"+CREG:",6) == 0) {
115 i++; 119 i++;
116 continue; 120 continue;
117 } 121 }
118 d->SpecialAnswerStart = d->LineStart; 122 d->SpecialAnswerStart = d->LineStart;
119 d->SpecialAnswerLines= SpecialAnswers[i].lines; 123 d->SpecialAnswerLines= SpecialAnswers[i].lines;
120 } 124 }
121 i++; 125 i++;
122 } 126 }
123 127
124 128