// method socket.setblocking(flag) STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t blocking) { if (mp_obj_is_true(blocking)) { return socket_settimeout(self_in, mp_const_none); } else { return socket_settimeout(self_in, MP_OBJ_NEW_SMALL_INT(0)); } }
sys_result comm_receive(modem_socket_t * socket) { sys_result result; if(socket->state_handle.state == COMM_RECEIVE_RX) { if(socket->state_handle.substate == COMM_RECEIVE_INVOKE) { #ifdef LOG_COMMRECEIVE printf("socket(%d) receive...\r\n", socket->socket_id); #endif // prepare the socket receive buffer memset(socket->rx_buffer, '\0', SOCKET_BUFFER_LEN+1); socket->bytes_received = 0; socket_entersubstate(socket, COMM_RECEIVE_WAITREPLY); socket_settimeout(socket, DEFAULT_COMM_SOCKETRECEIVE_TIMEOUT); result = SYS_OK; } else if(socket->state_handle.substate == COMM_RECEIVE_WAITREPLY) { // if we receive bytes we need to copy the data and signal the // function to return // if(socket->bytes_received > 0) { // socket->event_handler->on_datareceive(socket->rx_buffer, socket->bytes_received); // memset(socket->rx_buffer, '\0', SOCKET_BUFFER_LEN+1); // xSemaphoreGive(tcp_receive_signal); // } // wait up to n seconds. if(socket_timeout(socket)) { socket->socket_error = SCK_ERR_TIMEOUT; #ifdef LOG_COMMRECEIVE printf("socket(%d) receive timeout\r\n", socket->socket_id); #endif // TODO: review for proper transition after receive comm_enterstate(socket, COMM_IDLE); socket_exitstate(socket); xSemaphoreGive(tcp_receive_signal); result = SYS_OK; } // // if we receive bytes we need to copy the data and signal the // // function to return if(socket->bytes_received > 0) { socket->event_handler->on_datareceive(socket->rx_buffer, socket->bytes_received); memset(socket->rx_buffer, '\0', SOCKET_BUFFER_LEN+1); xSemaphoreGive(tcp_receive_signal); } result = SYS_OK; } } return result; }
sys_result comm_close(modem_socket_t * socket) { sys_result result; if(socket->state_handle.state == COMM_CLOSE_CONNECTION) { if(socket->state_handle.substate == COMM_CLOSE_INVOKE) { printf("socket(%d) close...\r\n", socket->socket_id); modem_socketclose(socket); socket_entersubstate(socket, COMM_CLOSE_WAITREPLY); socket_settimeout(socket, DEFAULT_COMM_SOCKETCLOSE_TIMEOUT); result = SYS_OK; } else if(socket->state_handle.substate == COMM_CLOSE_WAITREPLY) { if(socket_timeout(socket)) { printf("socket(%d) close timeout.\r\n", socket->socket_id); comm_enterstate(socket, COMM_IDLE); socket_exitstate(socket); xSemaphoreGive(tcp_close_signal); } result = modem_handle_socketclose(socket); if(result == SYS_AT_OK) { socket->socket_status = SCK_CLOSED; comm_enterstate(socket, COMM_IDLE); socket_exitstate(socket); xSemaphoreGive(tcp_close_signal); } else if (result == SYS_ERR_AT_NOCARRIER) { comm_enterstate(socket, COMM_IDLE); socket_exitstate(socket); xSemaphoreGive(tcp_close_signal); }else if (result == SYS_ERR_AT_TIMEOUT) { comm_enterstate(socket, COMM_IDLE); socket_exitstate(socket); xSemaphoreGive(tcp_close_signal); } } return result; } return result; }
sys_result comm_idle(modem_socket_t * socket) { sys_result result; if(socket->state_handle.state == COMM_IDLE_SETTIMEOUT) { printf("socket(%d) idle.\r\n", socket->socket_id); printf("wait %d sec.\r\n", DEFAULT_COMM_IDLE_TIMEOUT/1000); socket_enterstate(socket, COMM_IDLE_WAITTIMEOUT); socket_settimeout(socket, DEFAULT_COMM_IDLE_TIMEOUT); result = SYS_OK; } else if(socket->state_handle.state == COMM_IDLE_WAITTIMEOUT) { if(socket_timeout(socket)) { socket_enterstate(socket, COMM_IDLE_SETTIMEOUT); result = SYS_OK; } } return result; }