Пример #1
0
rt_err_t crtpReceivePacketWait(CRTPPort portId, CRTPPacket *p, int wait) {
    RT_ASSERT(queues[portId]);
    RT_ASSERT(p);

// return xQueueReceive(queues[portId], p, M2T(wait));
    return rt_mq_recv(queues[portId], p, sizeof(CRTPPacket), M2T(wait));
}
Пример #2
0
rt_err_t rtgui_recv_filter(rt_uint32_t type, rtgui_event_t *event, rt_size_t event_size)
{
    struct rtgui_app *app;

    RT_ASSERT(event != RT_NULL);
    RT_ASSERT(event_size != 0);

    app = (struct rtgui_app *)(rt_thread_self()->user_data);
    if (app == RT_NULL)
        return -RT_ERROR;

    while (rt_mq_recv(app->mq, event, event_size, RT_WAITING_FOREVER) == RT_EOK)
    {
        if (event->type == type)
        {
            return RT_EOK;
        }
        else
        {
            if (RTGUI_OBJECT(app)->event_handler != RT_NULL)
            {
                RTGUI_OBJECT(app)->event_handler(RTGUI_OBJECT(app), event);
            }
        }
    }

    return -RT_ERROR;
}
Пример #3
0
/**
 * This function is the main entry of usb hub thread, it is in charge of 
 * processing all messages received from the usb message buffer.  
 *
 * @param parameter the parameter of the usb host thread.
 * 
 * @return none.
 */
