Mistake on this page?
Report an issue in GitHub or email us
ATHandler.h
1 /*
2  * Copyright (c) 2017, Arm Limited and affiliates.
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef AT_HANDLER_H_
19 #define AT_HANDLER_H_
20 
21 #include "platform/mbed_retarget.h"
22 
23 #include "events/EventQueue.h"
24 #include "nsapi_types.h"
25 
26 #include "Callback.h"
27 
28 #include <cstdarg>
29 
30 /**
31  * If application calls associated FileHandle only from single thread context
32  * then locking between AT command and response is not needed. However,
33  * note that many cellular functions are called indirectly, for example with the socket API.
34  * If you are unsure, then AT_HANDLER_MUTEX must be defined.
35  */
36 #define AT_HANDLER_MUTEX
37 
38 #if defined AT_HANDLER_MUTEX && defined MBED_CONF_RTOS_PRESENT
39 #include "ConditionVariable.h"
40 #endif
41 
42 namespace mbed {
43 
44 class FileHandle;
45 
46 extern const char *OK;
47 extern const char *CRLF;
48 
49 #define BUFF_SIZE 32
50 
51 /* AT Error types enumeration */
52 enum DeviceErrorType {
53  DeviceErrorTypeNoError = 0,
54  DeviceErrorTypeError, // AT ERROR
55  DeviceErrorTypeErrorCMS, // AT ERROR CMS
56  DeviceErrorTypeErrorCME // AT ERROR CME
57 };
58 
59 /** AT response error with error code and type */
60 struct device_err_t {
61  DeviceErrorType errType;
62  int errCode;
63 };
64 
65 /// Class for sending AT commands and parsing AT responses.
66 class ATHandler {
67 
68 public:
69  /** Constructor
70  *
71  * @param fh file handle used for reading AT responses and writing AT commands
72  * @param queue Event queue used to transfer sigio events to this thread
73  * @param timeout Timeout when reading for AT response
74  * @param output_delimiter delimiter used when parsing at responses, "\r" should be used as output_delimiter
75  * @param send_delay the minimum delay in ms between the end of last response and the beginning of a new command
76  */
77  ATHandler(FileHandle *fh, events::EventQueue &queue, uint32_t timeout, const char *output_delimiter, uint16_t send_delay = 0);
78  virtual ~ATHandler();
79 
80  /** Return used file handle.
81  *
82  * @return used file handle
83  */
84  FileHandle *get_file_handle();
85 
86  /** Get a new ATHandler instance, and update the linked list. Once the use of the ATHandler
87  * has finished, call to close() has to be made
88  *
89  * @param fileHandle filehandle used for reading AT responses and writing AT commands.
90  * If there is already an ATHandler with the same fileHandle pointer,
91  * then a pointer to that ATHandler instance will be returned with
92  * that ATHandler's queue, timeout, delimiter, send_delay and debug_on
93  * values
94  * @param queue Event queue used to transfer sigio events to this thread
95  * @param timeout Timeout when reading for AT response
96  * @param delimiter delimiter used when parsing at responses, "\r" should be used as output_delimiter
97  * @param send_delay the minimum delay in ms between the end of last response and the beginning of a new command
98  * @param debug_on Set true to enable debug traces
99  * @return NULL, if fileHandle is not set, or a pointer to an existing ATHandler, if the fileHandle is
100  * already in use. Otherwise a pointer to a new ATHandler instance is returned
101  */
102  static ATHandler *get_instance(FileHandle *fileHandle, events::EventQueue &queue, uint32_t timeout,
103  const char *delimiter, uint16_t send_delay, bool debug_on);
104 
105  /** Close and delete the current ATHandler instance, if the reference count to it is 0.
106  * Close() can be only called, if the ATHandler was opened with get_instance()
107  *
108  * @return NSAPI_ERROR_OK on success, NSAPI_ERROR_PARAMETER on failure
109  */
110  nsapi_error_t close();
111 
112  /** Locks the mutex for file handle if AT_HANDLER_MUTEX is defined.
113  */
114  void lock();
115 
116  /** Unlocks the mutex for file handle if AT_HANDLER_MUTEX is defined.
117  */
118  void unlock();
119 
120  /** Locks the mutex for file handle if AT_HANDLER_MUTEX is defined and returns the last error.
121  *
122  * @return last error that happened when parsing AT responses
123  */
124  nsapi_error_t unlock_return_error();
125 
126  /** Set callback function for URC
127  *
128  * @param prefix URC text to look for, e.g. "+CMTI:". Maximum length is BUFF_SIZE.
129  * @param callback function to call on prefix, or 0 to remove callback
130  */
131  void set_urc_handler(const char *prefix, Callback<void()> callback);
132 
133  ATHandler *_nextATHandler; // linked list
134 
135  /** returns the last error while parsing AT responses.
136  *
137  * @return last error
138  */
139  nsapi_error_t get_last_error() const;
140 
141  /** returns the last device error while parsing AT responses. Actually AT error (CME/CMS).
142  *
143  * @return last error struct device_err_t
144  */
145  device_err_t get_last_device_error() const;
146 
147  /** Increase reference count. Used for counting references to this instance.
148  * Note that this should be used with care, if the ATHandler was taken into use
149  * with get_instance()
150  */
151  void inc_ref_count();
152 
153  /** Decrease reference count. Used for counting references to this instance.
154  * Note that this should be used with care, if the ATHandler was taken into use
155  * with get_instance()
156  */
157  void dec_ref_count();
158 
159  /** Get the current reference count. Used for counting references to this instance.
160  *
161  * @return current reference count
162  */
163  int get_ref_count();
164 
165  /** Set timeout in milliseconds for AT commands
166  *
167  * @param timeout_milliseconds Timeout in milliseconds
168  * @param default_timeout Store as default timeout
169  */
170  void set_at_timeout(uint32_t timeout_milliseconds, bool default_timeout = false);
171 
172  /** Set timeout in milliseconds for all ATHandlers in the _atHandlers list
173  *
174  * @param timeout_milliseconds Timeout in milliseconds
175  * @param default_timeout Store as default timeout
176  */
177  static void set_at_timeout_list(uint32_t timeout_milliseconds, bool default_timeout = false);
178 
179  /** Restore timeout to previous timeout. Handy if there is a need to change timeout temporarily.
180  */
181  void restore_at_timeout();
182 
183  /** Clear pending error flag. By default, error is cleared only in lock().
184  */
185  void clear_error();
186 
187  /**
188  * Flushes the underlying stream
189  */
190  void flush();
191 
192  /** Tries to find oob's from the AT response. Call the urc callback if one is found.
193  */
194  void process_oob();
195 
196  /** Set file handle, which is used for reading AT responses and writing AT commands
197  *
198  * @param fh file handle used for reading AT responses and writing AT commands
199  */
200  void set_file_handle(FileHandle *fh);
201 
202  /** Set is file handle usable. Some situations like after going to data mode, file handle is not usable anymore.
203  * Any items in queue are not to be processed.
204  *
205  * @param usable true for usable filehandle
206  */
207  void set_is_filehandle_usable(bool usable);
208 
209  /** Synchronize AT command and response handling to modem.
210  *
211  * @param timeout_ms ATHandler timeout when trying to sync. Will be restored when function returns.
212  * @return true is synchronization was successful, false in case of failure
213  */
214  bool sync(int timeout_ms);
215 
216  /** Sets the delay to be applied before sending any AT command.
217  *
218  * @param send_delay the minimum delay in ms between the end of last response and the beginning of a new command
219  */
220  void set_send_delay(uint16_t send_delay);
221 
222 protected:
223  void event();
224 #if defined AT_HANDLER_MUTEX && defined MBED_CONF_RTOS_PRESENT
225  rtos::Mutex _fileHandleMutex;
227 #endif
228  FileHandle *_fileHandle;
229 private:
230  /** Remove urc handler from linked list of urc's
231  *
232  * @param prefix Register urc prefix for callback. Urc could be for example "+CMTI: "
233  */
234  void remove_urc_handler(const char *prefix);
235 
236  void set_error(nsapi_error_t err);
237 
238  events::EventQueue &_queue;
239  nsapi_error_t _last_err;
240  int _last_3gpp_error;
241  device_err_t _last_at_err;
242  uint16_t _oob_string_max_length;
243  char *_output_delimiter;
244 
245  struct oob_t {
246  const char *prefix;
247  int prefix_len;
248  Callback<void()> cb;
249  oob_t *next;
250  };
251  oob_t *_oobs;
252  uint32_t _at_timeout;
253  uint32_t _previous_at_timeout;
254 
255  uint16_t _at_send_delay;
256  uint64_t _last_response_stop;
257 
258  int32_t _ref_count;
259  bool _is_fh_usable;
260 
261  static ATHandler *_atHandlers;
262 
263  //*************************************
264 public:
265 
266  /** Starts the command writing by clearing the last error and writing the given command.
267  * In case of failure when writing, the last error is set to NSAPI_ERROR_DEVICE_ERROR.
268  *
269  * @param cmd AT command to be written to modem
270  */
271  virtual void cmd_start(const char *cmd);
272 
273  /**
274  * @brief cmd_start_stop Starts an AT command, writes given variadic arguments and stops the command. Use this
275  * command when you need multiple response parameters to be handled.
276  * NOTE: Does not lock ATHandler for process!
277  *
278  * @param cmd AT command in form +<CMD> (will be used also in response reading, no extra chars allowed)
279  * @param cmd_chr Char to be added to specific AT command: '?', '=' or ''. Will be used as such so '=1' is valid as well.
280  * @param format Format string for variadic arguments to be added to AT command; No separator needed.
281  * Use %d for integer, %s for string and %b for byte string (requires 2 arguments: string and length)
282  */
283  void cmd_start_stop(const char *cmd, const char *cmd_chr, const char *format = "", ...);
284 
285  /**
286  * @brief at_cmd_str Send an AT command and read a single string response. Locks and unlocks ATHandler for operation
287  * @param cmd AT command in form +<CMD> (will be used also in response reading, no extra chars allowed)
288  * @param cmd_chr Char to be added to specific AT command: '?', '=' or ''. Will be used as such so '=1' is valid as well.
289  * @param resp_buf Response buffer
290  * @param resp_buf_size Response buffer size
291  * @param format Format string for variadic arguments to be added to AT command; No separator needed.
292  * Use %d for integer, %s for string and %b for byte string (requires 2 arguments: string and length)
293  * @return last error that happened when parsing AT responses
294  */
295  nsapi_error_t at_cmd_str(const char *cmd, const char *cmd_chr, char *resp_buf, size_t resp_buf_size, const char *format = "", ...);
296 
297  /**
298  * @brief at_cmd_int Send an AT command and read a single integer response. Locks and unlocks ATHandler for operation
299  * @param cmd AT command in form +<CMD> (will be used also in response reading, no extra chars allowed)
300  * @param cmd_chr Char to be added to specific AT command: '?', '=' or ''. Will be used as such so '=1' is valid as well.
301  * @param resp Integer to hold response
302  * @param format Format string for variadic arguments to be added to AT command; No separator needed.
303  * Use %d for integer, %s for string and %b for byte string (requires 2 arguments: string and length)
304  * @return last error that happened when parsing AT responses
305  */
306  nsapi_error_t at_cmd_int(const char *cmd, const char *cmd_chr, int &resp, const char *format = "", ...);
307 
308  /**
309  * @brief at_cmd_discard Send an AT command and read and discard a response. Locks and unlocks ATHandler for operation
310  * @param cmd AT command in form +<CMD> (will be used also in response reading, no extra chars allowed)
311  * @param cmd_chr Char to be added to specific AT command: '?', '=' or ''. Will be used as such so '=1' is valid as well.
312  * @param format Format string for variadic arguments to be added to AT command; No separator needed.
313  * Use %d for integer, %s for string and %b for byte string (requires 2 arguments: string and length)
314  * @return last error that happened when parsing AT responses
315  */
316  nsapi_error_t at_cmd_discard(const char *cmd, const char *cmd_chr, const char *format = "", ...);
317 
318 public:
319 
320  /** Writes integer type AT command subparameter. Starts with the delimiter if not the first param after cmd_start.
321  * In case of failure when writing, the last error is set to NSAPI_ERROR_DEVICE_ERROR.
322  *
323  * @param param int to be written to modem as AT command subparameter
324  */
325  void write_int(int32_t param);
326 
327  /** Writes string type AT command subparamater. Quotes are added to surround the given string.
328  * Starts with the delimiter if not the first param after cmd_start.
329  * In case of failure when writing, the last error is set to NSAPI_ERROR_DEVICE_ERROR.
330  *
331  * @param param string to be written to modem as AT command subparameter
332  * @param useQuotations flag indicating whether the string should be included in quotation marks
333  */
334  void write_string(const char *param, bool useQuotations = true);
335 
336  /** Stops the AT command by writing command-line terminator CR to mark command as finished.
337  */
338  void cmd_stop();
339 
340  /** Stops the AT command by writing command-line terminator CR to mark command as finished and reads the OK/ERROR response.
341  *
342  */
343  void cmd_stop_read_resp();
344 
345  /** Write bytes without any subparameter delimiters, such as comma.
346  * In case of failure when writing, the last error is set to NSAPI_ERROR_DEVICE_ERROR.
347  *
348  * @param data bytes to be written to modem
349  * @param len length of data string
350  *
351  * @return number of characters successfully written
352  */
353  size_t write_bytes(const uint8_t *data, size_t len);
354 
355  /** Sets the stop tag for the current scope (response/information response/element)
356  * Parameter's reading routines will stop the reading when such tag is found and will set the found flag.
357  * Consume routines will read everything until such tag is found.
358  *
359  * @param stop_tag_seq string to be set as stop tag
360  */
361  void set_stop_tag(const char *stop_tag_seq);
362 
363  /** Sets the delimiter between parameters or between elements of the information response.
364  * Parameter's reading routines will stop when such char is read.
365  *
366  * @param delimiter char to be set as _delimiter
367  */
368  void set_delimiter(char delimiter);
369 
370  /** Sets the delimiter to default value defined by DEFAULT_DELIMITER.
371  */
372  void set_default_delimiter();
373 
374  /** Defines behaviour for using or ignoring the delimiter within an AT command
375  *
376  * @param use_delimiter indicating if delimiter should be used or not
377  */
378  void use_delimiter(bool use_delimiter);
379 
380  /** Consumes the reading buffer up to the delimiter or stop_tag
381  *
382  * @param count number of parameters to be skipped
383  */
384  void skip_param(uint32_t count = 1);
385 
386  /** Consumes the given length from the reading buffer
387  *
388  * @param len length to be consumed from reading buffer
389  * @param count number of parameters to be skipped
390  */
391  void skip_param(ssize_t len, uint32_t count);
392 
393  /** Reads given number of bytes from receiving buffer without checking any subparameter delimiters, such as comma.
394  *
395  * @param buf output buffer for the read
396  * @param len maximum number of bytes to read
397  * @return number of successfully read bytes or -1 in case of error
398  */
399  ssize_t read_bytes(uint8_t *buf, size_t len);
400 
401  /** Reads chars from reading buffer. Terminates with null. Skips the quotation marks.
402  * Stops on delimiter or stop tag.
403  *
404  * @param str output buffer for the read
405  * @param size maximum number of chars to output including NULL
406  * @param read_even_stop_tag if true then try to read even if the stop tag was found previously
407  * @return length of output string or -1 in case of read timeout before delimiter or stop tag is found
408  */
409  ssize_t read_string(char *str, size_t size, bool read_even_stop_tag = false);
410 
411  /** Reads chars representing hex ascii values and converts them to the corresponding chars.
412  * For example: "4156" to "AV".
413  * Terminates with null. Skips the quotation marks.
414  * Stops on delimiter or stop tag.
415  *
416  * @param str output buffer for the read
417  * @param size maximum number of chars to output
418  * @return length of output string or -1 in case of read timeout before delimiter or stop tag is found
419  */
420  ssize_t read_hex_string(char *str, size_t size);
421 
422  /** Converts contained chars to their hex ascii value and writes the resulting string to the file handle
423  * For example: "AV" to "4156".
424  *
425  * @param str input buffer to be converted to hex ascii
426  * @param size of the input param str
427  */
428  void write_hex_string(char *str, size_t size);
429 
430  /** Reads as string and converts result to integer. Supports only non-negative integers.
431  *
432  * @return the non-negative integer or -1 in case of error.
433  */
434  int32_t read_int();
435 
436  /** This looks for necessary matches: prefix, OK, ERROR, URCs and sets the correct scope.
437  *
438  * @param prefix string to be matched from receiving buffer. If not NULL and match succeeds, then scope
439  * will be set as information response(info_type)
440  * @param stop flag to indicate if we go to information response scope or not.
441  * (needed when nothing is expected to be received anymore after the prefix match:
442  * sms case: "> ", bc95 reboot case)
443  */
444  void resp_start(const char *prefix = NULL, bool stop = false);
445 
446  /** Ends all scopes starting from current scope.
447  * Consumes everything until the scope's stop tag is found, then
448  * goes to next scope until response scope is ending.
449  * URC match is checked during response scope ending,
450  * for every new line / CRLF.
451  *
452  *
453  * Possible sequence:
454  * element scope -> information response scope -> response scope
455  */
456  void resp_stop();
457 
458  /** Looks for matching the prefix given to resp_start() call.
459  * If needed, it ends the scope of a previous information response.
460  * Sets the information response scope if new prefix is found and response scope if prefix is not found.
461  *
462  * @return true if prefix defined for information response is not empty string and is found,
463  * false otherwise.
464  */
465  bool info_resp();
466 
467  /** Looks for matching the start tag.
468  * If needed, it ends the scope of a previous element.
469  * Sets the element scope if start tag is found and information response scope if start tag is not found.
470  *
471  * @param start_tag tag to be matched to begin parsing an element of an information response
472  * @return true if new element is found, false otherwise
473  */
474  bool info_elem(char start_tag);
475 
476  /** Consumes the received content until current stop tag is found.
477  *
478  * @return true if stop tag is found, false otherwise
479  */
480  bool consume_to_stop_tag();
481 
482  /** Return the last 3GPP error code.
483  * @return last 3GPP error code
484  */
485  int get_3gpp_error();
486 
487 public: // just for debugging
488  /**
489  * AT debugging, when enabled will print all data read and written,
490  * non-printable chars are printed as "[%d]".
491  *
492  * AT debug can be enabled at compile time using MBED_CONF_CELLULAR_DEBUG_AT flag or at runtime
493  * calling set_debug(). Note that MBED_CONF_MBED_TRACE_ENABLE must also be enabled.
494  *
495  * @param debug_on Enable/disable debugging
496  */
497  void set_debug(bool debug_on);
498 
499  /**
500  * Get degug state set by @ref set_debug
501  *
502  * @return current state of debug
503  */
504  bool get_debug() const;
505 
506  /** Set debug_on for all ATHandlers in the _atHandlers list
507  *
508  * @param debug_on Set true to enable debug traces
509  */
510  static void set_debug_list(bool debug_on);
511 
512 private:
513 
514  // should fit any prefix and int
515  char _recv_buff[BUFF_SIZE];
516  // reading position
517  size_t _recv_len;
518  // reading length
519  size_t _recv_pos;
520 
521  // resp_type: the part of the response that doesn't include the information response (+CMD1,+CMD2..)
522  // ends with OK or (CME)(CMS)ERROR
523  // info_type: the information response part of the response: starts with +CMD1 and ends with CRLF
524  // information response contains parameters or subsets of parameters (elements), both separated by comma
525  // elem_type: subsets of parameters that are part of information response, its parameters are separated by comma
526  enum ScopeType {RespType, InfoType, ElemType, NotSet};
527  void set_scope(ScopeType scope_type);
528  ScopeType _current_scope;
529 
530  struct tag_t {
531  char tag[7];
532  size_t len;
533  bool found;
534  };
535 
536  // tag to stop response scope
537  tag_t _resp_stop;
538  // tag to stop information response scope
539  tag_t _info_stop;
540  // tag to stop element scope
541  tag_t _elem_stop;
542  // reference to the stop tag of current scope (resp/info/elem)
543  tag_t *_stop_tag;
544 
545  // delimiter between parameters and also used for delimiting elements of information response
546  char _delimiter;
547  // set true on prefix match -> indicates start of an information response or of an element
548  bool _prefix_matched;
549  // set true on urc match
550  bool _urc_matched;
551  // set true on (CME)(CMS)ERROR
552  bool _error_found;
553  // Max length of OK,(CME)(CMS)ERROR and URCs
554  size_t _max_resp_length;
555 
556  // prefix set during resp_start and used to try matching possible information responses
557  char _info_resp_prefix[BUFF_SIZE];
558  bool _debug_on;
559  bool _cmd_start;
560  bool _use_delimiter;
561 
562  // time when a command or an URC processing was started
563  uint64_t _start_time;
564  // eventqueue event id
565  int _event_id;
566 
567  char _cmd_buffer[BUFF_SIZE];
568 
569 private:
570  //Handles the arguments from given variadic list
571  void handle_args(const char *format, std::va_list list);
572 
573  //Starts an AT command based on given parameters
574  void handle_start(const char *cmd, const char *cmd_chr);
575 
576  //Checks that ATHandler does not have a pending error condition and filehandle is usable
577  bool ok_to_proceed();
578 
579 private:
580  // Gets char from receiving buffer.
581  // Resets and fills the buffer if all are already read (receiving position equals receiving length).
582  // Returns a next char or -1 on failure (also sets error flag)
583  int get_char();
584  // Sets to 0 the reading position, reading length and the whole buffer content.
585  void reset_buffer();
586  // Reading position set to 0 and buffer's unread content moved to beginning
587  void rewind_buffer();
588  // Calculate remaining time for polling based on request start time and AT timeout.
589  // Returns 0 or time in ms for polling.
590  int poll_timeout(bool wait_for_timeout = true);
591  // Reads from serial to receiving buffer.
592  // Returns true on successful read OR false on timeout.
593  bool fill_buffer(bool wait_for_timeout = true);
594 
595  void set_tag(tag_t *tag_dest, const char *tag_seq);
596 
597  // Rewinds the receiving buffer and compares it against given str.
598  bool match(const char *str, size_t size);
599  // Iterates URCs and checks if they match the receiving buffer content.
600  // If URC match sets the scope to information response and after urc's cb returns
601  // finishes the information response scope(consumes to CRLF).
602  bool match_urc();
603  // Checks if any of the error strings are matching the receiving buffer content.
604  bool match_error();
605  // Checks if current char in buffer matches ch and consumes it,
606  // if no match lets the buffer unchanged.
607  bool consume_char(char ch);
608  // Consumes the received content until tag is found.
609  // Consumes the tag only if consume_tag flag is true.
610  bool consume_to_tag(const char *tag, bool consume_tag);
611  // Checks if receiving buffer contains OK, ERROR, URC or given prefix.
612  void resp(const char *prefix, bool check_urc);
613 
614 
615  ScopeType get_scope();
616 
617  // Consumes to information response stop tag which is CRLF. Sets scope to response.
618  void information_response_stop();
619  // Consumes to element stop tag. Sets scope to information response
620  void information_response_element_stop();
621 
622  // Reads the error code if expected and sets it as last error.
623  void at_error(bool error_code, DeviceErrorType error_type);
624 
625  /** Convert AT error code to 3GPP error codes
626  * @param err AT error code read from CME/CMS ERROR responses
627  * @param error_type error type (CMS/CME/ERROR)
628  */
629  void set_3gpp_error(int err, DeviceErrorType error_type);
630 
631  bool check_cmd_send();
632  size_t write(const void *data, size_t len);
633 
634  /** Finds occurrence of one char buffer inside another char buffer.
635  *
636  * @param dest destination char buffer
637  * @param dest_len length of dest
638  * @param src string to be searched for
639  * @param src_len length of string to be searched for
640  *
641  * @return pointer to first occurrence of src in dest
642  */
643  const char *mem_str(const char *dest, size_t dest_len, const char *src, size_t src_len);
644 
645  // check is urc is already added
646  bool find_urc_handler(const char *prefix);
647 
648  // print contents of a buffer to trace log
649  enum ATType {
650  AT_ERR,
651  AT_RX,
652  AT_TX
653  };
654  void debug_print(const char *p, int len, ATType type);
655 };
656 
657 } // namespace mbed
658 
659 #endif //AT_HANDLER_H_
EventQueue.
Definition: EventQueue.h:60
signed int nsapi_error_t
Type used to represent error codes.
Definition: nsapi_types.h:95
Class FileHandle.
Definition: FileHandle.h:46
The Mutex class is used to synchronize the execution of threads.
Definition: Mutex.h:68
Callback< R(ArgTs...)> callback(R(*func)(ArgTs...)=0)
Create a callback class with type inferred from the arguments.
Definition: Callback.h:709
AT response error with error code and type.
Definition: ATHandler.h:60
The ConditionVariable class is a synchronization primitive that allows threads to wait until a partic...
Callback class based on template specialization.
Definition: Callback.h:39
Class for sending AT commands and parsing AT responses.
Definition: ATHandler.h:66
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.