blob: 6620d25dc69fa96f346db6d51bb26cec2f13a0af [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include <sys/types.h>
2#include <sys/socket.h>
3#include <sys/un.h>
4#include <unistd.h>
5#include <arpa/inet.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <signal.h>
9#include <string.h>
10#include <pthread.h>
11#include <fcntl.h>
12#include <errno.h>
13#include <stdint.h>
14#include <dlfcn.h>
15#include <stdbool.h>
hong.liucd370792025-05-28 06:29:19 -070016#include "gsw_at_interface.h"
hong.liud2417072025-06-27 07:10:37 -070017#include "gsw_hal_errcode.h"
18
b.liu68a94c92025-05-24 12:53:41 +080019#ifndef LOG_ERR_LEVEL
20#define LOG_ERR_LEVEL 3 /* error conditions */
21#endif
22#ifndef LOG_WARN_LEVEL
23#define LOG_WARN_LEVEL 4 /* warning conditions */
24#endif
25#ifndef LOG_INFO_LEVEL
26#define LOG_INFO_LEVEL 6 /* informational */
27#endif
28#ifndef LOG_DEBUG_LEVEL
29#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
30#endif
31#ifndef LOG_VERBOSE_LEVEL
32#define LOG_VERBOSE_LEVEL 8
33#endif
34
l.yang6a42e4d2025-05-28 01:04:20 -070035#define GSW_AT "[HAL][GSW_AT]"
36
b.liu68a94c92025-05-24 12:53:41 +080037#define LOGV(fmt, args ...) \
38 do{ \
39 char *file_ptr_1001 = __FILE__; \
40 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
41 char line_1001[10] = {0}; \
42 sprintf(line_1001, "%d", __LINE__); \
43 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
44 if(*ptr_1001 == '/') \
45 break; \
46 ptr_1001--; \
47 } \
l.yang6a42e4d2025-05-28 01:04:20 -070048 fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080049 } while(0)
50
51#define LOGI(fmt, args...) \
52 do{ \
53 char *file_ptr_1001 = __FILE__; \
54 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
55 char line_1001[10] = {0}; \
56 sprintf(line_1001, "%d", __LINE__); \
57 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
58 if(*ptr_1001 == '/') \
59 break; \
60 ptr_1001--; \
61 } \
l.yang6a42e4d2025-05-28 01:04:20 -070062 fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080063 } while(0)
64
65#define LOGD(fmt, args...) \
66 do{ \
67 char *file_ptr_1001 = __FILE__; \
68 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
69 char line_1001[10] = {0}; \
70 sprintf(line_1001, "%d", __LINE__); \
71 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
72 if(*ptr_1001 == '/') \
73 break; \
74 ptr_1001--; \
75 } \
l.yang6a42e4d2025-05-28 01:04:20 -070076 fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080077 } while(0)
78
79#define LOGW(fmt, args...) \
80 do{ \
81 char *file_ptr_1001 = __FILE__; \
82 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
83 char line_1001[10] = {0}; \
84 sprintf(line_1001, "%d", __LINE__); \
85 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
86 if(*ptr_1001 == '/') \
87 break; \
88 ptr_1001--; \
89 } \
l.yang6a42e4d2025-05-28 01:04:20 -070090 fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080091 } while(0)
92
93#define LOGE(fmt, args...) \
94 do{ \
95 char *file_ptr_1001 = __FILE__; \
96 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
97 char line_1001[10] = {0}; \
98 sprintf(line_1001, "%d", __LINE__); \
99 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
100 if(*ptr_1001 == '/') \
101 break; \
102 ptr_1001--; \
103 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700104 fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800105 } while(0)
b.liu68a94c92025-05-24 12:53:41 +0800106
107#define OUT_MAX_SIZE 1024
108#define LINE __LINE__
109#define FUNC __FUNCTION__
110#define AT_EXTERSION_SOCKET_NAME "/tmp/atcmdext"
111#define SOCKET_ZERO 0
112#define SOCKET_SUCC 1
113#define SOCKET_FAIL -1
114
115typedef void (*mbtk_log)(int level, const char *format,...);
116typedef enum
117{
118 A_SUCCESS = 0,
119 A_ERROR = -1
120}LYNQ_AT_E;
121
122static mbtk_log fun_ptr_log = NULL;
lichengzhangea38e902025-06-14 11:53:03 +0800123static void *dlHandle_at = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800124char *lynqLib_at = "/lib/libmbtk_lib.so";
125char *output = NULL;
126int sockfd = 0;
127int result = A_SUCCESS;
128char buffer_at[OUT_MAX_SIZE] = {0};
129struct sockaddr_in addr_serv;
130struct sockaddr_un addr_server;
hong.liucd370792025-05-28 06:29:19 -0700131LYNQ_AT_CALLBACK tmp = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800132static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
133socklen_t len;
134bool connect_state = false;
135
136
137int socket_local_client (char* name) {
138 LOGD("[%d][%s] enter",LINE,FUNC);
139 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
140 if (sockfd < 0)
141 {
142 LOGD("Can't open stream socket (%s)", name);
143 return -1;
144 }
145 addr_server.sun_family = AF_UNIX;
146 memset(addr_server.sun_path, '\0', sizeof(addr_server.sun_path));
147 strncpy(addr_server.sun_path, name, sizeof(addr_server.sun_path) - 1);
148 if (connect(sockfd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
149 {
150 close(sockfd);
151 LOGD("Can't connect to server side, path: %s, %s", name, strerror(errno));
152 return -1;
153 }
154 LOGD("[%d][%s] connect %s success",LINE,FUNC,name);
155 return sockfd;
156}
157bool send_msg_to_service(int fd,char *msg,int size)
158{
159 LOGD("[%d][%s] enter",LINE,FUNC);
160 if (fd < 0)
161 {
162 LOGD("fd invalid when send to atci service. errno = %d", errno);
163 return false;
164 }
165 if(NULL == msg)
166 {
167 LOGD("atcmd is null.");
168 return false;
169 }
170 int sendLen = send(fd, msg, size, 0);
171 if (sendLen != size)
172 {
173 LOGD("lose data when send to atci service. errno = %d", errno);
174 return false;
175 }
176 LOGD("client send to app demo: %s", msg);
177 return true;
178}
179
180int atsvc_cmd_recv(int fd, char *buf, int len)
181{
182 int ret = 0;
183 ret = recv(fd, buf, len, 0);
184 LOGD("[%d][%s] recv after",LINE,FUNC);
185 if (ret < 0)
186 {
187 LOGD("acti_cmd_recv client select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
188 return SOCKET_FAIL;
189 }
190 else if(ret == 0)
191 {
192 LOGD("acti_cmd_recv client recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
193 return SOCKET_ZERO;
194 }
195 return SOCKET_SUCC;
196}
197/**
198 * @brief send third cmd to service and receive input,then send output to service
199 *
200 * @param parm
201 * @return void*
202 */
203void *thread_recv(void *parm)
204{
205 LOGD("[%d][%s] enter",LINE,FUNC);
206 char at_cmd[100] = {0};
207 int fd = -1;
208 int ret = 0;
209 fd = socket_local_client(AT_EXTERSION_SOCKET_NAME);
210 if(fd <= 0)
211 {
212 LOGE("socket_local_client fail\n");
213 connect_state = false;
214 pthread_mutex_unlock(&s_startupMutex);
215 return NULL;
216 }
217 int len_buf = strlen(buffer_at);
218 if(!send_msg_to_service(fd,buffer_at,len_buf))
219 {
220 LOGE("send_msg_to_service fail\n");
221 connect_state = false;
222 pthread_mutex_unlock(&s_startupMutex);
223 return NULL;
224 }
225 connect_state = true;
226 pthread_mutex_unlock(&s_startupMutex);
227 char *input = NULL;
228 output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
229 if(NULL == output)
230 {
231 LOGE("thread_recv malloc fail\n");
232 return NULL;
233 }
234 TryNewLink:
235 if(connect_state == false)
236 {
237 if (connect(fd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
238 {
239 close(fd);
240 LOGE("Can't connect to server side, path: %s, errno:%d", AT_EXTERSION_SOCKET_NAME, errno);
241 return NULL;
242 }
243 connect_state = true;
244 }
245 while (1)
246 {
247 /*receive at cmd*/
248 memset(at_cmd, 0, sizeof(at_cmd));
249 ret = atsvc_cmd_recv(fd, at_cmd,sizeof(at_cmd));
250 if (ret < 0)
251 {
252 LOGE("[%d][%s]receive CMD error",LINE,FUNC);
253 continue;
254 }
255 else if(ret == SOCKET_ZERO)
256 {
257 LOGE("maybe client socket closed 1. retry new link!");
258 connect_state = false;
259 goto TryNewLink;
260 }
261 input = at_cmd;
262 int len = strlen(input);
263 while (len > 0 && (input[len - 1] == '\r' || input[len - 1] == '\n'))
264 {
265 input[--len] = '\0';
266 }
267 //begin deal with callback
268 tmp(input, output, OUT_MAX_SIZE);
269 LOGD("lynq_reg_third_at send output to service\n");
270 if(!send_msg_to_service(fd,output, strlen(output)))
271 {
272 LOGE("thread_recv send fail\n");
273 continue;
274 }
275 }
276 free(output);
277 output = NULL;
278 if(fd != 0)
279 {
280 close(fd);
281 }
282 return NULL;
283}
284
285/**
286 * @brief Threads are created to communicate with the server
287 *
288 * @return int
289 */
290int lynq_connect_service_start(void)
291{
292 LOGD("[%d][%s] enter",LINE,FUNC);
293 pthread_t lynq_at_tid;
294 int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);
295 pthread_mutex_lock(&s_startupMutex);
296 LOGD("[%d][%s] pthread mutex unlock",LINE,FUNC);
297 if((connect_state != true) && rt < 0)
298 {
299 LOGE("connect fail,rt:%d,connect state:%d\n",rt,connect_state);
300 return -1;
301 }
302 return 0;
303}
304
305/**
306 * @brief Type:[IN] send third at cmd to service
307 * @param ext_at Type:[IN] input at cmd
308 * @param callback Type:[IN]
309 * @return int
310 */
hong.liucd370792025-05-28 06:29:19 -0700311int32_t gsw_reg_atcmd(const char *atcmd,LYNQ_AT_CALLBACK func)
b.liu68a94c92025-05-24 12:53:41 +0800312{
313 if(NULL == atcmd || NULL == func)
314 {
hong.liucd370792025-05-28 06:29:19 -0700315 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800316 }
lichengzhangea38e902025-06-14 11:53:03 +0800317
b.liu68a94c92025-05-24 12:53:41 +0800318 memcpy(buffer_at, atcmd, strlen(atcmd));
319 tmp = func;
320 LOGD("lynq_reg_third_at start\n");
321 int ret = lynq_connect_service_start();
322
323 if(ret != 0)
324 {
325 LOGE("lynq_connect_service_start start failed\n");
hong.liucd370792025-05-28 06:29:19 -0700326 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800327 }
328 LOGD("lynq_connect_service_start success ret:%d\n",ret);
329 return GSW_HAL_SUCCESS;
330}
331
332int32_t gsw_sdk_at_init(void)
333{
lichengzhangea38e902025-06-14 11:53:03 +0800334 dlHandle_at = dlopen(lynqLib_at, RTLD_NOW);
335 fun_ptr_log = (mbtk_log)dlsym(dlHandle_at, "mbtk_log");
336 if(fun_ptr_log == NULL || dlHandle_at == NULL)
337 {
338 return GSW_HAL_NORMAL_FAIL;
339 }
b.liu68a94c92025-05-24 12:53:41 +0800340 return GSW_HAL_SUCCESS;
341}
lichengzhangb93f7862025-06-06 17:44:35 +0800342
343int gsw_get_modem_temperture(ZONE_NUM num,int *temp)
344{
lichengzhang4d12ebc2025-06-11 17:49:57 +0800345 if (num != soc_max)
lichengzhangb93f7862025-06-06 17:44:35 +0800346 {
lichengzhang4d12ebc2025-06-11 17:49:57 +0800347 LOGE("temperture if not support,num is %d\n",num);
hong.liud2417072025-06-27 07:10:37 -0700348 return GSW_HAL_SUCCESS;
lichengzhangb93f7862025-06-06 17:44:35 +0800349 }
lichengzhang4d12ebc2025-06-11 17:49:57 +0800350 if (NULL == temp)
351 {
352 LOGE("temperture is null\n");
353 return GSW_HAL_ARG_INVALID;
354 }
355
356 char *cmd = "/sys/class/thermal/thermal_zone0/temp";
357 FILE *fp = NULL;
358 char buf[128] = {0};
359 fp = fopen(cmd, "r");
360 if (fp == NULL)
361 {
362 LOGE("Unable to open file");
363 return GSW_HAL_NORMAL_FAIL;
364 }
365 if (fgets(buf, sizeof(buf), fp) == NULL)
366 {
367 LOGE("fgets fail");
368 fclose(fp);
369 return GSW_HAL_NORMAL_FAIL;
370 }
371 if (strlen(buf) == 0)
372 {
373 LOGE("read len == 0\n");
374 fclose(fp);
375 return GSW_HAL_NORMAL_FAIL;
376 }
377
378 *temp = atoi(buf) / 1000;
379 fclose(fp);
380 return GSW_HAL_SUCCESS;
lichengzhangb93f7862025-06-06 17:44:35 +0800381}