diff --git a/src/omv/boards/OPENMV2/imlib_config.h b/src/omv/boards/OPENMV2/imlib_config.h index 35f79ddee..573609a02 100644 --- a/src/omv/boards/OPENMV2/imlib_config.h +++ b/src/omv/boards/OPENMV2/imlib_config.h @@ -12,6 +12,9 @@ // Enable flood_fill() //#define IMLIB_ENABLE_FLOOD_FILL +// Enable mean() +//#define IMLIB_ENABLE_MEAN + // Enable median() //#define IMLIB_ENABLE_MEDIAN diff --git a/src/omv/boards/OPENMV3/imlib_config.h b/src/omv/boards/OPENMV3/imlib_config.h index 1fe2b50af..87aeaf5a8 100644 --- a/src/omv/boards/OPENMV3/imlib_config.h +++ b/src/omv/boards/OPENMV3/imlib_config.h @@ -15,6 +15,9 @@ // Enable flood_fill() #define IMLIB_ENABLE_FLOOD_FILL +// Enable mean() +#define IMLIB_ENABLE_MEAN + // Enable median() #define IMLIB_ENABLE_MEDIAN diff --git a/src/omv/boards/OPENMV4/imlib_config.h b/src/omv/boards/OPENMV4/imlib_config.h index b23c425ff..2a555caa6 100644 --- a/src/omv/boards/OPENMV4/imlib_config.h +++ b/src/omv/boards/OPENMV4/imlib_config.h @@ -15,6 +15,9 @@ // Enable flood_fill() #define IMLIB_ENABLE_FLOOD_FILL +// Enable mean() +#define IMLIB_ENABLE_MEAN + // Enable median() #define IMLIB_ENABLE_MEDIAN diff --git a/src/omv/img/filter.c b/src/omv/img/filter.c index e0ff2d8b8..b5b2e3038 100644 --- a/src/omv/img/filter.c +++ b/src/omv/img/filter.c @@ -112,6 +112,7 @@ void imlib_histeq(image_t *img, image_t *mask) // ... // ksize == n -> ((n*2)+1)x((n*2)+1) kernel +#ifdef IMLIB_ENABLE_MEAN void imlib_mean_filter(image_t *img, const int ksize, bool threshold, int offset, bool invert, image_t *mask) { int brows = ksize + 1; @@ -298,6 +299,7 @@ void imlib_mean_filter(image_t *img, const int ksize, bool threshold, int offset } } } +#endif // IMLIB_ENABLE_MEAN #ifdef IMLIB_ENABLE_MEDIAN void imlib_median_filter(image_t *img, const int ksize, float percentile, bool threshold, int offset, bool invert, image_t *mask) diff --git a/src/omv/main.c b/src/omv/main.c index b13afb0a4..b61ca9b8d 100644 --- a/src/omv/main.c +++ b/src/omv/main.c @@ -300,14 +300,24 @@ int ini_handler_callback(void *user, const char *section, const char *name, cons openmv_config->wifidbg = ini_is_true(value); } else if (MATCH("WiFiConfig", "Mode")) { openmv_config->wifidbg_config.mode = ini_atoi(value); - } else if (MATCH("WiFiConfig", "SSID")) { - strncpy(openmv_config->wifidbg_config.ssid, value, WINC_MAX_SSID_LEN); - } else if (MATCH("WiFiConfig", "Key")) { - strncpy(openmv_config->wifidbg_config.key, value, WINC_MAX_PSK_LEN); - } else if (MATCH("WiFiConfig", "Security")) { - openmv_config->wifidbg_config.security = ini_atoi(value); - } else if (MATCH("WiFiConfig", "Channel")) { - openmv_config->wifidbg_config.channel = ini_atoi(value); + } else if (MATCH("WiFiConfig", "ClientSSID")) { + strncpy(openmv_config->wifidbg_config.client_ssid, value, WINC_MAX_SSID_LEN); + } else if (MATCH("WiFiConfig", "ClientKey")) { + strncpy(openmv_config->wifidbg_config.client_key, value, WINC_MAX_PSK_LEN); + } else if (MATCH("WiFiConfig", "ClientSecurity")) { + openmv_config->wifidbg_config.client_security = ini_atoi(value); + } else if (MATCH("WiFiConfig", "ClientChannel")) { + openmv_config->wifidbg_config.client_channel = ini_atoi(value); + } else if (MATCH("WiFiConfig", "AccessPointSSID")) { + strncpy(openmv_config->wifidbg_config.access_point_ssid, value, WINC_MAX_SSID_LEN); + } else if (MATCH("WiFiConfig", "AccessPointKey")) { + strncpy(openmv_config->wifidbg_config.access_point_key, value, WINC_MAX_PSK_LEN); + } else if (MATCH("WiFiConfig", "AccessPointSecurity")) { + openmv_config->wifidbg_config.access_point_security = ini_atoi(value); + } else if (MATCH("WiFiConfig", "AccessPointChannel")) { + openmv_config->wifidbg_config.access_point_channel = ini_atoi(value); + } else if (MATCH("WiFiConfig", "BoardName")) { + strncpy(openmv_config->wifidbg_config.board_name, value, WINC_MAX_BOARD_NAME_LEN); } else { return 0; } diff --git a/src/omv/py/py_image.c b/src/omv/py/py_image.c index 90c3b8ee2..7c7c83f76 100644 --- a/src/omv/py/py_image.c +++ b/src/omv/py/py_image.c @@ -2066,6 +2066,7 @@ static mp_obj_t py_image_histeq(uint n_args, const mp_obj_t *args, mp_map_t *kw_ } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_histeq_obj, 1, py_image_histeq); +#ifdef IMLIB_ENABLE_MEAN STATIC mp_obj_t py_image_mean(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { image_t *arg_img = @@ -2087,6 +2088,7 @@ STATIC mp_obj_t py_image_mean(uint n_args, const mp_obj_t *args, mp_map_t *kw_ar return args[0]; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_mean_obj, 2, py_image_mean); +#endif // IMLIB_ENABLE_MEAN #ifdef IMLIB_ENABLE_MEDIAN STATIC mp_obj_t py_image_median(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) @@ -5322,7 +5324,11 @@ static const mp_rom_map_elem_t locals_dict_table[] = { #endif /* Filtering Methods */ {MP_ROM_QSTR(MP_QSTR_histeq), MP_ROM_PTR(&py_image_histeq_obj)}, +#ifdef IMLIB_ENABLE_MEAN {MP_ROM_QSTR(MP_QSTR_mean), MP_ROM_PTR(&py_image_mean_obj)}, +#else + {MP_ROM_QSTR(MP_QSTR_mean), MP_ROM_PTR(&py_func_unavailable_obj)}, +#endif #ifdef IMLIB_ENABLE_MEDIAN {MP_ROM_QSTR(MP_QSTR_median), MP_ROM_PTR(&py_image_median_obj)}, #else diff --git a/src/omv/wifidbg.c b/src/omv/wifidbg.c index d73717dd2..d089ff299 100644 --- a/src/omv/wifidbg.c +++ b/src/omv/wifidbg.c @@ -30,16 +30,23 @@ #define MIN(x, y) ((x) < (y) ? (x) : (y)) #endif -#define SERVER_ADDR ((uint8_t [5]){192, 168, 1, 1}) -#define SERVER_PORT (9000) -#define BUFFER_SIZE (512) +#define OPENMVCAM_BROADCAST_ADDR ((uint8_t [5]){255, 255, 255, 255}) +#define OPENMVCAM_BROADCAST_PORT (0xABD1) +#define SERVER_ADDR ((uint8_t [5]){192, 168, 1, 1}) +#define SERVER_PORT (9000) +#define BUFFER_SIZE (512) + +#define UDPCAST_STRING "%d.%d.%d.%d:%d:%s" +#define UDPCAST_STRING_SIZE 4+4+4+4+6+WINC_MAX_BOARD_NAME_LEN+1 #define close_all_sockets() \ do { \ winc_socket_close(client_fd); \ winc_socket_close(server_fd); \ + winc_socket_close(udpbcast_fd); \ client_fd = -1; \ server_fd = -1; \ + udpbcast_fd = -1; \ } while (0) #define close_server_socket() \ @@ -48,25 +55,71 @@ server_fd = -1; \ } while (0) +#define close_udpbcast_socket() \ + do { \ + winc_socket_close(udpbcast_fd); \ + udpbcast_fd = -1; \ + } while (0) + #define TIMEDOUT(x) (x == -ETIMEDOUT || x == SOCK_ERR_TIMEOUT) static int client_fd = -1; static int server_fd = -1; +static int udpbcast_fd = -1; +static int udpbcast_time = 0; +static uint8_t ip_addr[WINC_IP_ADDR_LEN] = {}; +static char udpbcast_string[UDPCAST_STRING_SIZE] = {}; int wifidbg_init(wifidbg_config_t *config) { client_fd = -1; server_fd = -1; + udpbcast_fd = -1; - // Initialize WiFi in AP mode. - if (winc_init(WINC_MODE_AP) != 0) { - return -1; + if(!config->mode) { // STA Mode + + // Initialize WiFi in STA mode. + if (winc_init(WINC_MODE_STA) != 0) { + return -1; + } + + // Connect to network. + if (winc_connect(config->client_ssid, + config->client_security, + config->client_key, + config->client_channel) != 0) { + return -2; + } + + winc_ifconfig_t ifconfig; + + if (winc_ifconfig(&ifconfig) < 0) { + return -3; + } + + memcpy(ip_addr, ifconfig.ip_addr, WINC_IP_ADDR_LEN); + + } else { // AP Mode + + // Initialize WiFi in AP mode. + if (winc_init(WINC_MODE_AP) != 0) { + return -1; + } + + // Start WiFi in AP mode. + if (winc_start_ap(config->access_point_ssid, + config->access_point_security, + config->access_point_key, + config->access_point_channel) != 0) { + return -2; + } + + memcpy(ip_addr, SERVER_ADDR, WINC_IP_ADDR_LEN); } - // Start WiFi in AP mode. - if (winc_start_ap(config->ssid, config->security, config->key, config->channel) != 0) { - return -2; - } + snprintf(udpbcast_string, UDPCAST_STRING_SIZE, UDPCAST_STRING, + ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3], + SERVER_PORT, config->board_name); return 0; } @@ -77,9 +130,35 @@ void wifidbg_dispatch() uint8_t buf[BUFFER_SIZE]; sockaddr client_sockaddr; + if (udpbcast_fd < 0) { + // Create broadcast socket + MAKE_SOCKADDR(udpbcast_sockaddr, OPENMVCAM_BROADCAST_ADDR, OPENMVCAM_BROADCAST_PORT) + + if ((udpbcast_fd = winc_socket_socket(SOCK_DGRAM)) < 0) { + return; + } + + if ((ret = winc_socket_bind(udpbcast_fd, &udpbcast_sockaddr)) < 0) { + close_udpbcast_socket(); + return; + } + } + + if ((udpbcast_fd >= 0) && (!(udpbcast_time++ % 100))) { + // Create broadcast socket + MAKE_SOCKADDR(udpbcast_sockaddr, OPENMVCAM_BROADCAST_ADDR, OPENMVCAM_BROADCAST_PORT) + + if ((ret = winc_socket_sendto(udpbcast_fd, + (uint8_t *) udpbcast_string, strlen(udpbcast_string) + 1, + &udpbcast_sockaddr, 500)) < 0) { + close_udpbcast_socket(); + return; + } + } + if (server_fd < 0) { // Create server socket - MAKE_SOCKADDR(server_sockaddr, SERVER_ADDR, SERVER_PORT) + MAKE_SOCKADDR(server_sockaddr, ip_addr, SERVER_PORT) if ((server_fd = winc_socket_socket(SOCK_STREAM)) < 0) { return; @@ -107,7 +186,6 @@ void wifidbg_dispatch() } return; } - } if ((ret = winc_socket_recv(client_fd, buf, 8, 10)) < 0) { diff --git a/src/omv/wifidbg.h b/src/omv/wifidbg.h index afecf8384..75b487dee 100644 --- a/src/omv/wifidbg.h +++ b/src/omv/wifidbg.h @@ -8,12 +8,14 @@ typedef struct wifidbg_config { winc_mode_t mode; - winc_security_t security; - char key[WINC_MAX_PSK_LEN + 1]; - char ssid[WINC_MAX_SSID_LEN + 1]; - uint8_t channel; + winc_security_t client_security, access_point_security; + char client_key[WINC_MAX_PSK_LEN + 1], access_point_key[WINC_MAX_PSK_LEN + 1]; + char client_ssid[WINC_MAX_SSID_LEN + 1], access_point_ssid[WINC_MAX_SSID_LEN + 1]; + uint8_t client_channel, access_point_channel; + char board_name[WINC_MAX_BOARD_NAME_LEN + 1]; } wifidbg_config_t; -void wifidbg_dispatch(); int wifidbg_init(wifidbg_config_t *config); +void wifidbg_dispatch(); + #endif /* __WIFIDBG_H__ */ diff --git a/src/winc1500/include/winc.h b/src/winc1500/include/winc.h index dc8ead3c7..daef54db2 100644 --- a/src/winc1500/include/winc.h +++ b/src/winc1500/include/winc.h @@ -9,10 +9,11 @@ #ifndef __WINC_H__ #define __WINC_H__ #include -#define WINC_IP_ADDR_LEN (4) -#define WINC_MAC_ADDR_LEN (6) -#define WINC_MAX_SSID_LEN (33) -#define WINC_MAX_PSK_LEN (65) +#define WINC_IP_ADDR_LEN (4) +#define WINC_MAC_ADDR_LEN (6) +#define WINC_MAX_SSID_LEN (33) +#define WINC_MAX_PSK_LEN (65) +#define WINC_MAX_BOARD_NAME_LEN (33) #define MAKE_SOCKADDR(addr, ip, port) \ struct sockaddr addr; \ @@ -40,11 +41,11 @@ typedef enum { } winc_mode_t; typedef enum { - WINC_SEC_INVALID = 0, - WINC_SEC_OPEN, - WINC_SEC_WPA_PSK, - WINC_SEC_WEP, - WINC_SEC_802_1X + WINC_SEC_INVALID = 0, + WINC_SEC_OPEN, + WINC_SEC_WPA_PSK, + WINC_SEC_WEP, + WINC_SEC_802_1X } winc_security_t; typedef struct { @@ -56,23 +57,23 @@ typedef struct { } winc_ifconfig_t; typedef struct { - int8_t rssi; - uint8_t security; + int8_t rssi; + uint8_t security; uint8_t channel; - uint8_t bssid[6]; - char ssid[WINC_MAX_SSID_LEN]; + uint8_t bssid[6]; + char ssid[WINC_MAX_SSID_LEN]; } winc_scan_result_t; typedef int (*winc_scan_callback_t) (winc_scan_result_t *, void *); typedef struct { - uint8_t fw_major; // Firmware version major number. - uint8_t fw_minor; // Firmware version minor number. - uint8_t fw_patch; // Firmware version patch number. - uint8_t drv_major; // Driver version major number. - uint8_t drv_minor; // Driver version minor number. - uint8_t drv_patch; // Driver version patch number. - uint32_t chip_id; // HW revision number (chip ID). + uint8_t fw_major; // Firmware version major number. + uint8_t fw_minor; // Firmware version minor number. + uint8_t fw_patch; // Firmware version patch number. + uint8_t drv_major; // Driver version major number. + uint8_t drv_minor; // Driver version minor number. + uint8_t drv_patch; // Driver version patch number. + uint32_t chip_id; // HW revision number (chip ID). } winc_fwver_t; typedef struct { @@ -110,4 +111,5 @@ int winc_socket_recv(int fd, uint8_t *buf, uint32_t len, uint32_t timeout); int winc_socket_sendto(int fd, const uint8_t *buf, uint32_t len, sockaddr *addr, uint32_t timeout); int winc_socket_recvfrom(int fd, uint8_t *buf, uint32_t len, sockaddr *addr, uint32_t timeout); int winc_socket_setsockopt(int fd, uint32_t level, uint32_t opt, const void *optval, uint32_t optlen); + #endif //__WINC_H__