mirror of https://github.com/ARMmbed/mbed-os.git
commit
1fb9dd7ddd
|
@ -78,12 +78,10 @@ TEST_F(TestAT_CellularDevice, test_AT_CellularDevice_get_at_handler)
|
|||
AT_CellularDevice *dev2 = new AT_CellularDevice(&fh1); // AT fh1 ref count 3
|
||||
EXPECT_TRUE(dev2->open_information(&fh1)); // AT fh1 ref count 4
|
||||
ATHandler *at = dev2->get_at_handler(); // AT fh1 ref count 5
|
||||
EXPECT_EQ(at->get_ref_count(), 6);
|
||||
delete dev2; // AT fh1 2 refs deleted -> ref count 3
|
||||
EXPECT_EQ(at->get_ref_count(), 4);
|
||||
|
||||
AT_CellularDevice dev3(&fh1); // AT fh1 ref count 4
|
||||
EXPECT_TRUE(dev3.release_at_handler(at) == NSAPI_ERROR_OK); // AT fh1 ref count 3
|
||||
EXPECT_EQ(ATHandler_stub::ref_count, 4);
|
||||
}
|
||||
|
||||
TEST_F(TestAT_CellularDevice, test_AT_CellularDevice_open_network)
|
||||
|
@ -272,7 +270,6 @@ TEST_F(TestAT_CellularDevice, test_AT_CellularDevice_create_delete_context)
|
|||
AT_CellularDevice *dev = new AT_CellularDevice(&fh1);
|
||||
|
||||
ATHandler *at = dev->get_at_handler();
|
||||
EXPECT_EQ(at->get_ref_count(), 1);
|
||||
EXPECT_TRUE(dev->release_at_handler(at) == NSAPI_ERROR_OK);
|
||||
|
||||
CellularContext *ctx = dev->create_context(NULL);
|
||||
|
@ -280,12 +277,9 @@ TEST_F(TestAT_CellularDevice, test_AT_CellularDevice_create_delete_context)
|
|||
|
||||
dev = new AT_CellularDevice(&fh1);
|
||||
at = dev->get_at_handler();
|
||||
EXPECT_EQ(at->get_ref_count(), 1);
|
||||
ctx = dev->create_context(NULL);
|
||||
CellularContext *ctx1 = dev->create_context(&fh1);
|
||||
EXPECT_EQ(at->get_ref_count(), 3);
|
||||
CellularContext *ctx2 = dev->create_context(&fh1);
|
||||
EXPECT_EQ(at->get_ref_count(), 4);
|
||||
|
||||
EXPECT_TRUE(ctx);
|
||||
EXPECT_TRUE(ctx1);
|
||||
|
@ -296,20 +290,13 @@ TEST_F(TestAT_CellularDevice, test_AT_CellularDevice_create_delete_context)
|
|||
EXPECT_TRUE(xx);
|
||||
|
||||
dev->delete_context(ctx);
|
||||
EXPECT_EQ(at->get_ref_count(), 3);
|
||||
dev->delete_context(ctx1);
|
||||
EXPECT_EQ(at->get_ref_count(), 2);
|
||||
dev->delete_context(NULL);
|
||||
EXPECT_EQ(at->get_ref_count(), 2);
|
||||
dev->delete_context(ctx2);
|
||||
EXPECT_EQ(at->get_ref_count(), 1);
|
||||
|
||||
ctx = dev->create_context(NULL);
|
||||
EXPECT_EQ(at->get_ref_count(), 2);
|
||||
ctx1 = dev->create_context(&fh1);
|
||||
EXPECT_EQ(at->get_ref_count(), 3);
|
||||
ctx2 = dev->create_context(&fh1);
|
||||
EXPECT_EQ(at->get_ref_count(), 4);
|
||||
EXPECT_TRUE(dev->release_at_handler(at) == NSAPI_ERROR_OK);
|
||||
EXPECT_TRUE(ctx);
|
||||
EXPECT_TRUE(ctx1);
|
||||
|
|
|
@ -105,7 +105,6 @@ TEST_F(TestATHandler, test_ATHandler_list)
|
|||
ATHandler::set_debug_list(false);
|
||||
|
||||
ATHandler *at1 = ATHandler::get_instance(&fh1, que, 0, ",", 0, 0);
|
||||
EXPECT_TRUE(at1->get_ref_count() == 1);
|
||||
|
||||
ATHandler::set_at_timeout_list(1000, false);
|
||||
ATHandler::set_debug_list(true);
|
||||
|
@ -113,14 +112,11 @@ TEST_F(TestATHandler, test_ATHandler_list)
|
|||
EXPECT_TRUE(ATHandler::get_instance(NULL, que, 0, ",", 0, 0) == NULL);
|
||||
|
||||
ATHandler *at2 = ATHandler::get_instance(&fh1, que, 0, ",", 0, 0);
|
||||
EXPECT_TRUE(at1->get_ref_count() == 2);
|
||||
EXPECT_TRUE(at2->get_ref_count() == 2);
|
||||
|
||||
ATHandler::set_at_timeout_list(2000, true);
|
||||
ATHandler::set_debug_list(false);
|
||||
|
||||
EXPECT_TRUE(at1->close() == NSAPI_ERROR_OK);
|
||||
EXPECT_TRUE(at2->get_ref_count() == 1);
|
||||
EXPECT_TRUE(at2->close() == NSAPI_ERROR_OK);
|
||||
|
||||
ATHandler::set_at_timeout_list(1000, false);
|
||||
|
@ -204,43 +200,6 @@ TEST_F(TestATHandler, test_ATHandler_get_last_device_error)
|
|||
EXPECT_TRUE(0 == at.get_last_device_error().errCode);
|
||||
}
|
||||
|
||||
TEST_F(TestATHandler, test_ATHandler_inc_ref_count)
|
||||
{
|
||||
EventQueue que;
|
||||
FileHandle_stub fh1;
|
||||
|
||||
ATHandler at(&fh1, que, 0, ",");
|
||||
at.inc_ref_count();
|
||||
}
|
||||
|
||||
TEST_F(TestATHandler, test_ATHandler_dec_ref_count)
|
||||
{
|
||||
EventQueue que;
|
||||
FileHandle_stub fh1;
|
||||
|
||||
ATHandler at(&fh1, que, 0, ",");
|
||||
at.dec_ref_count();
|
||||
}
|
||||
|
||||
TEST_F(TestATHandler, test_ATHandler_get_ref_count)
|
||||
{
|
||||
EventQueue que;
|
||||
FileHandle_stub fh1;
|
||||
|
||||
ATHandler at(&fh1, que, 0, ",");
|
||||
EXPECT_TRUE(1 == at.get_ref_count());
|
||||
|
||||
at.inc_ref_count();
|
||||
EXPECT_TRUE(2 == at.get_ref_count());
|
||||
|
||||
at.inc_ref_count();
|
||||
EXPECT_TRUE(3 == at.get_ref_count());
|
||||
|
||||
at.dec_ref_count();
|
||||
at.dec_ref_count();
|
||||
EXPECT_TRUE(1 == at.get_ref_count());
|
||||
}
|
||||
|
||||
TEST_F(TestATHandler, test_ATHandler_set_at_timeout)
|
||||
{
|
||||
EventQueue que;
|
|
@ -15,12 +15,12 @@ set(unittest-includes ${unittest-includes}
|
|||
|
||||
# Source files
|
||||
set(unittest-sources
|
||||
../features/cellular/framework/AT/ATHandler.cpp
|
||||
../features/cellular/framework/device/ATHandler.cpp
|
||||
)
|
||||
|
||||
# Test files
|
||||
set(unittest-test-sources
|
||||
features/cellular/framework/AT/athandler/athandlertest.cpp
|
||||
features/cellular/framework/device/athandler/athandlertest.cpp
|
||||
stubs/EventQueue_stub.cpp
|
||||
stubs/FileHandle_stub.cpp
|
||||
stubs/us_ticker_stub.cpp
|
|
@ -111,6 +111,11 @@ bool ATHandler::get_debug() const
|
|||
return ATHandler_stub::debug_on;
|
||||
}
|
||||
|
||||
void ATHandler::set_debug_list(bool debug_on)
|
||||
{
|
||||
ATHandler_stub::debug_on = debug_on;
|
||||
}
|
||||
|
||||
ATHandler::~ATHandler()
|
||||
{
|
||||
ATHandler_stub::urc_handlers.clear();
|
||||
|
@ -409,11 +414,6 @@ void ATHandler::set_at_timeout_list(uint32_t timeout_milliseconds, bool default_
|
|||
ATHandler_stub::default_timeout = default_timeout;
|
||||
}
|
||||
|
||||
void ATHandler::set_debug_list(bool debug_on)
|
||||
{
|
||||
ATHandler_stub::debug_on = debug_on;
|
||||
}
|
||||
|
||||
void ATHandler::set_send_delay(uint16_t send_delay)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -77,7 +77,8 @@ public:
|
|||
* @param send_delay the minimum delay in ms between the end of last response and the beginning of a new command
|
||||
*/
|
||||
ATHandler(FileHandle *fh, events::EventQueue &queue, uint32_t timeout, const char *output_delimiter, uint16_t send_delay = 0);
|
||||
virtual ~ATHandler();
|
||||
|
||||
~ATHandler();
|
||||
|
||||
/** Return used file handle.
|
||||
*
|
||||
|
@ -146,24 +147,6 @@ public:
|
|||
*/
|
||||
device_err_t get_last_device_error() const;
|
||||
|
||||
/** Increase reference count. Used for counting references to this instance.
|
||||
* Note that this should be used with care, if the ATHandler was taken into use
|
||||
* with get_instance()
|
||||
*/
|
||||
void inc_ref_count();
|
||||
|
||||
/** Decrease reference count. Used for counting references to this instance.
|
||||
* Note that this should be used with care, if the ATHandler was taken into use
|
||||
* with get_instance()
|
||||
*/
|
||||
void dec_ref_count();
|
||||
|
||||
/** Get the current reference count. Used for counting references to this instance.
|
||||
*
|
||||
* @return current reference count
|
||||
*/
|
||||
int get_ref_count();
|
||||
|
||||
/** Set timeout in milliseconds for AT commands
|
||||
*
|
||||
* @param timeout_milliseconds Timeout in milliseconds
|
||||
|
@ -227,56 +210,12 @@ public:
|
|||
*/
|
||||
void set_baud(int baud_rate);
|
||||
|
||||
protected:
|
||||
void event();
|
||||
#if defined AT_HANDLER_MUTEX && defined MBED_CONF_RTOS_PRESENT
|
||||
rtos::Mutex _fileHandleMutex;
|
||||
rtos::ConditionVariable _oobCv;
|
||||
#endif
|
||||
FileHandle *_fileHandle;
|
||||
private:
|
||||
/** Remove urc handler from linked list of urc's
|
||||
*
|
||||
* @param prefix Register urc prefix for callback. Urc could be for example "+CMTI: "
|
||||
*/
|
||||
void remove_urc_handler(const char *prefix);
|
||||
|
||||
void set_error(nsapi_error_t err);
|
||||
|
||||
events::EventQueue &_queue;
|
||||
nsapi_error_t _last_err;
|
||||
int _last_3gpp_error;
|
||||
device_err_t _last_at_err;
|
||||
uint16_t _oob_string_max_length;
|
||||
char *_output_delimiter;
|
||||
|
||||
struct oob_t {
|
||||
const char *prefix;
|
||||
int prefix_len;
|
||||
Callback<void()> cb;
|
||||
oob_t *next;
|
||||
};
|
||||
oob_t *_oobs;
|
||||
uint32_t _at_timeout;
|
||||
uint32_t _previous_at_timeout;
|
||||
|
||||
uint16_t _at_send_delay;
|
||||
uint64_t _last_response_stop;
|
||||
|
||||
int32_t _ref_count;
|
||||
bool _is_fh_usable;
|
||||
|
||||
static ATHandler *_atHandlers;
|
||||
|
||||
//*************************************
|
||||
public:
|
||||
|
||||
/** Starts the command writing by clearing the last error and writing the given command.
|
||||
* In case of failure when writing, the last error is set to NSAPI_ERROR_DEVICE_ERROR.
|
||||
*
|
||||
* @param cmd AT command to be written to modem
|
||||
*/
|
||||
virtual void cmd_start(const char *cmd);
|
||||
void cmd_start(const char *cmd);
|
||||
|
||||
/**
|
||||
* @brief cmd_start_stop Starts an AT command, writes given variadic arguments and stops the command. Use this
|
||||
|
@ -323,8 +262,6 @@ public:
|
|||
*/
|
||||
nsapi_error_t at_cmd_discard(const char *cmd, const char *cmd_chr, const char *format = "", ...);
|
||||
|
||||
public:
|
||||
|
||||
/** Writes integer type AT command subparameter. Starts with the delimiter if not the first param after cmd_start.
|
||||
* In case of failure when writing, the last error is set to NSAPI_ERROR_DEVICE_ERROR.
|
||||
*
|
||||
|
@ -517,64 +454,61 @@ public: // just for debugging
|
|||
*/
|
||||
static void set_debug_list(bool debug_on);
|
||||
|
||||
private:
|
||||
|
||||
// should fit any prefix and int
|
||||
char _recv_buff[BUFF_SIZE];
|
||||
// reading position
|
||||
size_t _recv_len;
|
||||
// reading length
|
||||
size_t _recv_pos;
|
||||
|
||||
// resp_type: the part of the response that doesn't include the information response (+CMD1,+CMD2..)
|
||||
// ends with OK or (CME)(CMS)ERROR
|
||||
// info_type: the information response part of the response: starts with +CMD1 and ends with CRLF
|
||||
// information response contains parameters or subsets of parameters (elements), both separated by comma
|
||||
// elem_type: subsets of parameters that are part of information response, its parameters are separated by comma
|
||||
enum ScopeType {RespType, InfoType, ElemType, NotSet};
|
||||
void set_scope(ScopeType scope_type);
|
||||
ScopeType _current_scope;
|
||||
|
||||
private: //Private structs & enums
|
||||
struct tag_t {
|
||||
char tag[7];
|
||||
size_t len;
|
||||
bool found;
|
||||
};
|
||||
|
||||
// tag to stop response scope
|
||||
tag_t _resp_stop;
|
||||
// tag to stop information response scope
|
||||
tag_t _info_stop;
|
||||
// tag to stop element scope
|
||||
tag_t _elem_stop;
|
||||
// reference to the stop tag of current scope (resp/info/elem)
|
||||
tag_t *_stop_tag;
|
||||
struct oob_t {
|
||||
const char *prefix;
|
||||
int prefix_len;
|
||||
Callback<void()> cb;
|
||||
oob_t *next;
|
||||
};
|
||||
|
||||
// delimiter between parameters and also used for delimiting elements of information response
|
||||
char _delimiter;
|
||||
// set true on prefix match -> indicates start of an information response or of an element
|
||||
bool _prefix_matched;
|
||||
// set true on urc match
|
||||
bool _urc_matched;
|
||||
// set true on (CME)(CMS)ERROR
|
||||
bool _error_found;
|
||||
// Max length of OK,(CME)(CMS)ERROR and URCs
|
||||
size_t _max_resp_length;
|
||||
// resp_type: the part of the response that doesn't include the information response (+CMD1,+CMD2..)
|
||||
// ends with OK or (CME)(CMS)ERROR
|
||||
// info_type: the information response part of the response: starts with +CMD1 and ends with CRLF
|
||||
// information response contains parameters or subsets of parameters (elements), both separated by comma
|
||||
// elem_type: subsets of parameters that are part of information response, its parameters are separated by comma
|
||||
enum ScopeType {
|
||||
RespType,
|
||||
InfoType,
|
||||
ElemType,
|
||||
NotSet
|
||||
};
|
||||
|
||||
// prefix set during resp_start and used to try matching possible information responses
|
||||
char _info_resp_prefix[BUFF_SIZE];
|
||||
bool _debug_on;
|
||||
bool _cmd_start;
|
||||
bool _use_delimiter;
|
||||
private: //Private functions
|
||||
void event();
|
||||
|
||||
// time when a command or an URC processing was started
|
||||
uint64_t _start_time;
|
||||
// eventqueue event id
|
||||
int _event_id;
|
||||
/** Increase reference count. Used for counting references to this instance.
|
||||
* Note that this should be used with care, if the ATHandler was taken into use
|
||||
* with get_instance()
|
||||
*/
|
||||
void inc_ref_count();
|
||||
|
||||
char _cmd_buffer[BUFF_SIZE];
|
||||
/** Decrease reference count. Used for counting references to this instance.
|
||||
* Note that this should be used with care, if the ATHandler was taken into use
|
||||
* with get_instance()
|
||||
*/
|
||||
void dec_ref_count();
|
||||
|
||||
/** Get the current reference count. Used for counting references to this instance.
|
||||
*
|
||||
* @return current reference count
|
||||
*/
|
||||
int get_ref_count();
|
||||
|
||||
/** Remove urc handler from linked list of urc's
|
||||
*
|
||||
* @param prefix Register urc prefix for callback. Urc could be for example "+CMTI: "
|
||||
*/
|
||||
void remove_urc_handler(const char *prefix);
|
||||
|
||||
void set_error(nsapi_error_t err);
|
||||
|
||||
private:
|
||||
//Handles the arguments from given variadic list
|
||||
void handle_args(const char *format, std::va_list list);
|
||||
|
||||
|
@ -584,7 +518,6 @@ private:
|
|||
//Checks that ATHandler does not have a pending error condition and filehandle is usable
|
||||
bool ok_to_proceed();
|
||||
|
||||
private:
|
||||
// Gets char from receiving buffer.
|
||||
// Resets and fills the buffer if all are already read (receiving position equals receiving length).
|
||||
// Returns a next char or -1 on failure (also sets error flag)
|
||||
|
@ -619,6 +552,7 @@ private:
|
|||
// Checks if receiving buffer contains OK, ERROR, URC or given prefix.
|
||||
void resp(const char *prefix, bool check_urc);
|
||||
|
||||
void set_scope(ScopeType scope_type);
|
||||
|
||||
ScopeType get_scope();
|
||||
|
||||
|
@ -659,7 +593,77 @@ private:
|
|||
AT_RX,
|
||||
AT_TX
|
||||
};
|
||||
|
||||
void debug_print(const char *p, int len, ATType type);
|
||||
|
||||
private: //Member variables
|
||||
|
||||
#if defined AT_HANDLER_MUTEX && defined MBED_CONF_RTOS_PRESENT
|
||||
rtos::Mutex _fileHandleMutex;
|
||||
rtos::ConditionVariable _oobCv;
|
||||
#endif
|
||||
FileHandle *_fileHandle;
|
||||
|
||||
events::EventQueue &_queue;
|
||||
nsapi_error_t _last_err;
|
||||
int _last_3gpp_error;
|
||||
device_err_t _last_at_err;
|
||||
uint16_t _oob_string_max_length;
|
||||
char *_output_delimiter;
|
||||
|
||||
oob_t *_oobs;
|
||||
uint32_t _at_timeout;
|
||||
uint32_t _previous_at_timeout;
|
||||
|
||||
uint16_t _at_send_delay;
|
||||
uint64_t _last_response_stop;
|
||||
|
||||
int32_t _ref_count;
|
||||
bool _is_fh_usable;
|
||||
|
||||
static ATHandler *_atHandlers;
|
||||
|
||||
// should fit any prefix and int
|
||||
char _recv_buff[BUFF_SIZE];
|
||||
// reading position
|
||||
size_t _recv_len;
|
||||
// reading length
|
||||
size_t _recv_pos;
|
||||
|
||||
ScopeType _current_scope;
|
||||
|
||||
// tag to stop response scope
|
||||
tag_t _resp_stop;
|
||||
// tag to stop information response scope
|
||||
tag_t _info_stop;
|
||||
// tag to stop element scope
|
||||
tag_t _elem_stop;
|
||||
// reference to the stop tag of current scope (resp/info/elem)
|
||||
tag_t *_stop_tag;
|
||||
|
||||
// delimiter between parameters and also used for delimiting elements of information response
|
||||
char _delimiter;
|
||||
// set true on prefix match -> indicates start of an information response or of an element
|
||||
bool _prefix_matched;
|
||||
// set true on urc match
|
||||
bool _urc_matched;
|
||||
// set true on (CME)(CMS)ERROR
|
||||
bool _error_found;
|
||||
// Max length of OK,(CME)(CMS)ERROR and URCs
|
||||
size_t _max_resp_length;
|
||||
|
||||
// prefix set during resp_start and used to try matching possible information responses
|
||||
char _info_resp_prefix[BUFF_SIZE];
|
||||
bool _debug_on;
|
||||
bool _cmd_start;
|
||||
bool _use_delimiter;
|
||||
|
||||
// time when a command or an URC processing was started
|
||||
uint64_t _start_time;
|
||||
// eventqueue event id
|
||||
int _event_id;
|
||||
|
||||
char _cmd_buffer[BUFF_SIZE];
|
||||
};
|
||||
|
||||
} // namespace mbed
|
|
@ -137,17 +137,6 @@ void ATHandler::set_at_timeout_list(uint32_t timeout_milliseconds, bool default_
|
|||
singleton_unlock();
|
||||
}
|
||||
|
||||
void ATHandler::set_debug_list(bool debug_on)
|
||||
{
|
||||
ATHandler *atHandler = _atHandlers;
|
||||
singleton_lock();
|
||||
while (atHandler) {
|
||||
atHandler->set_debug(debug_on);
|
||||
atHandler = atHandler->_nextATHandler;
|
||||
}
|
||||
singleton_unlock();
|
||||
}
|
||||
|
||||
bool ATHandler::ok_to_proceed()
|
||||
{
|
||||
if (_last_err != NSAPI_ERROR_OK) {
|
||||
|
@ -211,6 +200,7 @@ ATHandler::ATHandler(FileHandle *fh, EventQueue &queue, uint32_t timeout, const
|
|||
set_file_handle(fh);
|
||||
}
|
||||
|
||||
|
||||
void ATHandler::set_debug(bool debug_on)
|
||||
{
|
||||
_debug_on = debug_on;
|
||||
|
@ -221,6 +211,17 @@ bool ATHandler::get_debug() const
|
|||
return _debug_on;
|
||||
}
|
||||
|
||||
void ATHandler::set_debug_list(bool debug_on)
|
||||
{
|
||||
ATHandler *atHandler = _atHandlers;
|
||||
singleton_lock();
|
||||
while (atHandler) {
|
||||
atHandler->set_debug(debug_on);
|
||||
atHandler = atHandler->_nextATHandler;
|
||||
}
|
||||
singleton_unlock();
|
||||
}
|
||||
|
||||
ATHandler::~ATHandler()
|
||||
{
|
||||
ScopedLock <ATHandler> lock(*this);
|
Loading…
Reference in New Issue