1 /* //device/system/reference-ril/atchannel.h
2 **
3 ** Copyright 2006, The Android Open Source Project
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 ATCHANNEL_H
19 #define ATCHANNEL_H 1
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /* define AT_DEBUG to send AT traffic to /tmp/radio-at.log" */
26 #define AT_DEBUG  0
27 
28 #if AT_DEBUG
29 extern void  AT_DUMP(const char* prefix, const char*  buff, int  len);
30 #else
31 #define  AT_DUMP(prefix,buff,len)  do{}while(0)
32 #endif
33 
34 #define AT_ERROR_GENERIC          (-1)
35 #define AT_ERROR_COMMAND_PENDING  (-2)
36 #define AT_ERROR_CHANNEL_CLOSED   (-3)
37 #define AT_ERROR_TIMEOUT          (-4)
38 #define AT_ERROR_INVALID_THREAD   (-5) /* AT commands may not be issued from
39                                           reader thread (or unsolicited response
40                                           callback */
41 #define AT_ERROR_INVALID_RESPONSE (-6) /* eg an at_send_command_singleline that
42                                           did not get back an intermediate
43                                           response */
44 
45 
46 typedef enum {
47     NO_RESULT,   /* no intermediate response expected */
48     NUMERIC,     /* a single intermediate response starting with a 0-9 */
49     SINGLELINE,  /* a single intermediate response starting with a prefix */
50     MULTILINE    /* multiple line intermediate response
51                     starting with a prefix */
52 } ATCommandType;
53 
54 /** a singly-lined list of intermediate responses */
55 typedef struct ATLine  {
56     struct ATLine *p_next;
57     char *line;
58 } ATLine;
59 
60 /** Free this with at_response_free() */
61 typedef struct {
62     int success;              /* true if final response indicates
63                                     success (eg "OK") */
64     char *finalResponse;      /* eg OK, ERROR */
65     ATLine  *p_intermediates; /* any intermediate responses */
66 } ATResponse;
67 
68 /**
69  * a user-provided unsolicited response handler function
70  * this will be called from the reader thread, so do not block
71  * "s" is the line, and "sms_pdu" is either NULL or the PDU response
72  * for multi-line TS 27.005 SMS PDU responses (eg +CMT:)
73  */
74 typedef void (*ATUnsolHandler)(const char *s, const char *sms_pdu);
75 
76 int at_open(int fd, ATUnsolHandler h);
77 void at_close();
78 
79 /* This callback is invoked on the command thread.
80    You should reset or handshake here to avoid getting out of sync */
81 void at_set_on_timeout(void (*onTimeout)(void));
82 /* This callback is invoked on the reader thread (like ATUnsolHandler)
83    when the input stream closes before you call at_close
84    (not when you call at_close())
85    You should still call at_close()
86    It may also be invoked immediately from the current thread if the read
87    channel is already closed */
88 void at_set_on_reader_closed(void (*onClose)(void));
89 
90 int at_send_command_singleline (const char *command,
91                                 const char *responsePrefix,
92                                  ATResponse **pp_outResponse);
93 
94 int at_send_command_numeric (const char *command,
95                                  ATResponse **pp_outResponse);
96 
97 int at_send_command_multiline (const char *command,
98                                 const char *responsePrefix,
99                                  ATResponse **pp_outResponse);
100 
101 
102 int at_handshake();
103 
104 int at_send_command (const char *command, ATResponse **pp_outResponse);
105 
106 int at_send_command_sms (const char *command, const char *pdu,
107                             const char *responsePrefix,
108                             ATResponse **pp_outResponse);
109 
110 void at_response_free(ATResponse *p_response);
111 
112 typedef enum {
113     CME_ERROR_NON_CME = -1,
114     CME_SUCCESS = 0,
115     CME_SIM_NOT_INSERTED = 10
116 } AT_CME_Error;
117 
118 AT_CME_Error at_get_cme_error(const ATResponse *p_response);
119 
120 #ifdef __cplusplus
121 }
122 #endif
123 
124 #endif /*ATCHANNEL_H*/
125