Example #1
0
void esp8266_module::wifi_cancelation(bool all)
{
	CSocket* sock;

	//cancel open waiting
	sock = (CSocket*)waiting_open;
	while(sock)
	{
		if(sock->mode1 || all)
		{
			sock->list_remove(waiting_open);
			usr_HND_SET_STATUS(sock, RES_SIG_IDLE);
			sock = (CSocket*)waiting_open;
		} else
		{
			sock = (CSocket*)sock->next;
		}
	}

	//cancel reading sockets
	for(int sid=0; sid < WIFI_ESP8266_MAX_SOCKETS; sid++)
	{
		sock = alloc_sockets[sid];
		if (  sock && (all || sock->mode1) && ((sock->res & RES_BUSY_WAITING) == RES_BUSY_WAITING))
		{
			usr_HND_SET_STATUS(sock, (sock->res & FLG_OK)| FLG_SIGNALED);
		}

	}

}
Example #2
0
void GWindow::notify_message(WM_MESSAGE code, unsigned int param, GObject* dst)
{
	GMessage msg(code, param, dst);

	GUI_WIN_TRACE("\r\n\e[4;1;34m%s >>  Notify ", CURRENT_TASK->name);
	GUI_WIN_TRACE("%X[%d] ( %s %X )\e[m", dst, (dst)?dst->id:-1, szlist_at(wm_dbg_str, code), param);
	Queue.push(msg);
	if(hnd.res == (FLG_BUSY | FLG_OK))
		usr_HND_SET_STATUS(&hnd, RES_SIG_OK);										//signals the window thread
}
Example #3
0
static inline void STOP_RX_HND(UART_Type *Uart, UART_DRIVER_INFO * drv_info, HANDLE hnd)
{
	STOP_RX(Uart);
	drv_info->drv_data->hnd_rcv = hnd->next;
	hnd->len = drv_info->drv_data->rx_remaining;
	usr_HND_SET_STATUS(hnd, RES_SIG_OK);
  	if( (hnd=drv_info->drv_data->hnd_rcv) )
      	START_RX_HND(Uart, drv_info, hnd);
  	else
		START_RX_BUF(Uart, drv_info, drv_info->drv_data);
}
Example #4
0
/** Stop receiving hnd
 *
 * @param pUsart
 * @param drv_data
 * @param hnd
 */
