void* DefaultWifiThread(void *pThreadArg) { int iExit = 0; int iRecv = 0; OTDRMSGQUEUE *pWifiMsg = NULL; pWifiMsg = GetWifiMsgQueue(); printf("enter thd\n"); if(pWifiMsg == NULL) { printf("error, pWifiMsg is NULL\n"); return NULL; } else { ClearOTDRMsgQueue(pWifiMsg); } while (!iExit) { iExit = GetExitFlag(); if (iExit == 1) { break; } iRecv = 0; ReadWifiMsgQueue(&iRecv); if(iRecv) { printf("wifiTHD Recv = %d\n", iRecv); switch(iRecv) { case ENUM_OPEN: WifiOpen(); break; case ENUM_SCAN: WifiScan(); break; case ENUM_SCAN_R: WifiScan_r(); break; case ENUM_CONNECT://victor WifiConnect(); break; default: break; } } else { MsecSleep(30); } } printf("exit thd\n"); return NULL; }
/*** * 功能: 初始化设备驱动,获得设备文件描述符 * 参数: * 返回: 成功返回零,失败返回非零值 * 备注: ***/ int InitializeDevice(void) { int iErr = 0; //加载键盘驱动 iErr = system("insmod /lib/modules/2.6.30/drv_keypad.ko"); if (iErr) { printf("insmod drv_keypad.ko error\n"); } //等待一段时间,以便完成设备驱动加载 MsecSleep(200); return iErr; }
//by:yhy 绿网无用函数 //每2s清空一次 void *timeout_packets() { l3_send_buf_t *p_buf = NULL; l3_send_buf_t *tmp = NULL; prctl(PR_SET_NAME, (unsigned long) "TimeoutPktThread" ) ; while(1) { pthread_mutex_lock(&g_timeout_thread_mutex); p_buf = g_l3_first_packets; while(p_buf) { if(g_cur_sys_time.tv_sec - p_buf->time_smp >= 2) { if(p_buf == g_l3_first_packets) { g_l3_first_packets = p_buf->next; if(g_l3_first_packets) { g_l3_first_packets->pre = NULL; } } else { p_buf->pre->next = p_buf->next; p_buf->next->pre = p_buf->pre; } tmp = p_buf->next; free(p_buf); p_buf = tmp; continue; } p_buf = p_buf->next; } pthread_mutex_unlock(&g_timeout_thread_mutex); //sleep(2); MsecSleep(2*1000); } }
/*** * 功能: 默认触摸屏线程入口函数 * 参数: 1.void *pThreadArg: 线程入口函数参数,类型为(GUITOUCH *) * 返回: 返回线程结束状态 * 备注: ***/ void* DefaultTouchThread(void *pThreadArg) { //错误标志、返回值定义 int iErr = 0; static int iReturn = 0; //临时变量定义 int iExit = 0; GUITOUCH *pTouchObj = pThreadArg; while (!iExit) { //根据结束标志判断是否需要结束触摸屏线程 iExit = GetExitFlag(); if (iExit) { break; } //触摸屏事件的封装 switch (pTouchObj->iDevType) { case GUITOUCH_TYP_STD: iErr = StandardTouchProcess(pTouchObj); break; case GUITOUCH_TYP_CUST: iErr = CustomTouchProcess(pTouchObj); break; default: break; } //出错为-1,表示无触摸屏数据可读,睡眠50毫秒 if (-1 == iErr) { MsecSleep(50); } } //退出线程 ThreadExit(&iReturn); return &iReturn; //该语句只是为了消除编译器报警,实际上不起作用 }
int main(int argc, char *argv[]) { GUITHREAD thdFb = -1; GUITHREAD thdKeypad = -1; GUITHREAD thdTouch = -1; GUIWINDOW *pWnd = NULL; int iExit = 0; //初始化设备驱动 //InitializeDevice(); //装载输入法数据库 //OpenInputDb("/home/ubuntu/workspace/guilib/run/input/china.db"); //初始化GUI环境,运行调度线程及事件封装线程 InitializeGUI(); //运行设备抽象层的线程 ThreadCreate(&thdFb, NULL, DefaultFbThread, GetCurrFbmap()); //ThreadCreate(&thdKeypad, NULL, // DefaultKeypadThread, GetCurrKeypad()); ThreadCreate(&thdTouch, NULL, DefaultTouchThread, GetCurrTouch()); //第一个窗体线程运行 pWnd = CreateWindow(0, 0, 800, 480, FrmWiFiInit, FrmWiFiExit, FrmWiFiPaint, FrmWiFiLoop, FrmWiFiPause, FrmWiFiResume, NULL); //pWnd由调度线程释放 SendSysMsg_ThreadCreate(pWnd); //等待结束标志设立 while (!iExit) { iExit = GetExitFlag(); if (iExit) { ThreadCancel(thdTouch); //取消可能阻塞的触摸屏线程 ThreadCancel(thdKeypad); //取消可能阻塞的键盘线程 ThreadCancel(thdFb); //取消可能阻塞的帧缓冲线程 break; } MsecSleep(100); } //回收设备抽象层的线程 ThreadJoin(thdTouch, NULL); ThreadJoin(thdKeypad, NULL); ThreadJoin(thdFb, NULL); //释放GUI环境,回收事件封装线程及调度线程 ReleaseGUI(); //释放输入法数据库 CloseInputDb(); //释放设备驱动 //ReleaseDevice(); return 0; }
static void WifiScan_r() { FILE *fstream; char buffer[512] = {0}; char buffer1[512] = {0}; vsystem("wpa_cli scan_r > /mnt/sdcard/wifi/list.txt"); MsecSleep(1000); vsystem("awk '{print $5}' /mnt/sdcard/wifi/list.txt | tail -n +3 > /mnt/sdcard/scan"); MutexLock(&pWifiMutex); if (NULL == (fstream = fopen("/mnt/sdcard/scan", "r"))) { perror("fopen"); return; } int index = 0; while (NULL != mfgets(buffer, sizeof(buffer), fstream)) { if (index >= MAX_SIGNUM) { break; } strncpy(stWifi[index].ssid, buffer, sizeof(stWifi[index].ssid) - 1); index++; } fclose(fstream); vsystem("awk '{print $3}' /mnt/sdcard/wifi/list.txt | tail -n +3 > /mnt/sdcard/scan"); if (NULL == (fstream = fopen("/mnt/sdcard/scan", "r"))) { perror("fopen"); return; } index = 0; while (NULL != mfgets(buffer, sizeof(buffer), fstream)) { if (index >= MAX_SIGNUM) { break; } stWifi[index].iLevel = atoi(buffer); stWifi[index].iCell = CalcWifiCell(stWifi[index].iLevel); index++; } fclose(fstream); SortByLevel(index); int i; for(i = 0; i < index; i++) { if(i < WIFIITEM) { snprintf(buffer1, sizeof(buffer1), "%s", stWifi[i].ssid); if(NULL == pWiFiStrItem[i]) { free(pWiFiStrItem[i]); pWiFiStrItem[i] = NULL; } pWiFiStrItem[i] = TransString(buffer1); SetLabelText(pWiFiStrItem[i], pWiFiLblItem[i]); DisplayPicture(pWiFiItem[i]); DisplayLabel(pWiFiLblItem[i]); } printf("sig%d %s %d %d\n", i, stWifi[i].ssid, stWifi[i].iCell, stWifi[i].iLevel); } MutexUnlock(&pWifiMutex); WriteWifiMsgQueue(ENUM_SCAN); }
static void WifiScan() { vsystem("wpa_cli scan"); MsecSleep(10000); WriteWifiMsgQueue(ENUM_SCAN_R); }