ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

DuerOS-Light-SDK-v1.1.0/demo/factory_test.cpp

Committer:
TMBOY
Date:
2017-07-18
Revision:
47:9e361da97763

File content as of revision 47:9e361da97763:

#if defined(TARGET_UNO_91H)
#include "mbed.h"
#include "rtos.h"
#include "console.h"
#include "WiFiStackInterface.h"
#include "rda_wdt_api.h"
#include "rda_ccfg_api.h"
#include "cmsis_os.h"
#include "rda_wdt_api.h"
#include "Rda58xx.h"

static char* version = "**********RDA Software Version sta_V2.0_124**********";
static int op_mode = 0;//initial ~ 0 factory test ~ 1 function ~ 2
static char conn_flag = 0;
static WiFiStackInterface wifi;
extern unsigned char rda_mac_addr[6];
extern rda58xx _rda58xx;

int do_conn_state(cmd_tbl_t* cmd, int argc, char* argv[]) {
    if (op_mode != 1) {
        return 0;
    }

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

#if 1
    const char* ssid;
    ssid = wifi.get_ssid();

    if (ssid[0]) {
        printf("CONNECTED! ssid:%s RSSI:%d db ip:%s\r\n", wifi.get_ssid(), wifi.get_rssi(),
               wifi.get_ip_address());
    } else {
        printf("NOT CONNECTED!\r\n");
    }

#else

    if (wifi.bss.SSID[0]) {
        printf("CONNECTED! ssid:%s RSSI:%d db\r\n", wifi.bss.SSID, wifi.bss.SSID);
    } else {
        printf("NOT CONNECTED!\r\n");
    }

#endif
    return 0;
}