static void STOP_RX_HND(Usart*	pUsart, UART_DRIVER_DATA drv_data, HANDLE hnd)
{
	STOP_RX(pUsart);
	drv_data->hnd_rcv = hnd->next;
	hnd->len =pUsart->US_RCR;
	hnd->dst.as_int = pUsart->US_RPR;
	usr_HND_SET_STATUS(hnd, RES_SIG_OK);
  	if( (hnd=drv_data->hnd_rcv) )
      	START_RX_HND(pUsart, drv_data, hnd);
  	else
		START_RX_BUF(pUsart, drv_data);
}
Example #5
0
void DAC_ISR(DAC_DRIVER_INFO* drv_info)
{
	DAC_DRIVER_DATA* drv_data = drv_info->drv_data;
	DAC_TypeDef* dac = drv_info->hw_base;
	uint32_t status;
	HANDLE hnd;

	status = dac->DAC_SR & (DAC_SR_DMAUDR1 | DAC_SR_DMAUDR2);
	TRACELN("DAC isr %x", status);
	if(status)//reset peripheral
	{
		// stop handles
#if USE_DAC_DMA_DRIVER
		hnd = drv_data->pending[0];
		if(hnd)
		{
			drv_data->pending[0] = NULL;
			usr_HND_SET_STATUS(hnd, RES_SIG_ERROR);
		}
		hnd = drv_data->pending[1];
		if(hnd)
		{
			drv_data->pending[1] = NULL;
			usr_HND_SET_STATUS(hnd, RES_SIG_ERROR);
		}
#endif

		// clear status
		dac->DAC_SR = status;

		//reset peripheral
		ConfigureDac(drv_info);

		//reset channels
		if(drv_data->dac_mode[0])
			ConfigureDacChannel(dac, drv_data->dac_mode[0]);
		if(drv_data->dac_mode[1])
			ConfigureDacChannel(dac, drv_data->dac_mode[1]);
	}
}
Example #6
0
//*----------------------------------------------------------------------------
//*			ISR function
//*----------------------------------------------------------------------------
void UART_ISR(UART_INFO drv_info )
{
    HANDLE hnd;
    unsigned int status;
    Uart* pUart;
	UART_DRIVER_DATA drv_data;

	drv_data = drv_info->drv_data;
	pUart = drv_info->hw_base;

	status = pUart->UART_SR;
	status &=  pUart->UART_IMR;

	// check the transmitter
	if(status & UART_SR_TXBUFE)
	{
		pUart->UART_IDR = UART_IDR_TXBUFE;
      	if( (hnd=drv_data->hnd_snd) )
      	{
      		drv_data->hnd_snd = hnd->next;
      		hnd->len = 0;
  			hnd->src.as_int = pUart->UART_TPR;
			usr_HND_SET_STATUS(hnd, RES_SIG_OK);
	      	if( drv_data->hnd_snd )
	          	START_TX_HND(pUart, drv_data->hnd_snd);

      	}
	}

	//check the receiver
	if(status & UART_SR_ENDRX)
	{
      	if( (hnd=drv_data->hnd_rcv) )
      	{
			STOP_RX_HND(pUart, drv_data, hnd);

      	} else
			START_RX_BUF(pUart, drv_data);
	} else
	{
		// process tout
      	if( (hnd=drv_data->hnd_rcv) )
      		if(hnd->dst.as_int != pUart->UART_RPR)
      			if(drv_data->rtout)
          			if(!--drv_data->rtout)
          			{
        				STOP_RX_HND(pUart, drv_data, hnd);
          			}
	}


}
Example #7
0
void esp8266_module::wifi_process_tout(void)
{
	CSocket* sock;
	HANDLE list;
	RES_CODE res;

	if(wifi_tout)
	{
		if(!--wifi_tout)
		{
			if(!used_sockets)
			{
				//--- deactivate the context?
				for(int i=0; i < 3; i++ )
				{
					if(wifi_send_cmd("+CWQAP", 150) & WIFI_CMD_STATE_OK)
					{
						wifi_send_cmd("+CWJAP?", 50);
						break;
					}
				}
				wifi_on_disconnect(this);

				TRACELN1("WIFI OFF");

				list = waiting_open;
				waiting_open = NULL;
				while(list)
				{
					sock = (CSocket*)list;
					list = sock->next;
					sock->res = RES_BUSY;
					res = wifi_sock_open(sock);
					if(res & FLG_SIGNALED)
						usr_HND_SET_STATUS(sock, res);
				}
				if(!used_sockets)
					wifi_drv_off();
			}
		}
	}
}
Example #8
0
/** DACC Driver Interrupt
 *
 * @param drv_info
 */