static void rt_usbh_hub_thread_entry(void* parameter)
{    
    while(1)
    {    
        struct uhost_msg msg;
        
        /* receive message */
        if(rt_mq_recv(usb_mq, &msg, sizeof(struct uhost_msg), RT_WAITING_FOREVER) 
            != RT_EOK ) continue;

        RT_DEBUG_LOG(RT_DEBUG_USB, ("msg type %d\n", msg.type));
        
        switch (msg.type)
        {        
        case USB_MSG_CONNECT_CHANGE:
            rt_usbh_hub_port_change(msg.content.hub);
            break;
        case USB_MSG_CALLBACK:
            /* invoke callback */
            msg.content.cb.function(msg.content.cb.context);
            break;
        default:
            break;
        }            
    }
}
/* Vcom Tx Thread */
static void vcom_tx_thread_entry(void* parameter)
{
    struct vcom_tx_msg msg;

    while (1)
    {
        if (rt_mq_recv(&vcom_tx_thread_mq, (void*)&msg,
                        sizeof(struct vcom_tx_msg), RT_WAITING_FOREVER) == RT_EOK)
        {
            struct ufunction *func;
            struct vcom *data;

            func = (struct ufunction*)msg.serial->parent.user_data;
            data = (struct vcom*)func->user_data;
            if (!data->connected)
            {
                continue;
            }
                    
            rt_completion_init(&data->wait);

            data->ep_in->request.buffer = (void*)msg.buf;
            data->ep_in->request.size = msg.size;
            data->ep_in->request.req_type = UIO_REQUEST_WRITE;
            rt_usbd_io_request(func->device, data->ep_in, &data->ep_in->request);
            
            if (rt_completion_wait(&data->wait, TX_TIMEOUT) != RT_EOK)
            {
                rt_kprintf("vcom tx timeout\n");
            }      
        }
    }
}
Пример #5
0
rt_err_t rtgui_recv_filter(rt_uint32_t type, rtgui_event_t *event, rt_size_t event_size)
{
	rtgui_event_t *e;
    struct rtgui_app *app;

    RT_ASSERT(event != RT_NULL);
    RT_ASSERT(event_size != 0);

    app = (struct rtgui_app *)(rt_thread_self()->user_data);
    if (app == RT_NULL)
        return -RT_ERROR;

	e = (rtgui_event_t*)&app->event_buffer[0];
    while (rt_mq_recv(app->mq, e, sizeof(union rtgui_event_generic), RT_WAITING_FOREVER) == RT_EOK)
    {
        if (e->type == type)
        {
            rt_memcpy(event, e, event_size);
            return RT_EOK;
        }
        else
        {
            if (RTGUI_OBJECT(app)->event_handler != RT_NULL)
            {
                RTGUI_OBJECT(app)->event_handler(RTGUI_OBJECT(app), e);
            }
        }
    }

    return -RT_ERROR;
}
Пример #6
0
void fnAlarm(void)
{
	rt_uint32_t e;
	uint8_t buf,int_m,t=0;
	uint16_t delay1,delay2,strength;
	rt_thread_delay_hmsm(0,0,3,0);
	int_m = (clock_m+5)%60;
	rt_kprintf("It is %d:%d now\nAlarm Level %d\n",clock_h,clock_m,t);
	rt_event_send(reg_event,REG_ALARM_MSK);
	while (rt_mq_recv(key_mq,&buf,sizeof(uint8_t),0)!=RT_EOK)
	{
		if (clock_m==int_m)
		{
			t+=1;
			int_m = (int_m+5)%60;
			rt_kprintf("Alarm Level %d\n",t);
		}
		switch (t)
		{
			case 0: delay1 = 500; delay2 = 4500; strength = 400; break;
			case 1: delay1 = 1000; delay2 = 2000; strength = 600; break;
			case 2: delay1 = 500; delay2 = 500; strength = 800; break;
			default: delay1 = 500; delay2 = 250; strength = 1000; break;
		}
		SetAlarm(strength);
		rt_thread_delay_hmsm(0,0,0,delay1);
		SetAlarm(0);
		Animate(delay2);
	}
	rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e);
	return;
}
Пример #7
0
/***********************************************************
* Function:
* Description:
* Input:
* Input:
* Output:
* Return:
* Others:
***********************************************************/
static void rt_thread_entry_gps( void* parameter )
{
	rt_err_t	res;

      // 1.  init
       GPS_Abnormal_init();

	//2.  main while
	while( 1 )
	{
		res = rt_mq_recv( &mq_gps, (void*)&gps_rx, 124, RT_TICK_PER_SECOND / 20 ); //等待100ms,实际上就是变长的延时,最长100ms
		if( res == RT_EOK )                                                     //收到一包数据
		{
			if( flag_bd_upgrade_uart == 0 )
			{
				GPS_Rx_Process( gps_rx.body, gps_rx.wr );  
				GPS_Abnormal_process();//  GPS 模块异常检测 

			}else
			{
				if( gps_rx.body[0] == 0x40 )
				{
					rt_device_write( &dev_vuart, 0, gps_rx.body, gps_rx.wr);
				}
			} 
		}
		rt_thread_delay(6 ); 
	}
}
Пример #8
0
rt_err_t rtgui_thread_recv_filter(rt_uint32_t type, rtgui_event_t* event, rt_size_t event_size)
{
	struct rtgui_thread* thread;

	/* find rtgui_thread */
	thread = (struct rtgui_thread*) (rt_thread_self()->user_data);
	if (thread == RT_NULL) return -RT_ERROR;

	while (rt_mq_recv(thread->mq, event, event_size, RT_WAITING_FOREVER) == RT_EOK)
	{
		if (event->type == type)
		{
			return RT_EOK;
		}
		else
		{
			/* let widget to handle event */
			if (thread->widget != RT_NULL &&
				thread->widget->event_handler != RT_NULL)
			{
				thread->widget->event_handler(thread->widget, event);
			}
		}
	}

	return -RT_ERROR;
}
Пример #9
0
void rt_appManager_thread_entry(void* parameter) {
	
	rt_err_t result = RT_EOK;
	CommunicationProtocol *cp;
		/* 创建一个信号量,初始值是0 */	
	protocalData_mq = rt_mq_create("protocalMQ",TX_PLOAD_WIDTH,2,RT_IPC_FLAG_FIFO);
	
	while (1)
	{
		result = rt_mq_recv(protocalData_mq, &buff[0], TX_PLOAD_WIDTH, RT_WAITING_FOREVER);
		if(result != RT_EOK) {
			rt_kprintf("recv mq error !");
			return;
		}
		
		//deal msg from nRF2401
		cp = (CommunicationProtocol *)buff;
		if(cp->authentication	== 0x7a79 && cp->type == 1) //yz
		{
			//这里应该检测CRC16
				
			//电机,采用写信的方式吧。
			rt_mq_send(machineData_mq,&cp->m1pwm,4);
			//LED,采用写信的方式吧。
			rt_mq_send(ledData_mq,&cp->LEDS,1);
		}
	}
}
Пример #10
0
rt_err_t crtpReceivePacket(CRTPPort portId, CRTPPacket *p)
{
    RT_ASSERT(queues[portId]);
    RT_ASSERT(p);

    //return xQueueReceive(queues[portId], p, 0);
    return rt_mq_recv(queues[portId], p, sizeof(CRTPPacket), RT_WAITING_FOREVER);
}
Пример #11
0
//  1.   MsgQueue  Rx
rt_err_t rt_Rx_hmi2gsm_MsgQue(u8 *buffer,u16 rec_len)
{
    if(rt_mq_recv(&hmi2gsm_mq,&buffer[0], rec_len, MsgQ_Timeout) //RT_WAITING_FOREVER
            != RT_EOK )
        return  RT_ERROR;
    else
        return RT_EOK;
}
Пример #12
0
rt_err_t rt_Rx_hmi2app808_MsgQue(u8 *buffer,u16 rec_len)
{
    if(rt_mq_recv(&hmi2app808_mq,&buffer[0], rec_len, MsgQ_Timeout)
            != RT_EOK )
        return  RT_ERROR;
    else
        return RT_EOK;
}
Пример #13
0
static void led_thread_entry(void* parameter)
{
		rt_uint8_t ledStatus;
	
    rt_hw_led_init();		
		ledData_mq = rt_mq_create("LEDMQ",1,2,RT_IPC_FLAG_FIFO);
		
    while (1)
    {
				if(rt_mq_recv(ledData_mq,&ledStatus,1,RT_WAITING_FOREVER) == RT_EOK)
				{
					if(ledStatus &0x10)
					{
						rt_hw_led_on(4);											
					}
					else
					{
						rt_hw_led_off(4);			
					}
					
					if(ledStatus &0x08)
					{
						rt_hw_led_on(3);											
					}
					else
					{
						rt_hw_led_off(3);			
					}
					
					if(ledStatus &0x04)
					{
						rt_hw_led_on(2);											
					}
					else
					{
						rt_hw_led_off(2);			
					}
					if(ledStatus &0x2)
					{
						rt_hw_led_on(1);											
					}
					else
					{
						rt_hw_led_off(1);			
					}
					if(ledStatus &0x01)
					{
						rt_hw_led_on(0);											
					}
					else
					{
						rt_hw_led_off(0);			
					}					
				}        			
    }
}
Пример #14
0
void crtpTxTask(void *param)
{
    CRTPPacket p;

    while (RT_TRUE)
    {
        //if (xQueueReceive(tmpQueue, &p, portMAX_DELAY) == pdRT_TRUE)
        if (rt_mq_recv(tmpQueue, &p, sizeof(CRTPPacket), RT_WAITING_FOREVER) == RT_EOK)
        {
            link->sendPacket(&p);
        }
    }
}
Пример #15
0
rt_err_t rtgui_thread_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size)
{
	struct rtgui_thread* thread;
	rt_err_t r;

	/* find rtgui_thread */
	thread = (struct rtgui_thread*) (rt_thread_self()->user_data);
	if (thread == RT_NULL) return -RT_ERROR;

	r = rt_mq_recv(thread->mq, event, event_size, 0);

	return r;
}
Пример #16
0
rt_err_t rtgui_recv(rtgui_event_t *event, rt_size_t event_size, rt_int32_t timeout)
{
    struct rtgui_app *app;
    rt_err_t r;

    RT_ASSERT(event != RT_NULL);
    RT_ASSERT(event_size != 0);

    app = (struct rtgui_app *)(rt_thread_self()->user_data);
    if (app == RT_NULL) return -RT_ERROR;

    r = rt_mq_recv(app->mq, event, event_size, timeout);

    return r;
}
Пример #17
0
/***********************************************************
* Function:
* Description:
* Input:
* Input:
* Output:
* Return:
* Others:
***********************************************************/
static void rt_thread_entry_gps( void *parameter )
{
    rt_err_t	res;

    // 1.  init
    GPS_Abnormal_init();

    //2.  main while
    while( 1 )
    {
        // 1. rx data
        res = rt_mq_recv( &mq_gps, (void *)&gps_rx, 124, 2 ); //等待100ms,实际上就是变长的延时,最长100ms
        if(res == RT_EOK )                                                    //收到一包数据
        {
		;
		}
        rt_thread_delay(30);
        gps_thread_runCounter = 0;
    }
}
Пример #18
0
/// Get a Message or Wait for a Message from a Queue
osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec)
{
    osEvent event;
    rt_err_t result;
    rt_tick_t ticks;

    ticks = rt_tick_from_millisecond(millisec);
    result = rt_mq_recv(queue_id, &event.value, 4, ticks);

    if (result == RT_EOK)
    {
        event.status = osEventMessage;
    }
    else
    {
        event.status = osEventTimeout;
    }

    return event;
}
Пример #19
0
static Ret ftk_source_touch_dispatch(FtkSource* thiz)
{
	DECL_PRIV(thiz, priv);
	struct rt_touch_event touchevent;

	rt_mq_recv(&priv->mq, &touchevent, sizeof(touchevent), RT_WAITING_FOREVER);

	priv->event.type = FTK_EVT_NOP;
	priv->event.u.mouse.x = touchevent.x;
	priv->event.u.mouse.y = touchevent.y;

	if (touchevent.pressed)
	{
		if (priv->pressed)
		{
			priv->event.type =  FTK_EVT_MOUSE_MOVE;
		}
		else
		{
			priv->event.type =  FTK_EVT_MOUSE_DOWN;
			priv->pressed = 1;
		}
	}
	else
	{
		if (priv->pressed)
		{
			priv->event.type =  FTK_EVT_MOUSE_UP;
		}
		priv->pressed = 0;
	}

	if (priv->on_event != NULL && priv->event.type != FTK_EVT_NOP)
	{
		priv->on_event(priv->user_data, &priv->event);
		priv->event.type = FTK_EVT_NOP;
	}

	return RET_OK;
}
Пример #20
0
void update_radio_thread(void* parameter)
{
    rt_err_t result;
    struct player_request request;

    /* get request from message queue */
    result = rt_mq_recv(update_radio_mq, (void*)&request,
                        sizeof(struct player_request), RT_WAITING_FOREVER);
    if (result == RT_EOK)
    {
        switch (request.type)
        {
        case PLAYER_REQUEST_UPDATE_RADIO_LIST:
            if ((strstr(request.fn, "http://") == request.fn ||
                    (strstr(request.fn, "HTTP://") == request.fn )))
            {
                struct rtgui_event_command ecmd;

                if(update_radio_list(request.fn)==0)
                {
                    update_radio_list_state = 	UPDATE_RADIO_LIST_SUCCEED;
                }
                else
                {
                    update_radio_list_state = 	UPDATE_RADIO_LIST_CONNECT_FAILED;
                }
                RTGUI_EVENT_COMMAND_INIT(&ecmd);
                ecmd.type = RTGUI_EVENT_PAINT;
                ecmd.command_id = PLAYER_REQUEST_UPDATE_RADIO_LIST;
                rtgui_thread_send(rt_thread_find("ply_ui"), &ecmd.parent, sizeof(ecmd));
            }
            break;
        }
    }
    rt_mq_delete(update_radio_mq);
    update_radio_mq = RT_NULL;
}
Пример #21
0
void usb_thread_entry(void* parameter)
{
    int i;
    rt_thread_t tid;
    msd_msg_t msg;
    
    dev = rt_device_find(MOUNT_DEVICE);
    
    if(!dev)
    {
        rt_kprintf("no %s device found!\r\n", MOUNT_DEVICE);
        tid = rt_thread_self();
        rt_thread_delete(tid); 
    }
    
    rt_device_init(dev);
    rt_device_open(dev, RT_DEVICE_OFLAG_RDWR);
    
    usbd_init();                          /* USB Device Initialization          */
    usbd_connect(__TRUE);                 /* USB Device Connect                 */
    while (!usbd_configured ())
    {
        rt_thread_delay(10);
    }
    
    rt_kprintf("usb enum complete\r\n");
    
    while(1)
    {
        if(rt_mq_recv(msd_mq, &msg, sizeof(msd_msg_t), RT_WAITING_FOREVER) == RT_EOK)
        {
            if(msg.dir == 0) USBD_MSC_EP_BULKOUT_Event(0);
                else USBD_MSC_EP_BULKIN_Event (0);
        }
    }
}
Пример #22
0
static void net_buf_thread_entry(void* parameter)
{
	rt_err_t result;
	struct net_buffer_job job;

    while (1)
    {
    	/* get a job */
		result = rt_mq_recv(_netbuf_mq, (void*)&job, sizeof(struct net_buffer_job), RT_WAITING_FOREVER);
		if (result == RT_EOK)
		{
			/* set stat to buffering */
			if (_netbuf.stat == NETBUF_STAT_BUFFERING)
			{
				/* reset data length and read/save index */
				_netbuf.data_length = 0;
				_netbuf.read_index = _netbuf.save_index = 0;

				/* perform the job */
				net_buf_do_job(&job);
			}
		}
    }
}
Пример #23
0
void thread_gps_upgrade_udisk( void* parameter )
{
#define READ_PACKET_SIZE 1012

	void		( *msg )( void *p );
	int			fd = -1, size;
	u32   count = 0;
	rt_uint8_t	*pdata;             /*数据*/

	rt_uint8_t	buf[32];
	rt_uint8_t	ch_h, ch_l;
	rt_err_t	res;
	LENGTH_BUF	uart_buf;

	rt_uint32_t file_datalen;       /*升级文件长度*/
	rt_uint8_t	file_matchcode[2];  /*文件匹配码*/

	rt_uint16_t packet_num;

	rt_uint16_t crc;

	msg = parameter;

	ptr_mem_packet = rt_malloc( READ_PACKET_SIZE+20 );
	if( ptr_mem_packet == RT_NULL )
	{
		msg( "E内存不足" );
		return;
	}
/*查找U盘*/
	while( 1 )
	{
		if( rt_device_find( "udisk" ) == RT_NULL ) /*没有找到*/
		{
			count++;
			if( count <= 10 )
			{
				msg( "I等待U盘插入" );
				BD_upgrad_contr=1;
			}else
			{
				msg( "EU盘不存在" ); /*指示U盘不存在*/
				BD_upgrad_contr=1;
				goto end_upgrade_usb_0;
			}
			rt_thread_delay( RT_TICK_PER_SECOND );
		}else
		{
			msg( "I查找升级文件" );
			break;
		}
		WatchDog_Feed();
	}

/*查找指定文件BEIDOU.IMG*/
	fd = open( "/udisk/BEIDOU.IMG", O_RDONLY, 0 );
	if( fd >= 0 )
	{
		msg( "I分析文件" );
	}else
	{
		msg( "E升级文件不存在" );
		goto end_upgrade_usb_0;
	}

	size	= read( fd, ptr_mem_packet, 16 );
	pdata	= ptr_mem_packet;
	if( ( *pdata != 0x54 ) || ( *( pdata + 1 ) != 0x44 ) )  
	{
		msg( "E文件头错误" );
		goto end_upgrade_usb_1;
	}

	ch_h	= ( *( pdata + 9 ) & 0xf0 ) >> 4;
	ch_l	= ( *( pdata + 9 ) & 0xf );
	sprintf( buf, "I版本:%d.%d.%d", ch_h, ch_l, *( pdata + 10 ) );
	msg( buf );
/*升级数据长度*/
	file_datalen =0;
	file_datalen	= ( *( pdata + 11 ) ) << 24;
	file_datalen	|= ( *( pdata + 12 ) ) << 16;
	file_datalen	|= ( *( pdata + 13 ) ) << 8;
	file_datalen	|= *( pdata + 14 );
	rt_kprintf("file_datalen=%x",file_datalen);
/*文件匹配码在尾部*/
	count	= 0;
	ch_h	= 0;

	do{
		res		= read( fd, ptr_mem_packet,READ_PACKET_SIZE );
		if(res)	count = res;
		WatchDog_Feed(); 
	}while(res>0);
	//rt_kprintf("res=%02x\r\n",res);
	//if(res==0) res=READ_PACKET_SIZE;
	
	if( ( ptr_mem_packet[count - 1] != 0x54 ) || ( ptr_mem_packet[count - 2] != 0x44 ) )
	{
		msg( "E文件尾错误" );
		goto end_upgrade_usb_1;
	}
	file_matchcode[0]	= ptr_mem_packet[count - 6];
	file_matchcode[1]	= ptr_mem_packet[count - 5];
	rt_kprintf("file datalen=%x matchcode=%02x%02x",file_datalen,file_matchcode[0],file_matchcode[1]);
	close( fd );
	


	msg( "I配置端口" );

	fd = open( "/udisk/BEIDOU.IMG", O_RDONLY, 0 );
	if( fd < 0 )
	{
		msg( "E升级文件不存在" );
		goto end_upgrade_usb_0;
	}

/*开始升级*/
/*停止gps线程*/
	rt_thread_suspend( &thread_gps );

/*进入升级状态*/
	memcpy( buf, "\x40\x30\xC0\x00\x03\x00\x01\x34\x21\x0D\x0A", 11 );
	dev_gps_write( &dev_gps, 0, buf, 11 );
	rt_thread_delay( RT_TICK_PER_SECOND );
/*版本查询*/
	count = 0;
	dev_gps_write( &dev_gps, 0, "\x40\x10\xC0\x00\x10\x00\x01\xC2\x84\x0D\x0A", 11 );
	while( 1 )
	{
	       rt_thread_delay(RT_TICK_PER_SECOND/10);
		res = rt_mq_recv( &mq_gps, (void*)&uart_buf, 124, 5 );
		if( res == RT_EOK )                                             //收到一包数据
		{
		       count=0;  // clear
			rt_kprintf("\r\n版本查询\r\n");
			for( ch_h = 0; ch_h < uart_buf.wr; ch_h++ )
			{
				rt_kprintf( "%02x ", uart_buf.body[ch_h] );
			}
			rt_kprintf( "\r\n" );
			if( ( uart_buf.wr == 15 ) && ( uart_buf.body[4] == 0x02 ) ) /*进入升级状态*/
			{
				ch_h	= ( uart_buf.body[7] & 0xf0 ) >> 4;
				ch_l	= ( uart_buf.body[7] & 0xf );
				sprintf( buf, "I版本:%d.%d.%d", ch_h, ch_l, uart_buf.body[8] );
				msg( buf );
				break;
			}
		}else /*超时*/
Пример #24
0
void player_thread(void* parameter)
{
	rt_err_t result;
	struct player_request request;

	while(1)
	{
		/* get request from message queue */
		result = rt_mq_recv(player_thread_mq, (void*)&request,
			sizeof(struct player_request), RT_WAITING_FOREVER);
		if (result == RT_EOK)
		{
			switch (request.type)
			{
			case PLAYER_REQUEST_PLAY_SINGLE_FILE:
				if ((strstr(request.fn, ".mp3") != RT_NULL) ||
					(strstr(request.fn, ".MP3") != RT_NULL))
				{
					is_playing = RT_TRUE;
					player_notify_play();

				    /* get music tag information */
					mp3(request.fn);

					player_notify_stop();
					is_playing = RT_FALSE;
				}
				else if ((strstr(request.fn, ".wav") != RT_NULL) ||
					(strstr(request.fn, ".WAV") != RT_NULL))
				{
					is_playing = RT_TRUE;
					player_notify_play();
					wav(request.fn);
					player_notify_stop();
					is_playing = RT_FALSE;
				}
				else if ((strstr(request.fn, "http://") == request.fn ||
					(strstr(request.fn, "HTTP://") == request.fn )))
				{
					is_playing = RT_TRUE;
					player_notify_play();
					ice_mp3(request.fn, request.station);
					/* notfiy net buffer worker to stop */
					net_buf_stop_job();
					player_notify_stop();
					is_playing = RT_FALSE;
				}
				else if (strstr(request.fn, "douban://") == request.fn)
				{
					is_playing = RT_TRUE;
					player_notify_play();
					douban_radio(request.fn, request.station);

					/* notfiy net buffer worker to stop */
					net_buf_stop_job();
					player_notify_stop();
					is_playing = RT_FALSE;
				}
				break;
			}
		}
	}
}
Пример #25
0
void rt_thread_alarm_entry (void *parameter)
{
	uint8_t buf;
	uint16_t t;
	rt_uint32_t e;
	
	AlarmerInit();
	SetAlarm(0);
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 
	if (PWR_GetFlagStatus(PWR_FLAG_WU)==SET)
	{
		rt_kprintf("\n\nWaken up by DS3231\n");
		if ((IIC_Read(DS3231_ADDRESS, DS3231_CON_STA)) & 0x01) fnAlarm();
		IIC_Write(DS3231_ADDRESS, DS3231_CON_STA,0x80);
	}
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE);

	while (rt_mq_recv(key_mq,&buf,sizeof(uint8_t),10)==RT_EOK);
	while (1)
	{
		do
		{
			rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER);
		}while(buf!=0);
		t = 0;
		reg_output[REG_ALARM]=0xF777F7F7;
		rt_event_send(reg_event,REG_ALARM_MSK);
		
		rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER);
		if (buf>9)
		{
			rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e);
			continue;
		}
		t = buf;
		reg_output[REG_ALARM]=(0x01000000*REG_HexToReg(buf)) | (0x00FFFFFF & reg_output[REG_ALARM]) | 0x80000000;

		rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER);	
		if (buf>9)
		{
			rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e);
			continue;
		}
		t = t*10+buf;
		reg_output[REG_ALARM]=(0x00010000*REG_HexToReg(buf)) | (0xFF00FFFF & reg_output[REG_ALARM]);

		rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER);		
		if (buf>9)
		{
			rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e);
			continue;
		}
		t = t*10+buf;
		reg_output[REG_ALARM]=(0x00000100*REG_HexToReg(buf)) | (0xFFFF00FF & reg_output[REG_ALARM]);

		rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER);		
		if (buf>9)
		{
			rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e);
			continue;
		}
		t = t*10+buf;
		reg_output[REG_ALARM]=(0x00000001*REG_HexToReg(buf)) | (0xFFFFFF00 & reg_output[REG_ALARM]);

		rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER);		
		if (buf<=9)
		{
			rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e);
			continue;
		}else
		{
			if (fnSetAlarmClock(t/100,t%100,buf==0x0B)==ERROR)
				rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e);

		}
	}
}
Пример #26
0
static void com_thread_entry(void *parameter)
{
	rt_err_t ret;
	
	uint8_t payload[MAX_RECV_PACKET_SIZE - (sizeof(PACKET) - 1)];
	
	uint8_t packet_buffer[MAX_SEND_PACKET_SIZE];

	uint16_t packet_len;
	
	TEST_CMD  test_cmd;
	
	uint32_t voltage, current, ac;
	
	uint8_t test_type;
	uint8_t test_status;
	
	com_port_set_read_callback(packet_receive_callback);
	
	com_port_init();
	
	while (RT_TRUE)
	{
		/* wait for payload */
		RT_ASSERT(s_payload_queue != RT_NULL);
		ret = rt_mq_recv(s_payload_queue, payload, sizeof(payload), RT_WAITING_FOREVER);
		if (ret == RT_EOK)
		{
			/* do cmd */
			uint8_t cmd = payload[0];
			
			switch (cmd)
			{
			case CMD_CV_MODE:
				{
					PAYLOAD_CMD_CV_MODE *payload_cv_mode = (PAYLOAD_CMD_CV_MODE *)payload;
					
					TRACE("CMD_CV_MODE\n");
				
					packet_len = build_cv_mode_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}
				
					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_CV_MODE;
					test_cmd.test_config.cv_mode_config.voltage_val = payload_cv_mode->voltage_val;
					
					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));
				}
				
				break;
			
			case CMD_CC_MODE:
				{
					PAYLOAD_CMD_CC_MODE *payload_cc_mode = (PAYLOAD_CMD_CC_MODE *)payload;
					
					TRACE("CMD_CC_MODE\n");
				
					packet_len = build_cc_mode_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_CC_MODE;
					test_cmd.test_config.cc_mode_config.current_val = payload_cc_mode->current_val;
					
					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));					
				}
				
				break;
			
			case CMD_CR_MODE:
				{
					PAYLOAD_CMD_CR_MODE *payload_cr_mode = (PAYLOAD_CMD_CR_MODE *)payload;
					
					TRACE("CMD_CR_MODE\n");
				
					packet_len = build_cr_mode_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}
				
					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_CR_MODE;
					test_cmd.test_config.cr_mode_config.resist_val = payload_cr_mode->resist_val;
					
					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}
				
				break;

			case CMD_CV_TEST:
				{
					PAYLOAD_CMD_CV_TEST *payload_cv_test = (PAYLOAD_CMD_CV_TEST *)payload;

					TRACE("CMD_CV_TEST\n");

					packet_len = build_cv_test_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_CV_TEST;

					test_cmd.test_config.cv_test_config.test_category = payload_cv_test->test_category;
					test_cmd.test_config.cv_test_config.voltage_level = payload_cv_test->voltage_level;
					test_cmd.test_config.cv_test_config.voltage_val = payload_cv_test->voltage_val;
					test_cmd.test_config.cv_test_config.duration = payload_cv_test->duration;
					test_cmd.test_config.cv_test_config.ac_upper = payload_cv_test->ac_upper;
					test_cmd.test_config.cv_test_config.current_lower = payload_cv_test->current_lower;
					test_cmd.test_config.cv_test_config.current_upper = payload_cv_test->current_upper;


					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}

				break;

			case CMD_CC_TEST:
				{
					PAYLOAD_CMD_CC_TEST *payload_cc_test = (PAYLOAD_CMD_CC_TEST *)payload;

					TRACE("CMD_CC_TEST\n");

					packet_len = build_cc_test_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_CC_TEST;

					test_cmd.test_config.cc_test_config.test_category = payload_cc_test->test_category;
					test_cmd.test_config.cc_test_config.voltage_level = payload_cc_test->voltage_level;
					test_cmd.test_config.cc_test_config.current_val = payload_cc_test->current_val;
					test_cmd.test_config.cc_test_config.duration = payload_cc_test->duration;
					test_cmd.test_config.cc_test_config.ac_upper = payload_cc_test->ac_upper;
					test_cmd.test_config.cc_test_config.voltage_lower = payload_cc_test->voltage_lower;
					test_cmd.test_config.cc_test_config.voltage_upper = payload_cc_test->voltage_upper;


					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}

				break;

			case CMD_CR_TEST:
				{
					PAYLOAD_CMD_CR_TEST *payload_cr_test = (PAYLOAD_CMD_CR_TEST *)payload;

					TRACE("CMD_CR_TEST\n");

					packet_len = build_cr_test_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_CR_TEST;

					test_cmd.test_config.cr_test_config.test_category = payload_cr_test->test_category;
					test_cmd.test_config.cr_test_config.voltage_level = payload_cr_test->voltage_level;
					test_cmd.test_config.cr_test_config.resist_val = payload_cr_test->resist_val;
					test_cmd.test_config.cr_test_config.duration = payload_cr_test->duration;
					test_cmd.test_config.cr_test_config.ac_upper = payload_cr_test->ac_upper;
					test_cmd.test_config.cr_test_config.voltage_lower = payload_cr_test->voltage_lower;
					test_cmd.test_config.cr_test_config.voltage_upper = payload_cr_test->voltage_upper;
					test_cmd.test_config.cr_test_config.current_lower = payload_cr_test->current_lower;
					test_cmd.test_config.cr_test_config.current_upper = payload_cr_test->current_upper;


					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}

				break;

			case CMD_EMPTY_LOAD_TEST:
				{
					PAYLOAD_CMD_EMPTY_LOAD_TEST *payload_empty_load_test = (PAYLOAD_CMD_EMPTY_LOAD_TEST *)payload;

					TRACE("CMD_EMPTY_LOAD_TEST\n");

					packet_len = build_empty_load_test_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_EMPTY_LOAD_TEST;
					
					test_cmd.test_config.empty_load_test_config.duration = payload_empty_load_test->duration;
					test_cmd.test_config.empty_load_test_config.ac_upper = payload_empty_load_test->ac_upper;
					test_cmd.test_config.empty_load_test_config.voltage_lower = payload_empty_load_test->voltage_lower;
					test_cmd.test_config.empty_load_test_config.voltage_upper = payload_empty_load_test->voltage_upper;


					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}

				break;

			case CMD_OVER_CURRENT_TEST:
				{
					PAYLOAD_CMD_OVER_CURRENT_TEST *payload_over_current_test = (PAYLOAD_CMD_OVER_CURRENT_TEST *)payload;

					TRACE("CMD_OVER_CURRENT_TEST\n");

					packet_len = build_over_current_test_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_OVER_CURRENT_TEST;

					test_cmd.test_config.over_current_test_config.test_category = payload_over_current_test->test_category;
					test_cmd.test_config.over_current_test_config.voltage_level = payload_over_current_test->voltage_level;
					test_cmd.test_config.over_current_test_config.interval = payload_over_current_test->interval;
					test_cmd.test_config.over_current_test_config.ac_upper = payload_over_current_test->ac_upper;
					test_cmd.test_config.over_current_test_config.current_upper = payload_over_current_test->current_upper;

					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}

				break;

			case CMD_SHORT_TEST:
				{
					PAYLOAD_CMD_SHORT_TEST *payload_short_test = (PAYLOAD_CMD_SHORT_TEST *)payload;

					TRACE("CMD_SHORT_TEST\n");

					packet_len = build_short_test_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_SHORT_TEST;

					test_cmd.test_config.short_test_config.test_category = payload_short_test->test_category;
					test_cmd.test_config.short_test_config.voltage_level = payload_short_test->voltage_level;
					test_cmd.test_config.short_test_config.duration = payload_short_test->duration;
					test_cmd.test_config.short_test_config.ac_upper = payload_short_test->ac_upper;
					test_cmd.test_config.short_test_config.current_upper = payload_short_test->current_upper;

					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}

				break;

			case CMD_DISCHARGE_TEST:
				{
					PAYLOAD_CMD_DISCHARGE_TEST *payload_discharge_test = (PAYLOAD_CMD_DISCHARGE_TEST *)payload;

					TRACE("CMD_DISCHARGE_TEST\n");

					packet_len = build_discharge_test_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}

					/* notify work thread */
					test_cmd.test_type = TEST_TYPE_DISCHARGE_TEST;
					
					test_cmd.test_config.discharge_test_config.duration = payload_discharge_test->duration;
					test_cmd.test_config.discharge_test_config.current_val = payload_discharge_test->current_val;

					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));	
				}

				break;
				
			case CMD_STOP:
				{
					TRACE("CMD_STOP\n");
				
					packet_len = build_stop_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), RESULT_OK);
					if (packet_len != PACKET_TOO_LONG)
					{
						/* reply */
						com_port_write(packet_buffer, packet_len);
					}
				
					/* notify work thread */
					test_cmd.test_type     = TEST_TYPE_NONE;
					
					RT_ASSERT(g_test_cmd_queue != RT_NULL);
					rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));
				}
				
				break;
				
			case CMD_POLL:
				/* get value */
				RT_ASSERT(g_sem_test_content != RT_NULL);
				rt_sem_take(g_sem_test_content, RT_WAITING_FOREVER);

				if (g_test_content.test_type == TEST_TYPE_OVER_CURRENT_TEST
					&& g_test_content.test_status == TEST_STATUS_NORMAL)
				{
					current = g_over_current_test_result.over_current_test_current;

					voltage = g_over_current_test_result.over_current_test_voltage;

					if (g_over_current_test_result.over_current_test_ac > s_ac_offset_value)
					{
						ac = g_over_current_test_result.over_current_test_ac - s_ac_offset_value;
					}
					else
					{
						ac = 0;
					}
				}
				else
				{
					current = g_test_content.current;

					voltage = g_test_content.voltage;

					if (g_test_content.ac_current > s_ac_offset_value)
					{
						ac = g_test_content.ac_current - s_ac_offset_value;
					}
					else
					{
						ac = 0;
					}
				}
				
				test_type   = g_test_content.test_type;
				test_status = g_test_content.test_status;
				rt_sem_release(g_sem_test_content);
				
				packet_len = build_poll_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), test_type, test_status, ac, voltage, current);
				if (packet_len != PACKET_TOO_LONG)
				{
					/* reply */
					com_port_write(packet_buffer, packet_len);
				}
				
				break;

			case CMD_SET_ADJUST_VALUE:
				{
					PAYLOAD_CMD_SET_ADJUST_VALUE *payload_set_adjust_value = (PAYLOAD_CMD_SET_ADJUST_VALUE *)payload;

					ADJUST_PARAMETER.measure_voltage = payload_set_adjust_value->measure_voltage;
					ADJUST_PARAMETER.actual_voltage  = payload_set_adjust_value->actual_voltage;
					ADJUST_PARAMETER.measure_current = payload_set_adjust_value->measure_current;
					ADJUST_PARAMETER.actual_current  = payload_set_adjust_value->actual_current;
					
					save_parameter();
				}
				
				break;

			case CMD_GET_ADJUST_VALUE:
				TRACE("get adjust\n");
				packet_len = build_get_adjust_value_cmd_ret_packet(packet_buffer, sizeof(packet_buffer), ADJUST_PARAMETER.measure_voltage, ADJUST_PARAMETER.actual_voltage, 
																		ADJUST_PARAMETER.measure_current, ADJUST_PARAMETER.actual_current);
				if (packet_len != PACKET_TOO_LONG)
				{
					/* reply */
					com_port_write(packet_buffer, packet_len);

					TRACE("get adjust value ret:measure voltage:%d,actual voltage:%d,measure current:%d,actual current:%d\n", 
							ADJUST_PARAMETER.measure_voltage, ADJUST_PARAMETER.actual_voltage, ADJUST_PARAMETER.measure_current, ADJUST_PARAMETER.actual_current);
				}

				RT_ASSERT(g_sem_test_content != RT_NULL);
				
				rt_sem_take(g_sem_test_content, RT_WAITING_FOREVER);
				s_ac_offset_value = g_test_content.ac_current;
				rt_sem_release(g_sem_test_content);

				/* notify work thread */
				test_cmd.test_type     = TEST_TYPE_NONE;
					
				RT_ASSERT(g_test_cmd_queue != RT_NULL);
				rt_mq_send(g_test_cmd_queue, &test_cmd, sizeof(test_cmd));
				
				break;
				
			default:
				
				break;
			}
		}
	}
}
Пример #27
0
void rt_init_thread_entry(void *parameter)
{
    rt_device_t lcd;  
    
    rt_hw_led_init();
	rt_hw_key_init();
	rt_hw_adc_init();
	rt_hw_lcd_init();      
	rt_hw_cpu_init();

#ifdef RT_USING_RTGUI
	extern void rtgui_system_server_init(void);

	/* find lcd device */
	lcd = rt_device_find("lcd");    
    
	/* set lcd device as rtgui graphic driver */		
	rtgui_graphic_set_device(lcd);

	/* init rtgui system server */
	rtgui_system_server_init();
   
	/* startup rtgui */
	rtgui_startup();
#else
	{
	char buf[20] = {'\0'};
    struct lcd_msg msg;
    rt_device_t device;   
    device = rt_device_find("lcd");
	rt_device_control(device, RT_DEVICE_CTRL_LCD_CLEAR_SCR, RT_NULL);
	x = 1;
	y = 1;
	rt_device_control(device, RT_DEVICE_CTRL_LCD_PUT_STRING, "ADC"); 
	x = 1;
	y = 20;
	rt_device_control(device, RT_DEVICE_CTRL_LCD_PUT_STRING, "CPU");
	x = 1;
	y = 40;
	rt_device_control(device, RT_DEVICE_CTRL_LCD_PUT_STRING, "KEY");
    
    while(1)
    {
        if (rt_mq_recv(&mq, &msg, sizeof(msg), RT_WAITING_FOREVER) == RT_EOK)
        {
        	switch(msg.type)
    		{
    			case ADC_MSG:
					x = 40;
					y = 1;
					rt_memset(buf, 0, sizeof(buf));
					rt_sprintf(buf, "%04d", msg.adc_value);
					rt_device_control(device, RT_DEVICE_CTRL_LCD_PUT_STRING, buf); 
					break;
				case CPU_MSG:
					x = 40;
					y = 20;
					rt_memset(buf, 0, sizeof(buf));
					rt_sprintf(buf, "%03d %03d", msg.major, msg.minor);
					rt_device_control(device, RT_DEVICE_CTRL_LCD_PUT_STRING, buf); 
					break;
				case KEY_MSG:
					x = 40;
					y = 40;
					rt_memset(buf, 0, sizeof(buf));
                    switch(msg.key)
                	{
                		case KEY_DOWN:
							rt_sprintf(buf, "DOWN KEY ");
							break;
						case KEY_UP:
							rt_sprintf(buf, "UP KEY   ");
							break;	
                		case KEY_RIGHT:
							rt_sprintf(buf, "RIGHT KEY");
							break;
						case KEY_LEFT:
							rt_sprintf(buf, "LEFT KEY ");
							break;	
                		case KEY_ENTER:
							rt_sprintf(buf, "ENTER KEY");
							break;
						default:
							rt_sprintf(buf, "NO KEY   ");
							break;								
                	}
					rt_device_control(device, RT_DEVICE_CTRL_LCD_PUT_STRING, buf); 
                    break;                    
    		}
        }
    }
	}
#endif
}
Пример #28
0
void LCDPANELProcess_thread_entry(void* parameter)
{
	struct rx_msg msg;
    rt_device_t device;

	// 从RT系统中获取串口1设备
    device = rt_device_find("uart1");
    if (device != RT_NULL)
    {
    	/* 设置回调函数及打开设备*/
		rt_device_set_rx_indicate(device, uart_input);
		// 以读写方式打开设备
        rt_device_open(device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
    }
	rt_thread_delay(50);									//* Release 1 second cpu time solt for other module init function */
	IWDG_ReloadCounter();
	rt_thread_delay(50);

    while (1)
    {
		IWDG_ReloadCounter();
		MessageTX[7]=0X01;
        rt_thread_delay( RT_TICK_PER_SECOND/20 ); /* sleep 0.5 second and switch to other thread */

		while (rt_mq_recv(&rx_mq, &msg, sizeof(struct rx_msg), 50) == RT_EOK)
		{
			rt_uint32_t rx_length;
			test1++;
			rx_length = (sizeof(QueryLCDRxBuf) - 1) > msg.size ? msg.size : sizeof(QueryLCDRxBuf) - 1;
			/* 读取消息*/
			rx_length = rt_device_read(msg.dev, 0, &QueryLCDRxBuf[0], rx_length);
			if(QueryLCDRxBuf[0] != 0xaa)
			{
				break;
			}
			while (rx_length < 10)
			{
				if (rt_mq_recv(&rx_mq, &msg, sizeof(struct rx_msg), 5) == RT_EOK)
				{
					rt_device_read(msg.dev, 0, &QueryLCDRxBuf[rx_length++], 1);
				}
				else
				{
					break;
				}
			}
			if ((rx_length == 10) && (QueryLCDRxBuf[9] == 0xcc))
			{
				QueryLCDRxBuf[rx_length] = '\0';

				if((QueryLCDRxBuf[1]==0x01)&&(StartupMark==1))//LCD启动,而且车启动时
				{
					if((QueryLCDRxBuf[2]==0x01)|(GSM_flag==1))//LCD手动模式开,且GSM有信号时
					{
//						MessageTX[12] = rxlen;
						MessageTX[13] = 0x03;
						MD=0; //开风机
						MessageTX[11]=0x01;//风机启动状态
						fwsRlyWindOpen(RLY_WIND_MD_FLAG,FELAY_DELAY_FOREVER);
					}
	    			else if((QueryLCDRxBuf[2]==0x00)&(GSM_flag==0))//LCD手动模式关,且GSM有信号时
    				{
//    					MessageTX[12] = rxlen;
    					MessageTX[13] = 0x04;
    					MD=1;//关风机
						fwsRlyWindClose(RLY_WIND_MD_FLAG);
	    			}
	    			else
	    			{
//						MessageTX[12] = rxlen;
						MessageTX[13] = 0x02;
	    			}
    			}
    			else if((QueryLCDRxBuf[1]==0x00)||(StartupMark==0))//LCD关闭,而且车熄火
    			{
					MessageTX[12] = StartupMark;
    				MessageTX[13] = 0x05;
					MD=1; //关风机
					if(StartupMark==0)
						fwsRlyWindClose(RLY_WIND_ALLOFF_FLAG);
					else
						fwsRlyWindClose(RLY_WIND_MD_FLAG);
    			}
    			else
    			{
//					MessageTX[12] = rxlen;
					MessageTX[13] = 0x06;
				}
//				if(QueryLCDRxBuf[7]==0x01)//自动模式时
//				{
//    			     MessageTX[12]=QueryLCDRxBuf[5];
//    			     MessageTX[13]=QueryLCDRxBuf[6];
//    	    	}
			}
			else
			{
				break;
			}
			rt_device_write(msg.dev, 0, &MessageTX[0], SENDTO_LCD_LEN);
		}
    }
}