/*
|
* Copyright (C) 2007 The Android Open Source Project
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
#include <errno.h>
|
#include <sys/types.h>
|
#include <sys/uio.h>
|
#include <sys/stat.h>
|
#include <sys/time.h>
|
#include <stdio.h>
|
#include <stdlib.h>
|
#include <string.h>
|
#include <unistd.h>
|
#include <utime.h>
|
#include <fcntl.h>
|
#include <cutils/log.h>
|
#include "common.h"
|
//#include "extra-functions.h"
|
#include "wlan_test.h"
|
#include "test_case.h"
|
#include "language.h"
|
|
#define TAG "[PCBA,WIFI]: "
|
#define LOG(x...) printf(TAG x)
|
|
#define MAX_SCAN_COUNTS (64)
|
#define SCAN_RESULT_LENGTH (128 * MAX_SCAN_COUNTS)
|
#define SCAN_RESULT_FILE "/data/scan_result.txt"
|
#define SCAN_RESULT_FILE2 "/data/scan_result2.txt"
|
|
static char ssids[MAX_SCAN_COUNTS][128];
|
static char rssis[MAX_SCAN_COUNTS][128];
|
|
static char wifi_type[64] = {0};
|
extern int check_wifi_chip_type_string(char *type);
|
static const char RECOGNIZE_WIFI_CHIP[] = "/data/misc/wifi/wifi_chip";
|
|
#if 0
|
/*
|
* RSSI Levels as used by notification icon
|
*
|
* Level 4 -55 <= RSSI
|
* Level 3 -66 <= RSSI < -55
|
* Level 2 -77 <= RSSI < -67
|
* Level 1 -88 <= RSSI < -78
|
* Level 0 RSSI < -88
|
*/
|
static int calc_rssi_lvl(int rssi)
|
{
|
rssi *= -1;
|
|
if (rssi >= -55)
|
return 4;
|
else if (rssi >= -66)
|
return 3;
|
else if (rssi >= -77)
|
return 2;
|
else if (rssi >= -88)
|
return 1;
|
else
|
return 0;
|
}
|
|
static void process_ssid(char *dst, char *src, char *src2)
|
{
|
char *p, *p2, *tmp, *tmp2;
|
int i, j, dbm, dbm2 = 99, index = 0, rssi;
|
|
for (i = 0; i < MAX_SCAN_COUNTS; i++) {
|
/* ESSID:"PocketAP_Home" */
|
tmp = &ssids[i][0];
|
p = strstr(src, "ESSID:");
|
if (p == NULL)
|
break;
|
/* skip "ESSID:" */
|
p += strlen("ESSID:");
|
while ((*p != '\0') && (*p != '\n'))
|
*tmp++ = *p++;
|
*tmp++ = '\0';
|
src = p;
|
/* LOG("src = %s\n", src); */
|
|
/* Quality:4/5 Signal level:-59 dBm Noise level:-96 dBm */
|
tmp2 = &rssis[i][0];
|
p2 = strstr(src2, "Signal level");
|
if (p2 == NULL)
|
break;
|
/* skip "level=" */
|
p2 += strlen("Signal level") + 1;
|
/* like "-90 dBm", total 3 chars */
|
*tmp2++ = *p2++; /* '-' */
|
*tmp2++ = *p2++; /* '9' */
|
*tmp2++ = *p2++; /* '0' */
|
*tmp2++ = *p2++; /* ' ' */
|
*tmp2++ = *p2++; /* 'd' */
|
*tmp2++ = *p2++; /* 'B' */
|
*tmp2++ = *p2++; /* 'm' */
|
*tmp2++ = '\0';
|
src2 = p2;
|
/* LOG("src2 = %s\n", src2); */
|
LOG("i = %d, %s, %s\n", i, &ssids[i][0], &rssis[i][0]);
|
}
|
|
LOG("total = %d\n", i);
|
if (i == 0)
|
return;
|
|
for (j = 0; j < i; j++) {
|
dbm = atoi(&rssis[j][1]); /* skip '-' */
|
if (dbm == 0)
|
continue;
|
if (dbm < dbm2) { /* get max rssi */
|
dbm2 = dbm;
|
index = j;
|
}
|
}
|
|
LOG("index = %d, dbm = %d\n", index, dbm2);
|
LOG("select ap: %s, %s\n", &ssids[index][0], &rssis[index][0]);
|
|
rssi = calc_rssi_lvl(atoi(&rssis[index][1]));
|
|
sprintf(dst, "{ %s \"%d\" }", &ssids[index][0], rssi);
|
}
|
|
int save_wifi_chip_type(char *type)
|
{
|
int ret;
|
int fd;
|
int len;
|
char buf[64];
|
ret = access(RECOGNIZE_WIFI_CHIP, R_OK|W_OK);
|
if ((ret == 0) || (errno == EACCES)) {
|
if ((ret != 0) && (chmod(RECOGNIZE_WIFI_CHIP, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) {
|
LOG("Cannot set RW to %s : %s\n", RECOGNIZE_WIFI_CHIP,strerror(errno));
|
return -1;
|
}
|
LOG("%s is exit\n", RECOGNIZE_WIFI_CHIP);
|
return 0;
|
}
|
|
fd = TEMP_FAILURE_RETRY(open(RECOGNIZE_WIFI_CHIP, O_CREAT|O_RDWR, 0664));
|
if (fd < 0) {
|
LOG("Cannot create %s : %s\n", RECOGNIZE_WIFI_CHIP,strerror(errno));
|
return -1;
|
}
|
LOG("is not exit,save wifi chip %s\n", RECOGNIZE_WIFI_CHIP);
|
strcpy(buf, type);
|
LOG("recognized wifi chip = %s , save to %s\n",buf, RECOGNIZE_WIFI_CHIP);
|
len = strlen(buf)+1;
|
if (TEMP_FAILURE_RETRY(write(fd, buf, len)) != len) {
|
LOG("Error writing %s : %s\n", RECOGNIZE_WIFI_CHIP, strerror(errno));
|
close(fd);
|
return -1;
|
}
|
close(fd);
|
if (chmod(RECOGNIZE_WIFI_CHIP, 0664) < 0) {
|
LOG("Error changing permissions of %s to 0664: %s\n", RECOGNIZE_WIFI_CHIP, strerror(errno));
|
unlink(RECOGNIZE_WIFI_CHIP);
|
return -1;
|
}
|
return 1;
|
}
|
#endif
|
|
void *wlan_test(void *argv)
|
{
|
int ret = 0, y;
|
FILE *fp = NULL;
|
FILE *fp2 = NULL;
|
char *results = NULL;
|
char *results2 = NULL;
|
char ssid[100];
|
struct testcase_info *tc_info = (struct testcase_info *)argv;
|
char wifi_pcba_node = 1;
|
|
/* remind ddr test */
|
if (tc_info->y <= 0)
|
tc_info->y = get_cur_print_y();
|
|
y = tc_info->y;
|
ui_print_xy_rgba(0, y, 255, 255, 0, 255, "%s:[%s..]\n", PCBA_WIFI,
|
PCBA_TESTING);
|
|
#if 0
|
if (wifi_type[0] == 0) {
|
check_wifi_chip_type_string(wifi_type);
|
save_wifi_chip_type(wifi_type);
|
}
|
ret = __system("busybox chmod 777 /res/wifi.sh");
|
if (ret)
|
LOG("chmod wifi.sh failed :%d\n", ret);
|
|
ret = __system("/res/wifi.sh");
|
if (ret <= 0)
|
goto error_exit;
|
|
results = malloc(SCAN_RESULT_LENGTH);
|
results2 = malloc(SCAN_RESULT_LENGTH);
|
if (results == NULL || results2 == NULL)
|
goto error_exit;
|
|
fp = fopen(SCAN_RESULT_FILE, "r");
|
fp2 = fopen(SCAN_RESULT_FILE2, "r");
|
if (fp == NULL || fp2 == NULL)
|
goto error_exit;
|
|
memset(results, 0, SCAN_RESULT_LENGTH);
|
fread(results, SCAN_RESULT_LENGTH, 1, fp);
|
results[SCAN_RESULT_LENGTH - 1] = '\0';
|
|
memset(results2, 0, SCAN_RESULT_LENGTH);
|
fread(results2, SCAN_RESULT_LENGTH, 1, fp2);
|
results2[SCAN_RESULT_LENGTH - 1] = '\0';
|
|
memset(ssid, 0, 100);
|
|
process_ssid(ssid, results, results2);
|
|
|
ui_print_xy_rgba(0, y, 0, 255, 0, 255, "%s:[%s] %s\n", PCBA_WIFI,
|
PCBA_SECCESS, ssid);
|
tc_info->result = 0;
|
|
fclose(fp);
|
fclose(fp2);
|
free(results);
|
free(results2);
|
|
LOG("wlan_test success.\n");
|
|
return 0;
|
|
error_exit:
|
if (fp)
|
fclose(fp);
|
if (fp2)
|
fclose(fp2);
|
if (results)
|
free(results);
|
if (results2)
|
free(results2);
|
|
ui_print_xy_rgba(0, y, 225, 0, 0, 255, "%s:[%s] %s\n", PCBA_WIFI,
|
PCBA_FAILED, ssid);
|
tc_info->result = -1;
|
|
LOG("wlan_test failed.\n");
|
#else //Linux pcba test
|
|
int rst;
|
char ssid_buf[128] = {0};
|
char result_filename[100] = {0};
|
|
printf("======================start wifi test=============================\n");
|
rst = run_test_item_cmd("echo_auto_test echo_wlan_test");
|
|
if(rst == 0) {
|
snprintf(result_filename, sizeof(result_filename),
|
"%s/echo_wlan_test_result", "/tmp");
|
ret = parse_test_result(result_filename, "wlan_test", ssid_buf);
|
LOG("000 %s\n", ssid_buf);
|
|
}else {
|
return NULL;
|
}
|
|
if(ret == 0) {
|
if(strstr(ssid_buf, "SSID") != NULL) {
|
char ch;
|
char *result = NULL, *p;
|
char delims[] = " ";
|
|
memset(ssid, 0, sizeof(ssid));
|
|
ch = *ssid_buf;
|
p = ssid_buf;
|
while (ch != '\0')
|
{
|
if (ch == '<' || ch == '>')
|
*(p-1) = ' ';
|
ch = *p++;
|
}
|
LOG("111 %s\n", ssid_buf);
|
|
result = strtok(ssid_buf, delims);
|
while( result != NULL ) {
|
printf("result is \"%s\"\n", result);
|
|
if(strstr(result,"SSID")!= NULL){
|
strcat(ssid, result);
|
strcat(ssid, " ");
|
}
|
if(strstr(result, "Signal")!= NULL){
|
strcat(ssid, result);
|
strcat(ssid, " ");
|
}
|
if(strstr(result, "Level")!= NULL){
|
strcat(ssid, result);
|
strcat(ssid, " ");
|
}
|
if(strstr(result, "RSSI")!= NULL){
|
strcat(ssid, result);
|
}
|
|
result = strtok( NULL, delims );
|
}
|
}
|
ui_print_xy_rgba(0, y, 0, 255, 0, 255, "%s:[%s] { %s }\n", PCBA_WIFI,
|
PCBA_SECCESS, ssid);
|
tc_info->result = 0;
|
LOG("wlan_test success.\n");
|
} else {
|
if(ssid[0] == 0)
|
strcpy(ssid, "Not found specfied ssid.");
|
|
ui_print_xy_rgba(0, y, 225, 0, 0, 255, "%s:[%s] { %s }\n", PCBA_WIFI,
|
PCBA_FAILED, ssid);
|
tc_info->result = -1;
|
LOG("wlan_test failed.\n");
|
}
|
|
#endif
|
|
return argv;
|
}
|