/** * @brief This function notify user about link status changement. * @param netif: the network interface * @retval None */ void ethernetif_notify_conn_changed(struct netif *netif) { struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; if(netif_is_link_up(netif)) { VNC_SERVER_LogMessage ("Cable is now connected."); /* Update DHCP state machine */ VNC_State = VNC_LINK_UP; VNC_SERVER_StatusChanged(VNC_LINK_UP); netif_set_addr(netif, &ipaddr , &netmask, &gw); /* When the netif is fully configured this function must be called.*/ netif_set_up(netif); } else { /* Update DHCP state machine */ VNC_State = VNC_LINK_DOWN; /* When the netif link is down this function must be called.*/ netif_set_down(netif); VNC_SERVER_LogMessage ("Cable is not connected."); closesocket(_Sock); } }
/** * @brief Initializes audio * @param None. * @retval Audio state. */ void VNC_SERVER_Start (void) { if(is_initialized == 0) { is_initialized = 1; /* Create tcp_ip stack thread */ tcpip_init(NULL, NULL); /* Initialize the LwIP stack */ Netif_Config(); /* Check connection */ if (netif_is_up(&gnetif)) { /* Update VNC state machine */ VNC_State = VNC_LINK_UP; VNC_SERVER_StatusChanged(VNC_LINK_UP); } else { /* Update VNC state machine */ VNC_State = VNC_LINK_DOWN; VNC_SERVER_LogMessage ("Cable is not connected \n"); VNC_SERVER_StatusChanged(VNC_LINK_DOWN); } } else if(VNC_State == VNC_INIT) { /* Check connection */ if (netif_is_up(&gnetif)) { /* Update VNC state machine */ VNC_State = VNC_LINK_UP; VNC_SERVER_StatusChanged(VNC_LINK_UP); } else { /* Update VNC state machine */ VNC_State = VNC_LINK_DOWN; VNC_SERVER_LogMessage ("Cable is not connected \n"); VNC_SERVER_StatusChanged(VNC_LINK_DOWN); } } /* Start VNC Task */ if(VNC_ThreadId == 0) { osThreadDef(VNC, VNC_Thread, osPriorityAboveNormal, 0, 1024); VNC_ThreadId = osThreadCreate (osThread(VNC), NULL); } }
/** * @brief VNC server thread process * @param argument: not used * @retval none */ static void VNC_Process( void) { static int s; static uint8_t Is_SocketAssigned = 0; u32_t AddrLen; U16 Port; if(Is_SocketAssigned == 0) { Is_SocketAssigned = 1; /* Prepare socket (one time setup) Default port for VNC is is 590x, where x is the 0-based layer index */ Port = 5900 + _Context.ServerIndex; /* Loop until we get a socket into listening state */ do { s = _ListenAtTcpAddr(Port); if (s != -1) { break; } vTaskDelay(100); /* Try again */ } while (1); } VNC_SERVER_StatusChanged(VNC_CONN_ESTABLISHED); /* Loop once per client and create a thread for the actual server */ while (VNC_State == VNC_PROCESS) { /* Wait for an incoming connection */ AddrLen = sizeof(_Addr); Connection_accepted = 1; if ((_Sock = accept(s, (struct sockaddr*)&_Addr, &AddrLen)) < 1) { closesocket(_Sock); vTaskDelay(100); continue; /* Error */ } Connection_accepted = 0; VNC_SERVER_LogMessage ("Connected to VNC Client"); GUI_VNC_Process(&_Context, _Send, _Recv, (void *)_Sock); VNC_SERVER_LogMessage ((char *)iptxt); /* Close the connection */ closesocket(_Sock); } }
/** * @brief Initializes audio * @param None. * @retval Audio state. */ void VNC_SERVER_Stop (void) { VNC_State = VNC_IDLE; if(!Connection_accepted) closesocket(_Sock); VNC_SERVER_StatusChanged(VNC_IDLE); VNC_SERVER_LogMessage ("VNC Connection OFF"); if(VNC_ThreadId != 0) { osThreadTerminate(VNC_ThreadId); VNC_ThreadId = 0; } }
static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int Id, NCode; switch (pMsg->MsgId) { case WM_INIT_DIALOG: hItem = BUTTON_CreateEx(420, 0, 60, 60, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_EXIT); WM_SetCallback(hItem, _cbButton_exit); hItem = WM_GetDialogItem(pMsg->hWin, ID_VNC_CONNECTION); IMAGE_SetBitmap(hItem, &bmconnection_ko); hItem = BUTTON_CreateEx(315, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, START_VNC); WM_SetCallback(hItem, _cbButton_start); hItem = BUTTON_CreateEx(380, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, GO_BACKGROUND); WM_SetCallback(hItem, _cbButton_bg); hItem = BUTTON_CreateEx(245, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, ID_LOCK); WM_SetCallback(hItem, _cbButton_lock); hItem = WM_GetDialogItem(pMsg->hWin, GO_BACKGROUND); BUTTON_SetFont(hItem, &GUI_FontLubalGraph16B); break; case WM_PAINT: GUI_SetColor(GUI_STCOLOR_LIGHTBLUE); GUI_SetPenSize(5); GUI_DrawBitmap(&bmconnect, 7, 45); GUI_DrawCircle(332, 215, 40); GUI_AA_FillCircle(332, 215, 45); GUI_AA_FillRoundedRect(230, 182, 440, 250, 20); GUI_SetColor(GUI_WHITE); GUI_AA_FillCircle(332, 215, 42); GUI_SetBkColor(GUI_WHITE); GUI_AA_FillRoundedRect(233, 185, 437, 247, 20); GUI_SetColor(GUI_STCOLOR_LIGHTBLUE); GUI_AA_FillCircle(332, 215, 33); break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ switch(Id) { case START_VNC: /* Notifications sent by 'Start' */ switch(NCode) { case WM_NOTIFICATION_RELEASED: if((VNC_GetState() == VNC_IDLE)|| (VNC_GetState() == VNC_INIT)) { VNC_SERVER_LogMessage("Starting VNC connection..."); hItem = WM_GetDialogItem(pMsg->hWin, ID_VNC_CONNECTION); IMAGE_SetBitmap(hItem, &bmno_connection); VNC_SetState (VNC_INIT); WM_Exec(); VNC_SERVER_Start(); } else { VNC_SERVER_Stop(); } break; case WM_NOTIFICATION_CLICKED: hItem = WM_GetDialogItem(pMsg->hWin, START_VNC); WM_InvalidateWindow(hItem); WM_Update(hItem); break; } break; case GO_BACKGROUND: /* Notifications sent by 'Background' */ switch(NCode) { case WM_NOTIFICATION_RELEASED: WM_HideWindow(pMsg->hWin); module_prop[k_ModuleGetIndex(&vnc_server)].win_state = 1; ST_AnimatedIconView_SetItemText(hIcon,k_ModuleGetIndex(&vnc_server),"vnc server[B]"); ST_AnimatedIconView_SetDualTextColor(hIcon, ICONVIEW_CI_SEL, GUI_STCOLOR_LIGHTBLUE, GUI_STCOLOR_DARKBLUE ); break; } break; case ID_BUTTON_EXIT: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VNC_GetState() != VNC_IDLE) { VNC_SERVER_Stop(); } GUI_EndDialog(pMsg->hWin, 0); break; } break; case ID_LOCK: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VNC_GetState() == VNC_IDLE) { if(VNC_GetLockState()) { VNC_SetLockState(0); } else { VNC_SetLockState(1); } } break; } break; } break; default: WM_DefaultProc(pMsg); break; } }
/** * @brief VNC Thread * @param argument: network interface * @retval None */ void VNC_Thread(void const * argument) { for (;;) { switch (VNC_State) { case VNC_LINK_UP: { gnetif.ip_addr.addr = 0; gnetif.netmask.addr = 0; gnetif.gw.addr = 0; dhcp_start(&gnetif); VNC_State = VNC_WAIT_FOR_ADDRESS; VNC_SERVER_LogMessage ("Waiting for DHCP server...\n"); VNC_SERVER_StatusChanged(VNC_WAIT_FOR_ADDRESS); } break; case VNC_WAIT_FOR_ADDRESS: { if (gnetif.ip_addr.addr!=0) { dhcp_stop(&gnetif); VNC_State = VNC_START; VNC_SERVER_StatusChanged(VNC_START); } else { /* DHCP timeout */ if (gnetif.dhcp->tries > MAX_DHCP_TRIES) { VNC_State = VNC_ERROR; dhcp_stop(&gnetif); VNC_SERVER_LogMessage ("No reply from DHCP Server!\n"); } } } break; case VNC_START: sprintf((char*)iptxt, "IP address : %d.%d.%d.%d\n", (uint8_t)(gnetif.ip_addr.addr), (uint8_t)((gnetif.ip_addr.addr) >> 8), (uint8_t)((gnetif.ip_addr.addr) >> 16), (uint8_t)((gnetif.ip_addr.addr) >> 24)); VNC_SERVER_LogMessage ((char *)iptxt); /* Init VNC context and attach to layer (so context is updated if the display-layer-contents change */ GUI_VNC_AttachToLayer(&_Context, 0); _Context.ServerIndex = 0; GUI_VNC_SetProgName ("STM32 VNC Server"); if(VNC_LockState) { GUI_VNC_SetPassword((U8 *)"STM32"); } else { GUI_VNC_SetAuthentication(NULL); } VNC_State = VNC_PROCESS; break; case VNC_PROCESS: VNC_Process(); break; case VNC_IDLE: break; default: break; } osDelay(250); } }