blob: 49be04878c12e533851391375b389fff5e4a7165 [file] [log] [blame]
wangyouqiang16aadb02024-04-12 15:47:13 +08001#if 1
2#include <stdio.h>
xf.li31aad552025-07-21 23:26:55 -07003#include <stdlib.h>
b.liu9e8584b2024-11-06 19:21:28 +08004#include <unistd.h>
wangyouqiang16aadb02024-04-12 15:47:13 +08005#include <errno.h>
6#include <pthread.h>
7//#include <string.h>
8#include <fcntl.h>
9//#include <signal.h>
b.liu9e8584b2024-11-06 19:21:28 +080010#include <cutils/properties.h>
xf.li31aad552025-07-21 23:26:55 -070011#include <stdint.h>
rx.xie1e6f1b42025-08-01 04:31:12 -070012#include <string.h>
13#include <time.h>
wangyouqiang16aadb02024-04-12 15:47:13 +080014
15#include "mbtk_log.h"
16#include "mbtk_info_api.h"
b.liu9e8584b2024-11-06 19:21:28 +080017#include "mbtk_utils.h"
wangyouqiang16aadb02024-04-12 15:47:13 +080018
19#define MBTK_RESULT_FAIL -1
20#define MBTK_RESULT_SUCCESS 0
hong.liuc05984a2025-06-24 21:49:16 +080021#define BOOT_CHECK_TIME 200 //200ms
22#define NORMAL_CHECK_TIME 30000 //30s
23#define PERIOD_LEN 10
xf.li31aad552025-07-21 23:26:55 -070024#define update_ril_digit 0x7 //The last three digits are reserved for RIL service,0x111
25#define update_gnss_digit 1<<4
hong.liuc05984a2025-06-24 21:49:16 +080026int in_period[PERIOD_LEN] = {100,100,200,200,500,500,500,500,2000,5000};//ms
b.liubcf86c92024-08-19 19:48:28 +080027
wangyouqiang16aadb02024-04-12 15:47:13 +080028static mbtk_ready_status_type mbtk_ready_status = MBTK_READY_INIT;
29static mbtk_info_handle_t* mbtk_handle = NULL;
xf.li31aad552025-07-21 23:26:55 -070030static pthread_mutex_t lock;
31int tag = 0;
32void update_ril_value(int value)
33{
34 FILE *fp;
35 char buf[16];
36 char cmd[64];
37 int rd_value = 0;
38 int ret = 0;
39
40 pthread_mutex_lock(&lock);
41
42 fp = popen("uci get lynq_uci.sdk_ready","r");
43 if(fp == NULL)
44 {
45 LOGE("Failed to run uci get lynq_uci.sdk_ready\n");
46 pthread_mutex_unlock(&lock);
47 return;
48 }
49 if(fgets(buf, sizeof(buf) - 1, fp) == NULL)
50 {
51 LOGE("update_ril_value fgets failed");
52 pthread_mutex_unlock(&lock);
53 pclose(fp);
54 return;
55 }
56 if(tag != 0)
57 {
58 rd_value = atoi(buf);
59 }
60 else
61 {
62 tag = 1;
63 }
64
65 rd_value &= ~(update_ril_digit);//The last three digits are reserved for RIL service
66 rd_value |= (value & update_ril_digit);
67 sprintf(cmd,"uci set lynq_uci.sdk_ready='%d'",rd_value);
68 ret = system(cmd);
69 if(ret != 0)
70 {
71 LOGE("Failed to run uci set lynq_uci.sdk_ready\n");
72 }
73
74 pclose(fp);
75 pthread_mutex_unlock(&lock);
76 return;
77}
78
79void update_gnss_value()
80{
81 FILE *fp;
82 char buf[16];
83 char cmd[64];
84 int rd_value = 0;
85 int ret = 0;
86
87 pthread_mutex_lock(&lock);
88
89 fp = popen("uci get lynq_uci.sdk_ready","r");
90 if(fp == NULL)
91 {
92 LOGE("Failed to run uci get lynq_uci.sdk_ready\n");
93 pthread_mutex_unlock(&lock);
94 return;
95 }
96 if(fgets(buf, sizeof(buf) - 1, fp) == NULL)
97 {
98 LOGE("update_gnss_value fgets failed");
99 pthread_mutex_unlock(&lock);
100 pclose(fp);
101 return;
102 }
103 rd_value = atoi(buf);
104 rd_value &= ~(update_gnss_digit);
105 rd_value |= (update_gnss_digit); //The fifth digits is reserved for GNSS service
106 sprintf(cmd,"uci set lynq_uci.sdk_ready='%d'",rd_value);
107 ret = system(cmd);
108 if(ret != 0)
109 {
110 LOGE("Failed to run uci set lynq_uci.sdk_ready\n");
111 }
112 pthread_mutex_unlock(&lock);
113 pclose(fp);
114 return;
115}
116
wangyouqiang16aadb02024-04-12 15:47:13 +0800117#if 1
118static mbtk_ready_status_type modem_check(void)
119{
120 char imei[16]= {0};
121 int cme_err = 0;
122
123 if(mbtk_handle == NULL)
124 {
125 mbtk_handle = mbtk_info_handle_get();
126 if(mbtk_handle == NULL)
127 {
128 LOGE("[SDK_READY] mbtk_info_handle_get fail.");
129 return MBTK_READY_RIL_FAIL;
130 }
131 }
132
133 mbtk_handle->info_err = 0;
134 cme_err = mbtk_imei_get(mbtk_handle, imei);
135 //LOGE("[SDK_READY] imei = [%s], cme_err = [%d]", imei, cme_err);
136 if(cme_err == 0 && strlen(imei) == 0)
137 {
138 mbtk_info_handle_free(&mbtk_handle);
139 mbtk_handle = NULL;
140 return MBTK_READY_RIL_FAIL;
141 }
142 if(cme_err != 0 || strlen(imei) == 0)
143 {
144 mbtk_info_handle_free(&mbtk_handle);
145 mbtk_handle = NULL;
146 return MBTK_READY_MODEM_FAIL;
147 }
148 return MBTK_READY_SUCCESS;
149}
150#endif
hong.liuc05984a2025-06-24 21:49:16 +0800151long get_uptime()
152{
153 struct timespec start_time;
154 clock_gettime(CLOCK_MONOTONIC, &start_time);
155 return start_time.tv_sec;
156}
wangyouqiang16aadb02024-04-12 15:47:13 +0800157static void* sdk_ready_check_pthread(void *arg)
158{
159 UNUSED(arg);
160 LOGE("[SDK_READY] sdk_ready_check_pthread entry.");
wangyouqiang16aadb02024-04-12 15:47:13 +0800161 mbtk_ready_status_type now_ready_status = MBTK_READY_INIT;
xf.li31aad552025-07-21 23:26:55 -0700162 //char buf[MBTK_READY_STRING_SIZE_MAX] = {0};
163 // buf[0] = '0' + now_ready_status;
164 // property_set(MBTK_READY_UCI, buf);// init state value
wangyouqiang16aadb02024-04-12 15:47:13 +0800165 int sleep_time = 30;
hong.liuc05984a2025-06-24 21:49:16 +0800166 long uptime = 0;
167 int count = 0;
wangyouqiang16aadb02024-04-12 15:47:13 +0800168 while(1)
169 {
170 now_ready_status = modem_check();
xf.li31aad552025-07-21 23:26:55 -0700171 //buf[0] = '0' + now_ready_status;
172 //property_set(MBTK_READY_UCI, buf);
173 update_ril_value(now_ready_status);
174 mbtk_ready_status = now_ready_status;
hong.liuc05984a2025-06-24 21:49:16 +0800175 uptime = get_uptime();
176 if(uptime < 50)//in 50s
wangyouqiang16aadb02024-04-12 15:47:13 +0800177 {
hong.liuc05984a2025-06-24 21:49:16 +0800178 if(now_ready_status != MBTK_READY_SUCCESS)
179 {
180 sleep_time = BOOT_CHECK_TIME;
181 }
182 else
183 {
184 sleep_time = NORMAL_CHECK_TIME;
185 }
wangyouqiang16aadb02024-04-12 15:47:13 +0800186 }
187 else
188 {
hong.liuc05984a2025-06-24 21:49:16 +0800189 if(now_ready_status != MBTK_READY_SUCCESS)
190 {
191 if(count < PERIOD_LEN)
192 {
193 sleep_time = in_period[count];
194 }
195 else
196 {
197 count = 0;
198 sleep_time = in_period[count];
199 }
200 count++;
201 }
202 else
203 {
204 sleep_time = NORMAL_CHECK_TIME;
205 count = 0;
206 }
b.liubcf86c92024-08-19 19:48:28 +0800207
hong.liuc05984a2025-06-24 21:49:16 +0800208 }
209 usleep(sleep_time*1000);
wangyouqiang16aadb02024-04-12 15:47:13 +0800210 }
211 LOGE("[SDK_READY] sdk_ready_check_pthread exit.");
212 return NULL;
213}
214
rx.xie1e6f1b42025-08-01 04:31:12 -0700215static int is_process_running(const char *process_name)
216{
217 char command[128];
218 FILE *fp;
219 int found = 0;
220
221 snprintf(command, sizeof(command), "ps | grep -v grep | grep '%s'", process_name);
222 fp = popen(command, "r");
223 if (!fp)
xf.li31aad552025-07-21 23:26:55 -0700224 {
rx.xie1e6f1b42025-08-01 04:31:12 -0700225 LOGE("[GNSS_CHECK] popen failed for command: %s", command);
226 return 0;
227 }
228
229 char line[256];
230 if (fgets(line, sizeof(line), fp))
231 {
232 found = 1;
233 }
234 pclose(fp);
235 return found;
236}
237
238static void* check_gnss(void *arg)
239{
240 UNUSED(arg);
241 const char *gnss_process_name = "mbtk_gnssd";
242 int current_status;
243 while (1)
244 {
245 current_status = is_process_running(gnss_process_name);
246 if (current_status == 0)
247 {
248 LOGI("[GNSS_CHECK] GNSS process stopped, setting status to 1");
249 update_gnss_value();
250 }
251 sleep(30);
xf.li31aad552025-07-21 23:26:55 -0700252 }
253 return NULL;
254}
255
wangyouqiang16aadb02024-04-12 15:47:13 +0800256int main(int argc, char *argv[])
257{
b.liubcf86c92024-08-19 19:48:28 +0800258 mbtk_log_init("radio", "MBTK_SDK_READY");
259
260 MBTK_SOURCE_INFO_PRINT("mbtk_sdk_ready");
261
wangyouqiang16aadb02024-04-12 15:47:13 +0800262 if(mbtk_ready_status != MBTK_READY_INIT)
263 {
264 LOGE("[SDK_READY] sdk has check.");
265 return MBTK_RESULT_FAIL;
266 }
267
b.liubb590492024-06-13 16:42:08 +0800268#ifdef MBTK_DUMP_SUPPORT
269 mbtk_debug_open(NULL, TRUE);
270#endif
271
wangyouqiang16aadb02024-04-12 15:47:13 +0800272 LOGE("[SDK_READY] sdk check init.");
xf.li31aad552025-07-21 23:26:55 -0700273 pthread_t ril_check_pid, gnss_check_pid;
wangyouqiang16aadb02024-04-12 15:47:13 +0800274 pthread_attr_t thread_attr;
275 pthread_attr_init(&thread_attr);
276 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
277 {
278 LOGE("[SDK_READY] pthread_attr_setdetachstate() fail.");
279 return MBTK_RESULT_FAIL;
280 }
b.liubcf86c92024-08-19 19:48:28 +0800281
xf.li31aad552025-07-21 23:26:55 -0700282 if(pthread_create(&ril_check_pid, &thread_attr, sdk_ready_check_pthread, NULL))
wangyouqiang16aadb02024-04-12 15:47:13 +0800283 {
xf.li31aad552025-07-21 23:26:55 -0700284 LOGE("[SDK_READY] sdk_ready_check_pthread pthread_create() fail.");
285 }
286
287 sleep(1);
288
289 if(pthread_create(&gnss_check_pid, &thread_attr, check_gnss, NULL))
290 {
291 LOGE("[SDK_READY] check_gnss pthread_create() fail.");
wangyouqiang16aadb02024-04-12 15:47:13 +0800292 }
293
294 pthread_attr_destroy(&thread_attr);
295
296 LOGE("[SDK_READY] sdk check start.");
297 while(1)
298 {
299 sleep(24 * 60 * 60);
300 }
301
302 LOGE("[SDK_READY]!!!mbtk_sdk_ready exit!!!");
303 return MBTK_RESULT_SUCCESS;
304}
q.huang15cf93d2025-06-27 17:26:59 +0800305#endif