diff --git a/scripts/examples/OpenMV/14-WiFi-Shield/mjpeg_streamer_ap.py b/scripts/examples/OpenMV/14-WiFi-Shield/mjpeg_streamer_ap.py index efd4e765b..04efc481d 100644 --- a/scripts/examples/OpenMV/14-WiFi-Shield/mjpeg_streamer_ap.py +++ b/scripts/examples/OpenMV/14-WiFi-Shield/mjpeg_streamer_ap.py @@ -24,6 +24,7 @@ sensor.set_pixformat(sensor.GRAYSCALE) # Init wlan module in AP mode. wlan = network.WINC(mode=network.WINC.MODE_AP) wlan.start_ap(SSID, key=KEY, security=wlan.WEP, channel=2) +print("AP mode started. SSID: {} IP: {}".format(SSID, wlan.ifconfig()[0])) # You can block waiting for client to connect #print(wlan.wait_for_sta(10000)) diff --git a/src/drivers/winc1500/src/winc.c b/src/drivers/winc1500/src/winc.c index 37b56de2a..b570bae02 100644 --- a/src/drivers/winc1500/src/winc.c +++ b/src/drivers/winc1500/src/winc.c @@ -589,11 +589,17 @@ int winc_start_ap(const char *ssid, uint8_t security, const char *key, uint16_t strcpy((char *)&apconfig.au8SSID, ssid); apconfig.u8ListenChannel = channel; apconfig.u8SecType = security; + apconfig.au8DHCPServerIP[0] = 192; apconfig.au8DHCPServerIP[1] = 168; apconfig.au8DHCPServerIP[2] = 1; apconfig.au8DHCPServerIP[3] = 1; + memcpy(ifconfig.ip_addr, apconfig.au8DHCPServerIP, WINC_IPV4_ADDR_LEN); + memcpy(ifconfig.subnet_addr, "\xff\xff\xff\x00", WINC_IPV4_ADDR_LEN); + memcpy(ifconfig.gateway_addr, apconfig.au8DHCPServerIP, WINC_IPV4_ADDR_LEN); + memcpy(ifconfig.dns_addr, apconfig.au8DHCPServerIP, WINC_IPV4_ADDR_LEN); + if (security != M2M_WIFI_SEC_OPEN) { strcpy((char *)&apconfig.au8WepKey, key); apconfig.u8KeySz = WEP_40_KEY_STRING_SIZE; diff --git a/src/micropython b/src/micropython index c5257f7fd..8a0208af3 160000 --- a/src/micropython +++ b/src/micropython @@ -1 +1 @@ -Subproject commit c5257f7fd13a48e1614122a772c9fcec6b76c47a +Subproject commit 8a0208af33ae551ee12a80abb19817101cb66d6a diff --git a/src/omv/ports/stm32/modules/py_winc.c b/src/omv/ports/stm32/modules/py_winc.c index 9aa8456e9..113c9ffd1 100644 --- a/src/omv/ports/stm32/modules/py_winc.c +++ b/src/omv/ports/stm32/modules/py_winc.c @@ -33,15 +33,17 @@ typedef struct _winc_obj_t { mp_obj_base_t base; + uint8_t active; + uint8_t itf; } winc_obj_t; -static const winc_obj_t winc_obj = {{(mp_obj_type_t*)&mod_network_nic_type_winc}}; +static winc_obj_t winc_obj = {{(mp_obj_type_t*) &mod_network_nic_type_winc}, false, WINC_MODE_STA}; // Initialise the module using the given SPI bus and pins and return a winc object. static mp_obj_t py_winc_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *all_args) { static const mp_arg_t allowed_args[] = { - { MP_QSTR_mode, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = WINC_MODE_STA } }, + { MP_QSTR_mode, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = WINC_MODE_STA } }, }; // parse args @@ -51,14 +53,16 @@ static mp_obj_t py_winc_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp mp_arg_parse_all(n_args, all_args, &kw_args, MP_ARRAY_SIZE(args), allowed_args, args); // Init WINC - winc_mode_t winc_mode = args[0].u_int; - int error = winc_init(winc_mode); + winc_obj.active = false; + winc_obj.itf = args[0].u_int; + int error = winc_init(winc_obj.itf); if (error != 0) { mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("Failed to initialize WINC1500 module: %s\n"), winc_strerror(error)); } + winc_obj.active = true; - switch (winc_mode) { + switch (winc_obj.itf) { case WINC_MODE_BSP: printf("Running in BSP mode...\n"); break; @@ -69,36 +73,55 @@ static mp_obj_t py_winc_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp case WINC_MODE_STA: // Register with network module mod_network_register_nic((mp_obj_t)&winc_obj); - if (winc_mode == WINC_MODE_AP) { - printf("Running in Access Point mode...\n"); - } else { - printf("Running in Station mode...\n"); - } break; default: mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("WiFi mode is not supported!")); } - return (mp_obj_t)&winc_obj; } +static mp_obj_t py_winc_active(size_t n_args, const mp_obj_t *args) +{ + winc_obj_t *self = MP_OBJ_TO_PTR(args[0]); + if (n_args == 2) { + bool active = mp_obj_is_true(args[1]); + if (active) { + if (self->active) { + // Nothing to do + } else { + int error = winc_init(winc_obj.itf); + if (error != 0) { + mp_raise_msg_varg(&mp_type_OSError, + MP_ERROR_TEXT("Failed to initialize WINC1500 module: %s\n"), winc_strerror(error)); + } + } + } else { + winc_init(WINC_MODE_BSP); + } + self->active = mp_obj_is_true(args[1]); + } + return mp_obj_new_bool(self->active); +} + // method connect(ssid, key=None, *, security=WPA2, bssid=None) static mp_obj_t py_winc_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { static const mp_arg_t allowed_args[] = { - { MP_QSTR_ssid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_key, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_essid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_key, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_security, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = M2M_WIFI_SEC_WPA_PSK} }, + { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} }, }; // parse args + winc_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); // get ssid - const char *ssid = mp_obj_str_get_str(args[0].u_obj); + const char *essid = mp_obj_str_get_str(args[0].u_obj); - if (strlen(ssid) == 0) { + if (strlen(essid) == 0) { mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("SSID can't be empty!")); } @@ -115,57 +138,24 @@ static mp_obj_t py_winc_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_m mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Key can't be empty!")); } - // connect to AP - if (winc_connect(ssid, security, key, M2M_WIFI_CH_ALL) != 0) { - mp_raise_msg_varg(&mp_type_OSError, - MP_ERROR_TEXT("could not connect to ssid=%s, sec=%d, key=%s\n"), ssid, security, key); + if (self->itf == WINC_MODE_STA) { + // Connect to AP + if (winc_connect(essid, security, key, M2M_WIFI_CH_ALL) != 0) { + mp_raise_msg_varg(&mp_type_OSError, + MP_ERROR_TEXT("could not connect to ssid=%s, sec=%d, key=%s\n"), essid, security, key); + } + } else { + mp_uint_t channel = args[3].u_int; + + if (security != M2M_WIFI_SEC_OPEN && security != M2M_WIFI_SEC_WEP) { + mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("AP mode supports WEP security only.")); + } + + // Initialize WiFi in AP mode. + if (winc_start_ap(essid, security, key, channel) != 0) { + mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("failed to start in AP mode")); + } } - - return mp_const_none; -} - -// method start_ap(ssid, key=None, security=OPEN) -static mp_obj_t py_winc_start_ap(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) -{ - static const mp_arg_t allowed_args[] = { - { MP_QSTR_ssid, MP_ARG_REQUIRED| MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_key, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_security, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = M2M_WIFI_SEC_OPEN } }, //M2M_WIFI_SEC_WPA_PSK - { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} }, - }; - - // parse args - mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - - // get ssid - const char *ssid = mp_obj_str_get_str(args[0].u_obj); - - // get key and security - const char *key = NULL; - mp_uint_t security = args[2].u_int; - - if (security != M2M_WIFI_SEC_OPEN && security != M2M_WIFI_SEC_WEP) { - mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("AP mode supports WEP security only.")); - } - - if (security == M2M_WIFI_SEC_WEP && args[1].u_obj == MP_OBJ_NULL) { - mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Missing WEP key!")); - } - - if (security != M2M_WIFI_SEC_OPEN) { - key = mp_obj_str_get_str(args[1].u_obj); - } - - // get channel - mp_uint_t channel = args[3].u_int; - - // Initialize WiFi in AP mode. - if (winc_start_ap(ssid, security, key, channel) != 0) { - mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("failed to start in AP mode")); - } - - printf("AP mode started. You can connect to %s.\r\n", ssid); return mp_const_none; } @@ -569,8 +559,8 @@ static int py_winc_socket_ioctl(mod_network_socket_obj_t *socket, mp_uint_t requ return -1; } +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_winc_active_obj, 1, 2, py_winc_active); static MP_DEFINE_CONST_FUN_OBJ_KW(py_winc_connect_obj, 1, py_winc_connect); -static MP_DEFINE_CONST_FUN_OBJ_KW(py_winc_start_ap_obj,1, py_winc_start_ap); static MP_DEFINE_CONST_FUN_OBJ_1(py_winc_disconnect_obj, py_winc_disconnect); static MP_DEFINE_CONST_FUN_OBJ_1(py_winc_isconnected_obj, py_winc_isconnected); static MP_DEFINE_CONST_FUN_OBJ_1(py_winc_connected_sta_obj, py_winc_connected_sta); @@ -583,30 +573,32 @@ static MP_DEFINE_CONST_FUN_OBJ_1(py_winc_fw_version_obj, py_winc_fw_version); static MP_DEFINE_CONST_FUN_OBJ_2(py_winc_fw_dump_obj, py_winc_fw_dump); static MP_DEFINE_CONST_FUN_OBJ_2(py_winc_fw_update_obj, py_winc_fw_update); -static const mp_map_elem_t winc_locals_dict_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&py_winc_connect_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_start_ap), (mp_obj_t)&py_winc_start_ap_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_disconnect), (mp_obj_t)&py_winc_disconnect_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_isconnected), (mp_obj_t)&py_winc_isconnected_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_connected_sta), (mp_obj_t)&py_winc_connected_sta_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_wait_for_sta), (mp_obj_t)&py_winc_wait_for_sta_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_ifconfig), (mp_obj_t)&py_winc_ifconfig_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_netinfo), (mp_obj_t)&py_winc_netinfo_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_scan), (mp_obj_t)&py_winc_scan_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_rssi), (mp_obj_t)&py_winc_get_rssi_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_fw_version), (mp_obj_t)&py_winc_fw_version_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_fw_dump), (mp_obj_t)&py_winc_fw_dump_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_fw_update), (mp_obj_t)&py_winc_fw_update_obj }, +static const mp_rom_map_elem_t winc_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_active), MP_ROM_PTR(&py_winc_active_obj) }, + { MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&py_winc_connect_obj) }, + { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&py_winc_connect_obj) }, + { MP_ROM_QSTR(MP_QSTR_start_ap), MP_ROM_PTR(&py_winc_connect_obj) }, + { MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&py_winc_disconnect_obj) }, + { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&py_winc_isconnected_obj) }, + { MP_ROM_QSTR(MP_QSTR_connected_sta), MP_ROM_PTR(&py_winc_connected_sta_obj) }, + { MP_ROM_QSTR(MP_QSTR_wait_for_sta), MP_ROM_PTR(&py_winc_wait_for_sta_obj) }, + { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&py_winc_ifconfig_obj) }, + { MP_ROM_QSTR(MP_QSTR_netinfo), MP_ROM_PTR(&py_winc_netinfo_obj) }, + { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&py_winc_scan_obj) }, + { MP_ROM_QSTR(MP_QSTR_rssi), MP_ROM_PTR(&py_winc_get_rssi_obj) }, + { MP_ROM_QSTR(MP_QSTR_fw_version), MP_ROM_PTR(&py_winc_fw_version_obj) }, + { MP_ROM_QSTR(MP_QSTR_fw_dump), MP_ROM_PTR(&py_winc_fw_dump_obj) }, + { MP_ROM_QSTR(MP_QSTR_fw_update), MP_ROM_PTR(&py_winc_fw_update_obj) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_OPEN), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_OPEN) }, // Network is not secured. - { MP_OBJ_NEW_QSTR(MP_QSTR_WEP), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_WEP) }, // Security type WEP (40 or 104) OPEN OR SHARED. - { MP_OBJ_NEW_QSTR(MP_QSTR_WPA_PSK), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_WPA_PSK) },// Network secured with WPA/WPA2 personal(PSK). - { MP_OBJ_NEW_QSTR(MP_QSTR_802_1X), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_802_1X) }, // Network is secured with WPA/WPA2 Enterprise. - { MP_OBJ_NEW_QSTR(MP_QSTR_MODE_STA), MP_OBJ_NEW_SMALL_INT(WINC_MODE_STA) }, // Start in Staion mode. - { MP_OBJ_NEW_QSTR(MP_QSTR_MODE_AP), MP_OBJ_NEW_SMALL_INT(WINC_MODE_AP) }, // Start in Access Point mode. - { MP_OBJ_NEW_QSTR(MP_QSTR_MODE_P2P), MP_OBJ_NEW_SMALL_INT(WINC_MODE_P2P) }, // Start in P2P (WiFi Direct) mode. - { MP_OBJ_NEW_QSTR(MP_QSTR_MODE_BSP), MP_OBJ_NEW_SMALL_INT(WINC_MODE_BSP) }, // Init BSP. - { MP_OBJ_NEW_QSTR(MP_QSTR_MODE_FIRMWARE), MP_OBJ_NEW_SMALL_INT(WINC_MODE_FIRMWARE) }, // Start in Firmware Upgrade mode. + { MP_ROM_QSTR(MP_QSTR_OPEN), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_OPEN) }, // Network is not secured. + { MP_ROM_QSTR(MP_QSTR_WEP), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_WEP) }, // Security type WEP. + { MP_ROM_QSTR(MP_QSTR_WPA_PSK), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_WPA_PSK) },// Network secured with WPA/WPA2 personal(PSK). + { MP_ROM_QSTR(MP_QSTR_802_1X), MP_OBJ_NEW_SMALL_INT(M2M_WIFI_SEC_802_1X) }, // Network is secured with WPA/WPA2 Enterprise. + { MP_ROM_QSTR(MP_QSTR_MODE_STA), MP_OBJ_NEW_SMALL_INT(WINC_MODE_STA) }, // Start in Staion mode. + { MP_ROM_QSTR(MP_QSTR_MODE_AP), MP_OBJ_NEW_SMALL_INT(WINC_MODE_AP) }, // Start in Access Point mode. + { MP_ROM_QSTR(MP_QSTR_MODE_P2P), MP_OBJ_NEW_SMALL_INT(WINC_MODE_P2P) }, // Start in P2P (WiFi Direct) mode. + { MP_ROM_QSTR(MP_QSTR_MODE_BSP), MP_OBJ_NEW_SMALL_INT(WINC_MODE_BSP) }, // Init BSP. + { MP_ROM_QSTR(MP_QSTR_MODE_FIRMWARE), MP_OBJ_NEW_SMALL_INT(WINC_MODE_FIRMWARE) }, // Start in Firmware Upgrade mode. }; static MP_DEFINE_CONST_DICT(winc_locals_dict, winc_locals_dict_table);