blob: c17bbea24f74c4e482aedc3c075e4028ba59a7cf [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"
lichengzhang7715b2f2025-07-19 10:18:21 +080018#include "gsw_log_interface.h"
b.liu68a94c92025-05-24 12:53:41 +080019
20#define OUT_MAX_SIZE 1024
21#define LINE __LINE__
22#define FUNC __FUNCTION__
23#define AT_EXTERSION_SOCKET_NAME "/tmp/atcmdext"
24#define SOCKET_ZERO 0
25#define SOCKET_SUCC 1
26#define SOCKET_FAIL -1
lichengzhang7715b2f2025-07-19 10:18:21 +080027#define GSW_AT "[HAL][GSW_AT]"
28//typedef void (*mbtk_log)(int level, const char *format,...);
b.liu68a94c92025-05-24 12:53:41 +080029typedef enum
30{
31 A_SUCCESS = 0,
32 A_ERROR = -1
33}LYNQ_AT_E;
34
lichengzhang7715b2f2025-07-19 10:18:21 +080035//static mbtk_log fun_ptr_log = NULL;
lichengzhangea38e902025-06-14 11:53:03 +080036static void *dlHandle_at = NULL;
b.liu68a94c92025-05-24 12:53:41 +080037char *lynqLib_at = "/lib/libmbtk_lib.so";
38char *output = NULL;
39int sockfd = 0;
40int result = A_SUCCESS;
41char buffer_at[OUT_MAX_SIZE] = {0};
42struct sockaddr_in addr_serv;
43struct sockaddr_un addr_server;
hong.liucd370792025-05-28 06:29:19 -070044LYNQ_AT_CALLBACK tmp = NULL;
b.liu68a94c92025-05-24 12:53:41 +080045static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
46socklen_t len;
47bool connect_state = false;
48
49
50int socket_local_client (char* name) {
lichengzhang7715b2f2025-07-19 10:18:21 +080051 LOGD(GSW_AT,"[%d][%s] enter",LINE,FUNC);
b.liu68a94c92025-05-24 12:53:41 +080052 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
53 if (sockfd < 0)
54 {
lichengzhang7715b2f2025-07-19 10:18:21 +080055 LOGD(GSW_AT,"Can't open stream socket (%s)", name);
b.liu68a94c92025-05-24 12:53:41 +080056 return -1;
57 }
58 addr_server.sun_family = AF_UNIX;
59 memset(addr_server.sun_path, '\0', sizeof(addr_server.sun_path));
60 strncpy(addr_server.sun_path, name, sizeof(addr_server.sun_path) - 1);
61 if (connect(sockfd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
62 {
63 close(sockfd);
lichengzhang7715b2f2025-07-19 10:18:21 +080064 LOGD(GSW_AT,"Can't connect to server side, path: %s, %s", name, strerror(errno));
b.liu68a94c92025-05-24 12:53:41 +080065 return -1;
66 }
lichengzhang7715b2f2025-07-19 10:18:21 +080067 LOGD(GSW_AT,"[%d][%s] connect %s success",LINE,FUNC,name);
b.liu68a94c92025-05-24 12:53:41 +080068 return sockfd;
69}
70bool send_msg_to_service(int fd,char *msg,int size)
71{
lichengzhang7715b2f2025-07-19 10:18:21 +080072 LOGD(GSW_AT,"[%d][%s] enter",LINE,FUNC);
b.liu68a94c92025-05-24 12:53:41 +080073 if (fd < 0)
74 {
lichengzhang7715b2f2025-07-19 10:18:21 +080075 LOGD(GSW_AT,"fd invalid when send to atci service. errno = %d", errno);
b.liu68a94c92025-05-24 12:53:41 +080076 return false;
77 }
78 if(NULL == msg)
79 {
lichengzhang7715b2f2025-07-19 10:18:21 +080080 LOGD(GSW_AT,"atcmd is null.");
b.liu68a94c92025-05-24 12:53:41 +080081 return false;
82 }
83 int sendLen = send(fd, msg, size, 0);
84 if (sendLen != size)
85 {
lichengzhang7715b2f2025-07-19 10:18:21 +080086 LOGD(GSW_AT,"lose data when send to atci service. errno = %d", errno);
b.liu68a94c92025-05-24 12:53:41 +080087 return false;
88 }
lichengzhang7715b2f2025-07-19 10:18:21 +080089 LOGD(GSW_AT,"client send to app demo: %s", msg);
b.liu68a94c92025-05-24 12:53:41 +080090 return true;
91}
92
93int atsvc_cmd_recv(int fd, char *buf, int len)
94{
95 int ret = 0;
96 ret = recv(fd, buf, len, 0);
lichengzhang7715b2f2025-07-19 10:18:21 +080097 LOGD(GSW_AT,"[%d][%s] recv after",LINE,FUNC);
b.liu68a94c92025-05-24 12:53:41 +080098 if (ret < 0)
99 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800100 LOGD(GSW_AT,"acti_cmd_recv client select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
b.liu68a94c92025-05-24 12:53:41 +0800101 return SOCKET_FAIL;
102 }
103 else if(ret == 0)
104 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800105 LOGD(GSW_AT,"acti_cmd_recv client recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
b.liu68a94c92025-05-24 12:53:41 +0800106 return SOCKET_ZERO;
107 }
108 return SOCKET_SUCC;
109}
110/**
111 * @brief send third cmd to service and receive input,then send output to service
112 *
113 * @param parm
114 * @return void*
115 */
116void *thread_recv(void *parm)
117{
lichengzhang7715b2f2025-07-19 10:18:21 +0800118 LOGD(GSW_AT,"[%d][%s] enter",LINE,FUNC);
b.liu68a94c92025-05-24 12:53:41 +0800119 char at_cmd[100] = {0};
120 int fd = -1;
121 int ret = 0;
122 fd = socket_local_client(AT_EXTERSION_SOCKET_NAME);
123 if(fd <= 0)
124 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800125 LOGE(GSW_AT,"socket_local_client fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800126 connect_state = false;
127 pthread_mutex_unlock(&s_startupMutex);
128 return NULL;
129 }
130 int len_buf = strlen(buffer_at);
131 if(!send_msg_to_service(fd,buffer_at,len_buf))
132 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800133 LOGE(GSW_AT,"send_msg_to_service fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800134 connect_state = false;
135 pthread_mutex_unlock(&s_startupMutex);
136 return NULL;
137 }
138 connect_state = true;
139 pthread_mutex_unlock(&s_startupMutex);
140 char *input = NULL;
141 output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
142 if(NULL == output)
143 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800144 LOGE(GSW_AT,"thread_recv malloc fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800145 return NULL;
146 }
147 TryNewLink:
148 if(connect_state == false)
149 {
150 if (connect(fd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
151 {
152 close(fd);
lichengzhang7715b2f2025-07-19 10:18:21 +0800153 LOGE(GSW_AT,"Can't connect to server side, path: %s, errno:%d", AT_EXTERSION_SOCKET_NAME, errno);
b.liu68a94c92025-05-24 12:53:41 +0800154 return NULL;
155 }
156 connect_state = true;
157 }
158 while (1)
159 {
160 /*receive at cmd*/
161 memset(at_cmd, 0, sizeof(at_cmd));
162 ret = atsvc_cmd_recv(fd, at_cmd,sizeof(at_cmd));
163 if (ret < 0)
164 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800165 LOGE(GSW_AT,"[%d][%s]receive CMD error",LINE,FUNC);
b.liu68a94c92025-05-24 12:53:41 +0800166 continue;
167 }
168 else if(ret == SOCKET_ZERO)
169 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800170 LOGE(GSW_AT,"maybe client socket closed 1. retry new link!");
b.liu68a94c92025-05-24 12:53:41 +0800171 connect_state = false;
172 goto TryNewLink;
173 }
174 input = at_cmd;
175 int len = strlen(input);
176 while (len > 0 && (input[len - 1] == '\r' || input[len - 1] == '\n'))
177 {
178 input[--len] = '\0';
179 }
180 //begin deal with callback
181 tmp(input, output, OUT_MAX_SIZE);
lichengzhang7715b2f2025-07-19 10:18:21 +0800182 LOGD(GSW_AT,"lynq_reg_third_at send output to service\n");
b.liu68a94c92025-05-24 12:53:41 +0800183 if(!send_msg_to_service(fd,output, strlen(output)))
184 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800185 LOGE(GSW_AT,"thread_recv send fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800186 continue;
187 }
188 }
189 free(output);
190 output = NULL;
191 if(fd != 0)
192 {
193 close(fd);
194 }
195 return NULL;
196}
197
198/**
199 * @brief Threads are created to communicate with the server
200 *
201 * @return int
202 */
203int lynq_connect_service_start(void)
204{
lichengzhang7715b2f2025-07-19 10:18:21 +0800205 LOGD(GSW_AT,"[%d][%s] enter",LINE,FUNC);
b.liu68a94c92025-05-24 12:53:41 +0800206 pthread_t lynq_at_tid;
207 int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);
208 pthread_mutex_lock(&s_startupMutex);
lichengzhang7715b2f2025-07-19 10:18:21 +0800209 LOGD(GSW_AT,"[%d][%s] pthread mutex unlock",LINE,FUNC);
b.liu68a94c92025-05-24 12:53:41 +0800210 if((connect_state != true) && rt < 0)
211 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800212 LOGE(GSW_AT,"connect fail,rt:%d,connect state:%d\n",rt,connect_state);
b.liu68a94c92025-05-24 12:53:41 +0800213 return -1;
214 }
215 return 0;
216}
217
218/**
219 * @brief Type:[IN] send third at cmd to service
220 * @param ext_at Type:[IN] input at cmd
221 * @param callback Type:[IN]
222 * @return int
223 */
hong.liucd370792025-05-28 06:29:19 -0700224int32_t gsw_reg_atcmd(const char *atcmd,LYNQ_AT_CALLBACK func)
b.liu68a94c92025-05-24 12:53:41 +0800225{
226 if(NULL == atcmd || NULL == func)
227 {
hong.liucd370792025-05-28 06:29:19 -0700228 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800229 }
lichengzhangea38e902025-06-14 11:53:03 +0800230
b.liu68a94c92025-05-24 12:53:41 +0800231 memcpy(buffer_at, atcmd, strlen(atcmd));
232 tmp = func;
lichengzhang7715b2f2025-07-19 10:18:21 +0800233 LOGD(GSW_AT,"lynq_reg_third_at start\n");
b.liu68a94c92025-05-24 12:53:41 +0800234 int ret = lynq_connect_service_start();
235
236 if(ret != 0)
237 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800238 LOGE(GSW_AT,"lynq_connect_service_start start failed\n");
hong.liucd370792025-05-28 06:29:19 -0700239 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800240 }
lichengzhang7715b2f2025-07-19 10:18:21 +0800241 LOGD(GSW_AT,"lynq_connect_service_start success ret:%d\n",ret);
b.liu68a94c92025-05-24 12:53:41 +0800242 return GSW_HAL_SUCCESS;
243}
244
245int32_t gsw_sdk_at_init(void)
246{
lichengzhangea38e902025-06-14 11:53:03 +0800247 dlHandle_at = dlopen(lynqLib_at, RTLD_NOW);
lichengzhang7715b2f2025-07-19 10:18:21 +0800248 //fun_ptr_log = (mbtk_log)dlsym(dlHandle_at, "mbtk_log");
249 if(dlHandle_at == NULL)
lichengzhangea38e902025-06-14 11:53:03 +0800250 {
251 return GSW_HAL_NORMAL_FAIL;
252 }
b.liu68a94c92025-05-24 12:53:41 +0800253 return GSW_HAL_SUCCESS;
254}
lichengzhangb93f7862025-06-06 17:44:35 +0800255
256int gsw_get_modem_temperture(ZONE_NUM num,int *temp)
257{
lichengzhang4d12ebc2025-06-11 17:49:57 +0800258 if (num != soc_max)
lichengzhangb93f7862025-06-06 17:44:35 +0800259 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800260 LOGE(GSW_AT,"temperture if not support,num is %d\n",num);
hong.liud2417072025-06-27 07:10:37 -0700261 return GSW_HAL_SUCCESS;
lichengzhangb93f7862025-06-06 17:44:35 +0800262 }
lichengzhang4d12ebc2025-06-11 17:49:57 +0800263 if (NULL == temp)
264 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800265 LOGE(GSW_AT,"temperture is null\n");
lichengzhang4d12ebc2025-06-11 17:49:57 +0800266 return GSW_HAL_ARG_INVALID;
267 }
268
269 char *cmd = "/sys/class/thermal/thermal_zone0/temp";
270 FILE *fp = NULL;
271 char buf[128] = {0};
272 fp = fopen(cmd, "r");
273 if (fp == NULL)
274 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800275 LOGE(GSW_AT,"Unable to open file");
lichengzhang4d12ebc2025-06-11 17:49:57 +0800276 return GSW_HAL_NORMAL_FAIL;
277 }
278 if (fgets(buf, sizeof(buf), fp) == NULL)
279 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800280 LOGE(GSW_AT,"fgets fail");
lichengzhang4d12ebc2025-06-11 17:49:57 +0800281 fclose(fp);
282 return GSW_HAL_NORMAL_FAIL;
283 }
284 if (strlen(buf) == 0)
285 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800286 LOGE(GSW_AT,"read len == 0\n");
lichengzhang4d12ebc2025-06-11 17:49:57 +0800287 fclose(fp);
288 return GSW_HAL_NORMAL_FAIL;
289 }
290
291 *temp = atoi(buf) / 1000;
292 fclose(fp);
293 return GSW_HAL_SUCCESS;
lichengzhangb93f7862025-06-06 17:44:35 +0800294}