void DACC_ISR(DACC_INFO drv_info )
{
  	DACC_DRIVER_DATA drv_data = drv_info->drv_data;
    Dacc* pDacc = drv_info->hw_base;

    if(pDacc->DACC_ISR & DACC_ISR_TXBUFE)
    {
        HANDLE hnd;

		pDacc->DACC_IDR = DACC_IDR_TXBUFE;
		if((hnd = drv_data->pending))
		{
      		hnd->len = 0;
  			hnd->src.as_int = pDacc->DACC_TPR;
      		drv_data->pending = hnd->next;
	      	if( drv_data->pending )
	          	START_TX_HND(pDacc, drv_data->pending);
			usr_HND_SET_STATUS(hnd, RES_SIG_OK);

		}
    }
}
Example #9
0
void DAC_DCR(DAC_DRIVER_INFO* drv_info, unsigned int reason, HANDLE hnd)
{
	DAC_DRIVER_DATA *drv_data = drv_info->drv_data;
	DAC_DRIVER_MODE *dac_mode = (DAC_DRIVER_MODE *)(hnd->mode.as_voidptr);

	switch(reason)
	{
		case DCR_RESET:
			RCCPeripheralReset(drv_info->info.peripheral_indx);
			RCCPeripheralDisable(drv_info->info.peripheral_indx); // ??? turn off
#if USE_DAC_DMA_DRIVER
        	drv_data->dac_dma_hnd[0].client.drv_index = drv_info->info.drv_index;
        	drv_data->dac_dma_hnd[1].client.drv_index = drv_info->info.drv_index;
#endif
			break;

		case DCR_OPEN:
		{
			if(dac_mode && dac_mode->dac_ch <2 && drv_data->dac_mode[dac_mode->dac_ch] == NULL)
			{
				if(!drv_data->dac_mode[0] && !drv_data->dac_mode[1])
				{
					if(!ConfigureDac(drv_info))
						break;
				}
				ConfigureDacChannel(drv_info->hw_base, dac_mode);

				drv_data->dac_mode[dac_mode->dac_ch] = dac_mode;
				hnd->res = RES_OK;
			}
			break;
		}

		case DCR_CLOSE:
#if USE_DAC_DMA_DRIVER
			drv_data->dac_dma_hnd[dac_mode->dac_ch].close();
#endif
			drv_data->dac_mode[dac_mode->dac_ch] = NULL;
			if(!drv_data->dac_mode[0] && !drv_data->dac_mode[1])
			{
				//Disable ?
				NVIC_DisableIRQ(drv_info->info.drv_index);
				RCCPeripheralDisable(drv_info->info.peripheral_indx);

				PIO_Free_List(drv_info->dac_pins);
			}
			break;

		case DCR_CANCEL:
			// can only cancel dma transfers
#if USE_DAC_DMA_DRIVER
			if(drv_data->dac_dma_hnd[dac_mode->dac_ch].res & FLG_BUSY)
				drv_data->dac_dma_hnd[dac_mode->dac_ch].hcontrol(DCR_CANCEL);
#endif
			break;


		case DCR_SIGNAL:
#if USE_DAC_DMA_DRIVER
			TRACELN1("DAC sig");
			if(hnd == &drv_data->dac_dma_hnd[0])
			{

				hnd = drv_data->pending[0];
				if(hnd)
				{
					if(hnd->len > drv_data->dac_dma_hnd[0].len)
					{
						hnd->src.as_byteptr += hnd->len - drv_data->dac_dma_hnd[0].len;
						hnd->len = drv_data->dac_dma_hnd[0].len;
					}
					drv_data->pending[0] = NULL;
					if (__get_CONTROL() & 2)
						usr_HND_SET_STATUS(hnd, RES_SIG_OK);
					else
						svc_HND_SET_STATUS(hnd, RES_SIG_OK);
				}
			} else
			{
				if(hnd == &drv_data->dac_dma_hnd[1])
				{

					hnd = drv_data->pending[1];
					if(hnd)
					{
						if(hnd->len > drv_data->dac_dma_hnd[1].len)
						{
							hnd->src.as_byteptr += hnd->len - drv_data->dac_dma_hnd[1].len;
							hnd->len = drv_data->dac_dma_hnd[1].len;
						}
						drv_data->pending[1] = NULL;
						usr_HND_SET_STATUS(hnd, RES_SIG_OK);
					}
				}
			}
#endif
			break;

	}
}
Example #10
0
void isr_SerilaDriver(UART_DRIVER_INFO* drv_info )
{
	UART_Type * Uart = drv_info->hw_base;
	UART_DRIVER_DATA * drv_data = drv_info->drv_data;
	HANDLE hnd;

	unsigned int Status = Uart->UARTIntStatus(true);
	Uart->UARTIntClear(Status);

	if( Status & UART_INT_TX)
	{
		if((hnd=drv_data->hnd_snd))
		{
			while(Uart->UARTSpaceAvail())
			{
				if(!hnd->len)
				{
					drv_data->hnd_snd = hnd->next;
					usr_HND_SET_STATUS(hnd, RES_SIG_OK);
					if(!(hnd=drv_data->hnd_snd))
					{
						STOP_TX(Uart);
						break;
					}
				}
				hnd->len--;
				Uart->DR = *hnd->src.as_charptr++;
			}
			if(hnd)
			{
				Uart->UARTTxIntModeSet(UART_TXINT_MODE_FIFO);
			}
		}
		else
		{
			STOP_TX(Uart);
		}
	}

	//check the receiver
    if(Status&(UART_INT_RT|UART_INT_RX))
    {
    	while(Uart->UARTCharsAvail())
    	{
    		drv_data->rx_remaining--;
    		*drv_data->rx_wrptr++ = Uart->DR;
    		if(drv_data->hnd_rcv && !drv_data->hnd_rcv->mode0)
    			drv_data->hnd_rcv->mode0 = 1;
    		if(!drv_data->rx_remaining )
    		{
    	    	if( (hnd=drv_data->hnd_rcv) )
    				STOP_RX_HND(Uart, drv_info, hnd);
    	      	else
    				START_RX_BUF(Uart, drv_info, drv_data);
    		}
#ifdef HW_VER_10
    		else
    		{
    			if(drv_data->mode.hw_flow && drv_info->info.drv_index != UART1_IRQn)
					if((!drv_data->hnd_rcv) && (drv_data->rx_remaining < (RX_BUF_SIZE/4)))
					{
						if(drv_info->uart_pins[RTS_PIN])
							PIO_SetOutput(drv_info->uart_pins[RTS_PIN]);
					}
    		}
#endif
    	}
    	if( (Status&UART_INT_RT) && drv_data->mode.rx_tout )
    	{
	    	if( (hnd=drv_data->hnd_rcv) )
	    	{
	    		if(drv_data->rx_remaining != hnd->len)
	    			STOP_RX_HND(Uart, drv_info, hnd);
	    	}
    	}
	}
}
Example #11
0
void gui_thread(GUI_DRIVER_INFO* drv_info)
{
    unsigned int res, tmp, redraw;
    WINDOW win;
    WINDOW top;
    WINDOW desktop;		//main_dlg;
    CHandle key_hnd;
    CHandle gui_hnd;

    //prevent these signals not to be used from task handles
    ALLOCATE_SIGNAL(SIG_GUI_TASK);

    //wait for static constructors (lcd object)
    while(!detect_displays(drv_info))
        tsk_sleep(10);

    // start desktop
    while( !(desktop = tsk_new_window(maindlg_cb)) )
    {
        tsk_sleep(10);
    }
    desktop->next = NULL;
    top = desktop;
    desktop->rect.x1 = drv_info->lcd[0]->size_x;
    desktop->rect.y1 = drv_info->lcd[0]->size_y;

    for(int i=0; i<GUI_DISPLAYS; i++)
    {
        if(drv_info->lcd[i])
        {
#if GUI_DISPLAYS > 1
            desktop->displays |= (1<<i);
#endif
            drv_info->lcd[i]->lcd_init((GUI_CB)splashdlg_cb);
        }
    }
    tsk_sleep(3000);


    init_main_menu();


    // start key handle
    key_hnd.tsk_safe_open(KEY_DRV_INDX, 0);
    key_hnd.src.as_int = 0;
    key_hnd.tsk_start_read(&key_hnd.src.as_int, 1);


    // start gui handle
    gui_hnd.tsk_safe_open(GUI_DRV_INDX, 0);			//mode = 1 - control handle
    gui_hnd.tsk_start_read(NULL, 0);

    for(;;)
    {
        res = tsk_wait_signal(-1u, 1000 - (CURRENT_TIME %1000));
        redraw = res>>8;;

        if(!res)
            redraw = 0xFF;

        // 1) get waiting objects
        if(res & gui_hnd.signal)
        {
            drv_info->lcd[0]->backlight_signal();
            gui_hnd.res &= ~FLG_SIGNALED;
            win = (WINDOW)gui_hnd.dst.as_voidptr;
            if(win)
            {
                top->next = win;
                do
                {
                    top = (WINDOW)top->next;
                    top->rect.x1 = desktop->rect.x1;
                    top->rect.y1 = desktop->rect.y1;
                    top->callback(NULL , WM_INIT);
#if GUI_DISPLAYS > 1
                    redraw |= top->displays;
#endif
                } while( top->next );
            }
            gui_hnd.tsk_start_read(NULL, 0);
#if GUI_DISPLAYS == 1
            redraw |= 1;
#endif
        }


        // 2) check keyboard
        if(res &  key_hnd.signal)
        {
            drv_info->lcd[0]->backlight_signal();
            key_hnd.res &= ~FLG_SIGNALED;
            //send to top
            tmp = top->callback(key_hnd.src.as_int , WM_KEY);
            if(tmp & FLG_BUSY)	//FLG_BUSY returned to redraw
            {
                tmp ^= FLG_BUSY;
#if GUI_DISPLAYS > 1
                redraw |= top->displays;
#else
                redraw |= 1;
#endif
            }
            top->mode1 = tmp;
            key_hnd.tsk_start_read(&key_hnd.src.as_int, 1);
        }

        // 3)  command loop
        top = NULL;
        win = desktop;
        do
        {
            // check for pending commands
            if(win->mode0 & FLG_OK)
            {
                locked_clr_byte(&win->mode0, FLG_OK);
                tmp = win->callback(win->dst.as_int, WM_USER);
                if(tmp & FLG_BUSY)	//FLG_BUSY returned to redraw
                {
                    tmp ^= FLG_BUSY;
#if GUI_DISPLAYS > 1
                    redraw |= win->displays;
#else
                    redraw |= 1;
#endif
                }
                win->mode1 |= tmp;

            }

            //check for complete (close object)
            if(top && ((win->mode0 | win->mode1) & FLG_SIGNALED) )
            {
                top->next = win->next;
#if GUI_DISPLAYS > 1
                redraw |= win->displays;
#else
                redraw |= 1;
#endif
                usr_HND_SET_STATUS(win, win->mode1 | FLG_SIGNALED);
                win = (WINDOW)top->next;
            } else
            {
                top = win;
                win = (WINDOW)win->next;
            }

        } while (win );

        // 3) draw loop
        for(int i=0; i<GUI_DISPLAYS; i++)
        {
            if( (redraw & (1<<i)) && drv_info->lcd[i])
            {
                drv_info->lcd[i]->redraw_screen(desktop);
            }
        }
    }

}