Merge pull request #6314 from jarvte/improve_athandler_write

Cellular: ATHandler write improvements.
pull/6211/merge
Cruz Monrreal 2018-03-15 10:39:56 -05:00 committed by GitHub
commit eff0cc2c06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 48 deletions

View File

@ -314,7 +314,7 @@ void ATHandler::fill_buffer()
} while ((uint32_t)timer.read_ms() < _at_timeout); } while ((uint32_t)timer.read_ms() < _at_timeout);
set_error(NSAPI_ERROR_DEVICE_ERROR); set_error(NSAPI_ERROR_DEVICE_ERROR);
tr_error("AT TIMEOUT, scope: %d timeout: %lu", _current_scope, _at_timeout); tr_debug("AT TIMEOUT, scope: %d timeout: %lu", _current_scope, _at_timeout);
} }
int ATHandler::get_char() int ATHandler::get_char()
@ -846,7 +846,7 @@ bool ATHandler::consume_to_tag(const char *tag, bool consume_tag)
match_pos = 0; match_pos = 0;
} }
} }
tr_error("consume_to_tag not found"); tr_debug("consume_to_tag not found");
return false; return false;
} }
@ -862,7 +862,7 @@ bool ATHandler::consume_to_stop_tag()
return true; return true;
} }
tr_error("consume_to_stop_tag not found"); tr_debug("consume_to_stop_tag not found");
set_error(NSAPI_ERROR_DEVICE_ERROR); set_error(NSAPI_ERROR_DEVICE_ERROR);
return false; return false;
} }
@ -942,13 +942,7 @@ void ATHandler::cmd_start(const char* cmd)
return; return;
} }
// write command (void)write(cmd, strlen(cmd));
for (size_t i = 0; i < strlen(cmd); i++) {
if (write_char(cmd[i]) == false) {
// writing failed ---> write_char have set the last error, return...
return;
}
}
_cmd_start = true; _cmd_start = true;
} }
@ -966,12 +960,7 @@ void ATHandler::write_int(int32_t param)
char number_string[str_len]; char number_string[str_len];
int32_t result = sprintf(number_string, "%ld", param); int32_t result = sprintf(number_string, "%ld", param);
if (result > 0 && result < str_len) { if (result > 0 && result < str_len) {
for (size_t i = 0; number_string[i]; i++) { (void)write(number_string, strlen(number_string));
if (write_char(number_string[i]) == false) {
// writing failed ---> write_char have set the last error, break out
break;
}
}
} }
} }
@ -984,20 +973,15 @@ void ATHandler::write_string(const char* param, bool useQuotations)
} }
// we are writing string, surround it with quotes // we are writing string, surround it with quotes
if (useQuotations && write_char('\"') == false) { if (useQuotations && write("\"", 1) != 1) {
return; return;
} }
for (size_t i = 0; i < strlen(param); i++) { (void)write(param, strlen(param));
if (write_char(param[i]) == false) {
// writing failed ---> write_char have set the last error, return
break;
}
}
if (useQuotations) { if (useQuotations) {
// we are writing string, surround it with quotes // we are writing string, surround it with quotes
write_char('\"'); (void)write("\"", 1);
} }
} }
@ -1007,11 +991,7 @@ void ATHandler::cmd_stop()
return; return;
} }
// Finish with CR // Finish with CR
for (size_t i = 0; i < _output_delimiter_length; i++) { (void)write(_output_delimiter, _output_delimiter_length);
if (write_char(_output_delimiter[i]) == false) {
break;
}
}
} }
size_t ATHandler::write_bytes(const uint8_t *data, size_t len) size_t ATHandler::write_bytes(const uint8_t *data, size_t len)
@ -1020,36 +1000,27 @@ size_t ATHandler::write_bytes(const uint8_t *data, size_t len)
return 0; return 0;
} }
size_t i = 0; ssize_t write_len = write(data, len);
for (; i < len; i++) { return write_len < 0 ? 0 : (size_t)write_len;
if (write_char(data[i]) == false) {
// writing failed ---> write_char have set the last error, return
break;
}
} }
return i; ssize_t ATHandler::write(const void *data, size_t len)
}
bool ATHandler::write_char(char c)
{ {
pollfh fhs; pollfh fhs;
fhs.fh = _fileHandle; fhs.fh = _fileHandle;
fhs.events = POLLOUT; fhs.events = POLLOUT;
bool retVal = true; ssize_t write_len = -1;
int count = poll(&fhs, 1, _at_timeout); int count = poll(&fhs, 1, _at_timeout);
if (count > 0 && (fhs.revents & POLLOUT)) { if (count > 0 && (fhs.revents & POLLOUT)) {
retVal = _fileHandle->write(&c, 1) == 1 ? true : false; write_len = _fileHandle->write(data, len);
} else {
retVal = false;
} }
if (retVal == false) { if (write_len < 0 || (size_t)write_len != len) {
set_error(NSAPI_ERROR_DEVICE_ERROR); set_error(NSAPI_ERROR_DEVICE_ERROR);
} }
return retVal; return write_len;
} }
// do common checks before sending subparameters // do common checks before sending subparameters
@ -1063,8 +1034,8 @@ bool ATHandler::check_cmd_send()
if (_cmd_start) { if (_cmd_start) {
_cmd_start = false; _cmd_start = false;
} else { } else {
if (write_char(_delimiter) == false) { if (write(&_delimiter, 1) != 1) {
// writing of delimiter failed, return. write_char already have set the _last_err // writing of delimiter failed, return. write() already have set the _last_err
return false; return false;
} }
} }

View File

@ -446,7 +446,7 @@ private:
void set_3gpp_error(int err, DeviceErrorType error_type); void set_3gpp_error(int err, DeviceErrorType error_type);
bool check_cmd_send(); bool check_cmd_send();
bool write_char(char c); ssize_t write(const void *data, size_t len);
/** Copy content of one char buffer to another buffer and sets NULL terminator /** Copy content of one char buffer to another buffer and sets NULL terminator
* *