Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ATParser by
Diff: ATParser.cpp
- Revision:
- 7:d1b193880af1
- Parent:
- 6:51f1171b5ebc
- Child:
- 8:91515b168c70
--- a/ATParser.cpp Fri Jul 17 21:00:23 2015 +0000
+++ b/ATParser.cpp Mon Jul 20 18:23:54 2015 +0000
@@ -56,6 +56,7 @@
_serial->getc();
}
+
// read/write handling with timeouts
int ATParser::write(const char *data, int size) {
int i;
@@ -84,10 +85,16 @@
}
-// getline/putline handling with timeouts/bounds checking
-bool ATParser::_putline(const char *line) {
- for (int i = 0; line[i]; i++) {
- if (putc(line[i]) < 0)
+// Command parsing with line handling
+bool ATParser::vsend(const char *command, va_list args) {
+ flush();
+
+ // Create and send command
+ if (vsprintf(_buffer, command, args) < 0)
+ return false;
+
+ for (int i = 0; _buffer[i]; i++) {
+ if (putc(_buffer[i]) < 0)
return false;
}
@@ -98,46 +105,8 @@
}
#ifdef AT_ECHO
- printf("AT> %s\r\n", line);
+ printf("AT> %s\r\n", _buffer);
#endif
-
- return true;
-}
-
-bool ATParser::_getline(char *line, int size) {
- int i = 0;
-
- while (i < size) {
- int c = getc();
- if (c < 0)
- return false;
-
- line[i++] = c;
-
- // Finish when we hit a newline
- if (memcmp(&line[i-_delim_size], _delimiter, _delim_size) == 0) {
- line[i-_delim_size] = 0;
-#ifdef AT_ECHO
- printf("AT< %s\r\n", line);
-#endif
- return true;
- }
- }
-
- // Ran out of space
- return false;
-}
-
-
-// Command parsing with line handling
-bool ATParser::vsend(const char *command, va_list args) {
- flush();
-
- // Create and send command
- if (vsprintf(_buffer, command, args) < 0)
- return false;
- if (!_putline(_buffer))
- return false;
return true;
}
@@ -146,9 +115,9 @@
// Iterate through each line in the expected response
while (response[0]) {
// Since response is const, we need to copy it into our buffer to
- // add the line's null terminator and clobber value matches with asterisks.
+ // add the line's null terminator and clobber value-matches with asterisks.
//
- // We just use the beginning of the buffer to avoid unecessary allocations.
+ // We just use the beginning of the buffer to avoid unnecessary allocations.
int i = 0;
int offset = 0;
@@ -181,16 +150,26 @@
//
// We keep trying the match until we succeed or some other error
// derails us.
- while (true) {
- // Recieve response
- if (!_getline(_buffer+offset, _buffer_size-offset))
+ int j = 0;
+
+ while (j+1 < _buffer_size - offset) {
+ // Recieve next character
+ int c = getc();
+ if (c < 0)
return false;
-
+
+ _buffer[offset + j++] = c;
+ _buffer[offset + j] = 0;
+
+ // Check for match
int count = -1;
sscanf(_buffer+offset, _buffer, &count);
- // We only succeed if all characters in the response is matched
- if (count >= 0 && (_buffer+offset)[count] == 0) {
+ // We only succeed if all characters in the response are matched
+ if (count == j) {
+#ifdef AT_ECHO
+ printf("AT= %s\r\n", _buffer+offset);
+#endif
// Reuse the front end of the buffer
memcpy(_buffer, response, i);
_buffer[i] = 0;
@@ -202,6 +181,14 @@
response += i;
break;
}
+
+ // Clear the buffer when we hit a newline
+ if (strcmp(&_buffer[offset + j-_delim_size], _delimiter) == 0) {
+#ifdef AT_ECHO
+ printf("AT< %s", _buffer+offset);
+#endif
+ j = 0;
+ }
}
}
@@ -222,6 +209,7 @@
return true;
}
+
// Mapping to vararg functions
bool ATParser::send(const char *command, ...) {
va_list args;