int do_get_mac(cmd_tbl_t* cmd, int argc, char* argv[]) {
    if (op_mode != 1) {
        return 0;
    }

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    char mac[6];
    mbed_mac_address(mac);
    printf("MAC address: %02x:%02x:%02x:%02x:%02x:%02x\r\n",
           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

    return 0;
}

int do_set_mac(cmd_tbl_t* cmd, int argc, char* argv[]) {
    char* mdata, mac[6], i;

    if (op_mode != 1) {
        return 0;
    }

    if (argc < 2) {
        show_cmd_usage(cmd);
        return -1;
    }

    if (strlen(argv[1]) != 12) {
        printf("Error MAC address len\r\n");
        return -2;
    }

    mdata = argv[1];

    for (i = 0; i < 12; i++) {
        if (mdata[i] >= 0x41 && mdata[i] <= 0x46) { // switch 'A' to 'a'
            mdata[i] += 0x20;
        }

        if (mdata[i] >= 0x61 && mdata[i] <= 0x66) { //switch "ab" to 0xab
            mac[i] = mdata[i] - 0x57;
        }

        if (mdata[i] >= 0x30 && mdata[i] <= 0x39) {
            mac[i] = mdata[i] - 0x30;
        }

        if (i % 2 == 1) {
            mac[i / 2] = mac[i - 1] << 4 | mac[i];
        }
    }

    if (!mac_is_valid(mac)) {
        printf("MAC is ZERO\r\n");
        return 0;
    }

    memcpy(rda_mac_addr, mac, 6);
    rda5981_flash_write_mac_addr(rda_mac_addr);
    return 0;
}

int do_get_ver(cmd_tbl_t* cmd, int argc, char* argv[]) {
    if (op_mode != 1) {
        return 0;
    }

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    printf("Software Version: %s\r\n", version);
    return 0;
}

int do_get_ver_5856(cmd_tbl_t* cmd, int argc, char* argv[]) {
    char ver[32] = {0};
    rda58xx_at_status ret;

    if (op_mode != 1) {
        return 0;
    }

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    printf("do_get_ver_5856\r\n");

    while (!_rda58xx.isPowerOn()) {
        Thread::wait(100);
    }

    ret = _rda58xx.getChipVersion(ver);

    if (VACK == ret) {
        printf("5856 Software Version: %s\r\n", ver);
        return 0;
    } else {
        printf("5856 Software Version: Fail!\r\n");
        return -1;
    }
}

int do_factory_test_5856(cmd_tbl_t* cmd, int argc, char* argv[]) {
    rda58xx_at_status ret;

    if (op_mode != 1) {
        return 0;
    }

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    printf("do_factory_test_5856\r\n");
    ret = _rda58xx.factoryTest(FT_ENABLE);

    if (VACK == ret) {
        printf("5856 Factory Test: Succeed\r\n");
        return 0;
    } else {
        printf("5856 Factory Test: Fail\r\n");
        return -1;
    }
}


int do_write_usedata(cmd_tbl_t* cmd, int argc, char* argv[]) {

    int len, ret, tmp_len = 0;
    unsigned char* buf;

    if (op_mode != 1) {
        return 0;
    }

    if (argc < 2) {
        show_cmd_usage(cmd);
        return -1;
    }

    len = atoi(argv[1]);
    buf = (unsigned char*)malloc(len);
    memset(buf, 0, len);

    do {
        unsigned int size;
        size = console_fifo_get(buf + tmp_len, len - tmp_len);
        tmp_len += size;
    } while (tmp_len < len);

    ret = rda5981_flash_write_3rdparter_data(buf, len);

    if (ret < 0) {
        printf("write flash error, error %d\r\n", ret);
    } else {
        printf("Data write complete\r\n");
    }

    free(buf);
    return 0;
}

int do_read_usedata(cmd_tbl_t* cmd, int argc, char* argv[]) {

    int len = 0, ret = -1;
    unsigned char* buf;

    if (op_mode != 1) {
        return 0;
    }

    if (argc != 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    len  = rda5981_flash_read_3rdparter_data_length();

    if (len < 0) {
        printf("No user data in flah\r\n");
        return -1;
    }

    buf = (unsigned char*)malloc(len + 1);
    memset(buf, 0, len + 1);

    ret = rda5981_flash_read_3rdparter_data(buf, len);

    if (ret < 0) {
        printf("read flash error, error %d\r\n", ret);
    } else {
        printf("Data read complete, len:%d\r\n", ret);
    }

    buf[len] = 0;
    console_puts((char*)buf);
    printf("\n");
    free(buf);
    return 0;
}

int do_reset(cmd_tbl_t* cmd, int argc, char* argv[]) {
    if (op_mode != 1) {
        return 0;
    }

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    printf("SOFTWARE RESET!!!!\r\n");
    rda_wdt_softreset();
    return 0;

}

int do_conn(cmd_tbl_t* cmd, int argc, char* argv[]) {
    char* ssid_t, *pw_t;
    const char* ip_addr;
    char ssid[20];
    char pw[20];

    if (op_mode != 1) {
        return 0;
    }

    if (conn_flag == 1) {
        printf("error! Has been connected!");
        return -1;
    }

    printf("OK, start connect\r\n");

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    memset(ssid, 0, sizeof(ssid));
    memset(pw, 0, sizeof(pw));

    if (argc > 1) {
        memcpy(ssid, argv[1], strlen(argv[1]));
    }

    if (argc > 2) {
        memcpy(pw, argv[2], strlen(argv[2]));
    }

    if (strlen(ssid) != 0) {
        ssid_t = ssid;
    } else {
        ssid_t = NULL;
    }

    if (strlen(pw) != 0) {
        pw_t = pw;
    } else {
        pw_t = NULL;
    }

    printf("ssid %s pw %s\r\n", ssid_t, pw_t);

    wifi.connect(ssid_t, pw_t, NSAPI_SECURITY_NONE);

    while (!wifi.get_ip_address());

    ip_addr = wifi.get_ip_address();

    if (ip_addr) {
        printf("Client IP Address is %s\r\n", ip_addr);
    } else {
        printf("No Client IP Address\r\n");
    }

    conn_flag = 1;
    //rda5981_flash_write_smartconfig_data();
    return 0;
}

int do_disconn(cmd_tbl_t* cmd, int argc, char* argv[]) {
    if (op_mode != 1) {
        return 0;
    }

    if (argc < 1) {
        show_cmd_usage(cmd);
        return -1;
    }

    if (conn_flag == 0) {
        printf("Not connectted!\r\n");
        return 0;
    }

    wifi.disconnect();

    while (wifi.get_ip_address() != NULL) {
        Thread::wait(20);
    }

    conn_flag = 0;
    //printf("OK, Disconnect successful\r\n");
    return 0;
}

int do_set_baud(cmd_tbl_t* cmd, int argc, char* argv[]) {
    unsigned int baudrate;

    if (op_mode != 1) {
        return 0;
    }

    if (argc < 2) {
        show_cmd_usage(cmd);
        return -1;
    }

    printf("OK, do set baud\r\n");
    baudrate = atoi(argv[1]);
    console_set_baudrate(baudrate);

    return 0;
}

void add_cmd() {
    int i;
    cmd_tbl_t cmd_list[] = {
        {
            "reset",      1,   do_reset,
            "reset        - Software Reset\n"
        },
        {
            "conn",       3,   do_conn,
            "conn         - start connect\n"
        },
        {
            "setbaud",    2,   do_set_baud,
            "setbaud      - set serial baudrate\n"
        },
        {
            "connstate",  1,   do_conn_state,
            "connstate    - get conn state\n"
        },
        {
            "setmac",     2,   do_set_mac,
            "setmac       - set mac address\n"
        },
        {
            "getmac",     1,   do_get_mac,
            "getmac       - get mac address\n"
        },
        {
            "getver",     1,   do_get_ver,
            "getver       - get version\n"
        },
        {
            "getver5856", 1,   do_get_ver_5856,
            "getver5856   - get 5856 version\n"
        },
        {
            "ftest5856",  1,   do_factory_test_5856,
            "ftest5856    - 5856 factory test\n"
        },
        {
            "disconn",    1,   do_disconn,
            "disconn      - start disconnect\n"
        },
        {
            "wuserdata",  2,   do_write_usedata,
            "wusedate     - write user data\n"
        },
        {
            "ruserdata",  1,   do_read_usedata,
            "ruserdate     - read user data\n"
        },
    };
    i = sizeof(cmd_list) / sizeof(cmd_tbl_t);

    while (i--) {
        if (0 != console_cmd_add(&cmd_list[i])) {
            printf("Add cmd failed\r\n");
        }
    }
}

int factory_test() {
    unsigned int flag = (*((volatile unsigned int*)(0x40001024UL)));

    //printf("flag = %x\r\n", flag);
    if ((flag & (0x01UL << 29)) == 0) {
        return 0;
    }

    op_mode = 1;
    console_init();
    add_cmd();

    while (1);

    //return 0;
}
#endif