From 36773903357cc77d368f156a8e0dc2f5a124e001 Mon Sep 17 00:00:00 2001 From: "bernard.xiong" Date: Mon, 22 Feb 2010 13:35:47 +0000 Subject: [PATCH] fix memory overwrite on shoutcast meta data reception. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@431 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- bsp/stm32_radio/board.c | 13 ++ bsp/stm32_radio/board.h | 4 + bsp/stm32_radio/gui.c | 245 --------------------------------- bsp/stm32_radio/http.c | 73 ++++++---- bsp/stm32_radio/mp3.c | 3 +- bsp/stm32_radio/netbuffer.c | 2 +- bsp/stm32_radio/player_ui.c | 11 ++ bsp/stm32_radio/player_ui.h | 3 + bsp/stm32_radio/stm32f10x_it.c | 11 -- bsp/stm32_radio/touch.c | 139 +++++++++++++++++++ 10 files changed, 222 insertions(+), 282 deletions(-) delete mode 100644 bsp/stm32_radio/gui.c create mode 100644 bsp/stm32_radio/touch.c diff --git a/bsp/stm32_radio/board.c b/bsp/stm32_radio/board.c index cf0a31445c..a11925bb36 100644 --- a/bsp/stm32_radio/board.c +++ b/bsp/stm32_radio/board.c @@ -94,6 +94,19 @@ void rt_hw_board_init() GPIO_SetBits(GPIOE,GPIO_Pin_5); } +#if LCD_VERSION == 2 + { + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; + GPIO_Init(GPIOF,&GPIO_InitStructure); + } +#endif + /* NVIC Configuration */ NVIC_Configuration(); diff --git a/bsp/stm32_radio/board.h b/bsp/stm32_radio/board.h index 73a85be5c4..aa4c4517d5 100644 --- a/bsp/stm32_radio/board.h +++ b/bsp/stm32_radio/board.h @@ -46,6 +46,10 @@ // Default: 1 #define CODEC_VERSION 1 +// LCD Modul Version <1=>Version 1 <2=>Version 2 +// Default: 1 +#define LCD_VERSION 1 + void rt_hw_board_led_on(int n); void rt_hw_board_led_off(int n); void rt_hw_board_init(void); diff --git a/bsp/stm32_radio/gui.c b/bsp/stm32_radio/gui.c deleted file mode 100644 index f40d32ffd5..0000000000 --- a/bsp/stm32_radio/gui.c +++ /dev/null @@ -1,245 +0,0 @@ -#include -#include -#include -#include - -#include - -static struct rtgui_timer *timer; -static struct rtgui_label* label; -static struct rtgui_win* msgbox; -static rt_uint8_t label_text[80]; -static int cnt = 5; - -void diag_close(struct rtgui_timer* timer, void* parameter) -{ - rt_sprintf(label_text, "closed then %d second!", cnt); - - rtgui_label_set_text(label, label_text); - rtgui_widget_update(RTGUI_WIDGET(label)); - if (cnt == 0) - { - rtgui_win_destroy(msgbox); - rtgui_timer_stop(timer); - rtgui_timer_destory(timer); - } - - cnt --; -} - -void msg() -{ - rt_mq_t mq; - rt_thread_t tid; - rt_uint32_t user_data; - struct rtgui_rect rect = {50, 50, 200, 200}; - - tid = rt_thread_self(); - if (tid == RT_NULL) return; /* can't use in none-scheduler environement */ - user_data = tid->user_data; - - /* create gui message queue */ - mq = rt_mq_create("msgbox", 256, 4, RT_IPC_FLAG_FIFO); - /* register message queue on current thread */ - rtgui_thread_register(rt_thread_self(), mq); - - msgbox = rtgui_win_create(RT_NULL, "Information", &rect, RTGUI_WIN_STYLE_DEFAULT); - if (msgbox != RT_NULL) - { - struct rtgui_box* box = rtgui_box_create(RTGUI_VERTICAL, RT_NULL); - - cnt = 5; - rt_sprintf(label_text, "closed then %d second!", cnt); - label = rtgui_label_create(label_text); - - rtgui_win_set_box(msgbox, box); - RTGUI_WIDGET(label)->align = RTGUI_ALIGN_CENTER_HORIZONTAL | - RTGUI_ALIGN_CENTER_VERTICAL; - rtgui_widget_set_miniwidth(RTGUI_WIDGET(label),130); - rtgui_box_append(box, RTGUI_WIDGET(label)); - rtgui_box_layout(box); - - rtgui_win_show(msgbox); - } - - timer = rtgui_timer_create(200, RT_TIMER_FLAG_PERIODIC, - diag_close, RT_NULL); - rtgui_timer_start(timer); - - rtgui_win_event_loop(msgbox); - - rtgui_thread_deregister(rt_thread_self()); - /* remove RTGUI message queue */ - rt_mq_delete(mq); - - /* recover user data */ - tid->user_data = user_data; -} -FINSH_FUNCTION_EXPORT(msg, msg on gui) - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -/* XPM */ -static const char *goto_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 43 1", -". c Black", -"e c #0F0F0F", -"= c #2D2D2D", -"> c #3C3C3C", -"X c #010101", -"$ c #101010", -"% c #1F1F1F", -"r c #090909", -"- c #272727", -"3 c #363636", -"+ c #020202", -"# c #111111", -"2 c #3E3E3E", -"i c #4D4D4D", -"q c #191919", -", c #373737", -"f c #464646", -"o c #030303", -"u c #121212", -"p c #212121", -"; c #0B0B0B", -" c None", -"7 c #292929", -"O c #040404", -"6 c #131313", -"5 c #222222", -"t c #313131", -"4 c #4F4F4F", -"@ c #0C0C0C", -"a c #1B1B1B", -"* c #2A2A2A", -"0 c #141414", -"< c #0D0D0D", -": c #3A3A3A", -"9 c #060606", -"& c #151515", -"w c #242424", -"s c #424242", -"d c #1D1D1D", -"8 c #070707", -"1 c #161616", -"g c #252525", -"y c #343434", -/* pixels */ -" .XX. ", -" oOOO+ ", -" @####o ", -" $%%%%& ", -" .*===-+ ", -" ;:>,; ", -" <# 12O ", -" 345 .X. ", -" 678 .X++X ", -" +9999o ", -" o0&&&6+ ", -" qwwwwe ", -" rtyy% ", -" +; uip ", -" asd o ", -" $fg " -}; -static struct rtgui_image* image = RT_NULL; -static void rtgui_demo_workbench_entry(void* parameter) -{ - rt_mq_t mq; - struct rtgui_view* view; - struct rtgui_workbench* workbench; - - /* init rtgui demo message queue */ - mq = rt_mq_create("mqWB", 256, 4, RT_IPC_FLAG_FIFO); - - /* register thread and message queue */ - rtgui_thread_register(rt_thread_self(), mq); - - /* create container */ - workbench = rtgui_workbench_create("main", "widget"); - if (workbench == RT_NULL) return; - - /************************************************************************/ - /* Create View */ - /************************************************************************/ - view = rtgui_view_create("widget"); - rtgui_workbench_add_view(workbench, view); - - image = rtgui_image_create_from_mem("xpm", goto_xpm, sizeof(goto_xpm)); - - { - struct rtgui_box *box = rtgui_box_create(RTGUI_VERTICAL, &rtgui_empty_rect); - struct rtgui_box *hbox = rtgui_box_create(RTGUI_HORIZONTAL, &rtgui_empty_rect); - struct rtgui_button* button = rtgui_button_create("OK"); - struct rtgui_textbox *textbox = rtgui_textbox_create("text edit box"); - struct rtgui_iconbox *iconbox = rtgui_iconbox_create(image, "icon", - RTGUI_ICONBOX_TEXT_RIGHT); - - RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = RTGUI_RGB(255, 255, 224); - - rtgui_view_set_box(view, box); - - RTGUI_WIDGET(button)->align = RTGUI_ALIGN_CENTER_VERTICAL; - rtgui_widget_set_miniwidth(RTGUI_WIDGET(button), 80); - rtgui_widget_set_miniheight(RTGUI_WIDGET(button), 25); - rtgui_box_append(box, RTGUI_WIDGET(button)); - - /* add a horizontal box */ - rtgui_widget_set_miniwidth(RTGUI_WIDGET(hbox), 20); - rtgui_widget_set_miniheight(RTGUI_WIDGET(hbox), 100); - RTGUI_WIDGET(hbox)->align = RTGUI_ALIGN_EXPAND; - - rtgui_box_layout(hbox); - rtgui_box_append(box, RTGUI_WIDGET(hbox)); - - rtgui_box_append(box, RTGUI_WIDGET(textbox)); - - /* add icon box */ - RTGUI_WIDGET(iconbox)->gc.font = rtgui_font_refer("hz", 16); - rtgui_box_append(box, RTGUI_WIDGET(iconbox)); - rtgui_box_layout(box); - } - - /* show view */ - rtgui_view_show(view); - rtgui_workbench_event_loop(workbench); -} - -void rtgui_demo_workbench_init() -{ - static rt_bool_t inited = RT_FALSE; - - if (inited == RT_FALSE) - { - rt_thread_t tid; - - tid = rt_thread_create("tWB", - rtgui_demo_workbench_entry, RT_NULL, - 2048, 25, 10); - - if (tid != RT_NULL) rt_thread_startup(tid); - - inited = RT_TRUE; - } -} - -#ifdef RT_USING_RTGUI -#include -void w() -{ - rtgui_demo_workbench_init(); -} -FINSH_FUNCTION_EXPORT(w, workbench demo) -#endif - diff --git a/bsp/stm32_radio/http.c b/bsp/stm32_radio/http.c index b86a6fc1ae..89e3be0ffa 100644 --- a/bsp/stm32_radio/http.c +++ b/bsp/stm32_radio/http.c @@ -371,7 +371,7 @@ static int shoutcast_connect(struct shoutcast_session* session, int socket_handle; int peer_handle; int rc; - char mimeBuffer[100]; + char mimeBuffer[256]; if((socket_handle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0) { @@ -460,7 +460,7 @@ static int shoutcast_connect(struct shoutcast_session* session, if (strstr(mimeBuffer, "content-type:")) { /* check content-type */ - if (strstr(mimeBuffer, "content-type: audio/mpeg") == RT_NULL) + if (strstr(mimeBuffer, "audio/mpeg") == RT_NULL) { rt_kprintf("ICY content is not audio/mpeg.\n"); return -1; @@ -470,7 +470,7 @@ static int shoutcast_connect(struct shoutcast_session* session, if (strstr(mimeBuffer, "Content-Type:")) { /* check content-type */ - if (strstr(mimeBuffer, "Content-Type: audio/mpeg") == RT_NULL) + if (strstr(mimeBuffer, "audio/mpeg") == RT_NULL) { rt_kprintf("ICY content is not audio/mpeg.\n"); return -1; @@ -530,6 +530,7 @@ rt_size_t shoutcast_session_read(struct shoutcast_session* session, rt_uint8_t * int bytesRead = 0; int totalRead = 0; int left = length; + static rt_uint32_t first_meta_size = 0; // Read until: there is an error, we've read "size" bytes or the remote // side has closed the connection. @@ -548,32 +549,56 @@ rt_size_t shoutcast_session_read(struct shoutcast_session* session, rt_uint8_t * } while(left); /* handle meta */ - if (session->current_meta_chunk + totalRead >= session->metaint) + if (first_meta_size > 0) { - int meta_length, next_chunk_length; - - // rt_kprintf("c: %d, total: %d\n", session->current_meta_chunk, totalRead); - - /* get the length of meta data */ - meta_length = buffer[session->metaint - session->current_meta_chunk] * 16; - next_chunk_length = totalRead - (session->metaint - session->current_meta_chunk) - - (meta_length + 1); + /* skip meta data */ + memmove(&buffer[0], &buffer[first_meta_size], totalRead - first_meta_size); - // rt_kprintf("l: %d, n: %d\n", meta_length, next_chunk_length); + // rt_kprintf("remove meta: len %d\n", first_meta_size); - /* skip meta data */ - memmove(&buffer[session->metaint - session->current_meta_chunk], - &buffer[session->metaint - session->current_meta_chunk + meta_length + 1], - next_chunk_length); - - /* set new current meta chunk */ - session->current_meta_chunk = next_chunk_length; - totalRead = totalRead - (meta_length + 1); - // rt_kprintf("total: %d\n", totalRead); + totalRead = totalRead - first_meta_size; + first_meta_size = 0; + session->current_meta_chunk = totalRead; } - else + else { - session->current_meta_chunk += totalRead; + if (session->current_meta_chunk + totalRead == session->metaint) + { + rt_uint8_t meta_data; + recv(session->socket, &meta_data, 1, 0); + + /* remove meta data in next packet */ + first_meta_size = meta_data * 16; + session->current_meta_chunk = 0; + + // rt_kprintf("get meta: len %d\n", first_meta_size); + } + else if (session->current_meta_chunk + totalRead > session->metaint) + { + int meta_length, next_chunk_length; + + // rt_kprintf("c: %d, total: %d, m: %d\n", session->current_meta_chunk, totalRead, session->metaint); + + /* get the length of meta data */ + meta_length = buffer[session->metaint - session->current_meta_chunk] * 16; + next_chunk_length = totalRead - (session->metaint - session->current_meta_chunk) - + (meta_length + 1); + + // rt_kprintf("l: %d, n: %d\n", meta_length, next_chunk_length); + + /* skip meta data */ + memmove(&buffer[session->metaint - session->current_meta_chunk], + &buffer[session->metaint - session->current_meta_chunk + meta_length + 1], + next_chunk_length); + + /* set new current meta chunk */ + session->current_meta_chunk = next_chunk_length; + totalRead = totalRead - (meta_length + 1); + } + else + { + session->current_meta_chunk += totalRead; + } } return totalRead; diff --git a/bsp/stm32_radio/mp3.c b/bsp/stm32_radio/mp3.c index 8329768061..c60715aec6 100644 --- a/bsp/stm32_radio/mp3.c +++ b/bsp/stm32_radio/mp3.c @@ -183,7 +183,8 @@ int mp3_decoder_run(struct mp3_decoder* decoder) delta += (decoder->bytes_left_before_decoding - decoder->bytes_left); current_offset += delta; - player_set_position(current_offset); + if (player_get_mode() != PLAYER_PLAY_RADIO) + player_set_position(current_offset); // rt_kprintf("bytes left after decode: %d\n", decoder->bytes_left); diff --git a/bsp/stm32_radio/netbuffer.c b/bsp/stm32_radio/netbuffer.c index f970d2a67c..f93189ed82 100644 --- a/bsp/stm32_radio/netbuffer.c +++ b/bsp/stm32_radio/netbuffer.c @@ -268,7 +268,7 @@ static void net_buf_do_job(struct net_buffer_job* job) rt_hw_interrupt_enable(level); } - rt_kprintf("buffering ... %d %c\n", (data_length * 100) / _netbuf.size, '%'); + // rt_kprintf("buffering ... %d %c\n", (data_length * 100) / _netbuf.size, '%'); /* set buffer position */ player_set_position(data_length); diff --git a/bsp/stm32_radio/player_ui.c b/bsp/stm32_radio/player_ui.c index 96361d0238..8f9a3e789c 100644 --- a/bsp/stm32_radio/player_ui.c +++ b/bsp/stm32_radio/player_ui.c @@ -378,6 +378,11 @@ void player_set_buffer_status(rt_bool_t buffering) strncpy(tinfo.artist, "播放中...", 40); } +enum PLAYER_MODE player_get_mode() +{ + return player_mode; +} + void player_play_file(const char* fn) { struct rtgui_dc* dc; @@ -652,6 +657,11 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg switch (next_step) { case PLAYER_STEP_STOP: +// #define TEST_MODE +#ifdef TEST_MODE + player_play_file(play_list_start()); + next_step = PLAYER_STEP_STOP; +#else { struct rtgui_dc* dc; rtgui_color_t saved; @@ -680,6 +690,7 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg RTGUI_WIDGET_FOREGROUND(widget) = saved; rtgui_dc_end_drawing(dc); } +#endif break; case PLAYER_STEP_NEXT: diff --git a/bsp/stm32_radio/player_ui.h b/bsp/stm32_radio/player_ui.h index 921f2873b6..4e657fc873 100644 --- a/bsp/stm32_radio/player_ui.h +++ b/bsp/stm32_radio/player_ui.h @@ -49,4 +49,7 @@ void player_set_position(rt_uint32_t position); void player_set_title(const char* title); void player_set_buffer_status(rt_bool_t buffering); +/* get playing mode */ +enum PLAYER_MODE player_get_mode(void); + #endif diff --git a/bsp/stm32_radio/stm32f10x_it.c b/bsp/stm32_radio/stm32f10x_it.c index 7b73cdc9e6..afe4d6833e 100644 --- a/bsp/stm32_radio/stm32f10x_it.c +++ b/bsp/stm32_radio/stm32f10x_it.c @@ -233,17 +233,6 @@ void EXTI0_IRQHandler(void) { } -/******************************************************************************* -* Function Name : EXTI1_IRQHandler -* Description : This function handles External interrupt Line 1 request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI1_IRQHandler(void) -{ -} - /******************************************************************************* * Function Name : EXTI2_IRQHandler * Description : This function handles External interrupt Line 2 request. diff --git a/bsp/stm32_radio/touch.c b/bsp/stm32_radio/touch.c new file mode 100644 index 0000000000..f65faee7d7 --- /dev/null +++ b/bsp/stm32_radio/touch.c @@ -0,0 +1,139 @@ +#include "stm32f10x.h" +#include "rtthread.h" + +static void Delay_Nus(unsigned int dt) +{ + volatile unsigned int a; + while (--dt) + { + for (a=0; a<5000; a++); + } +} + +/* +MISO PA6 +MOSI PA7 +CLK PA5 +CS PC4 +*/ + +#define CS_0() GPIO_ResetBits(GPIOC,GPIO_Pin_4) +#define CS_1() GPIO_SetBits(GPIOC,GPIO_Pin_4) + +/* +7 6 - 4 3 2 1-0 +s A2-A0 MODE SER/DFR PD1-PD0 +*/ +#define TOUCH_MSR_X 0x90 //读X轴坐标指令 addr:1 +#define TOUCH_MSR_Y 0xD0 //读Y轴坐标指令 addr:3 + + +extern unsigned char SPI_WriteByte(unsigned char data); + +//SPI写数据 +static void WriteDataTo7843(unsigned char num) +{ + SPI_WriteByte(num); +} + +//SPI 读数据 +static unsigned int ReadDataFrom7843(void) +{ + unsigned int temp; + temp = SPI_WriteByte(0x00)<<4; + temp |= ( (SPI_WriteByte(0x00)>>4)&0x0F ); + return temp; +} + +//触摸处理 +void Go_Touch(void) +{ + unsigned int X; + unsigned int Y; + + CS_0(); + WriteDataTo7843(TOUCH_MSR_X); //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料 + Delay_Nus(100); + Y = ReadDataFrom7843(); //读X轴坐标 + WriteDataTo7843(TOUCH_MSR_Y); //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料 + Delay_Nus(50); + X = ReadDataFrom7843(); //读Y轴坐标 + CS_1(); + + rt_kprintf("\r\nX: %04d Y: %04d",X,Y); +} + +static void NVIC_Configuration(void) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + /* Enable the EXTI0 Interrupt */ + NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +} + +static void exti_int_config(void) +{ + EXTI_InitTypeDef EXTI_InitStructure; + + /* PB1 touch INT */ + + GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); + + /* Configure EXTI */ + EXTI_InitStructure.EXTI_Line = EXTI_Line1; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//Falling下降沿 Rising上升 + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line1); +} + +#include +void touch_test(void) +{ + rt_kprintf("\r\ntouch testing....\r\n"); + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); + + + NVIC_Configuration(); + exti_int_config(); + + /* PC4 touch CS */ + { + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOB,&GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; + GPIO_Init(GPIOC,&GPIO_InitStructure); + CS_1(); + } + Delay_Nus( 500 ); + + CS_0(); + WriteDataTo7843(0x00); + CS_1(); +} +FINSH_FUNCTION_EXPORT(touch_test, touch_test) + +void EXTI1_IRQHandler(void) +{ + EXTI_ClearITPendingBit(EXTI_Line1); + Go_Touch(); +} + +/******************* (C) COPYRIGHT 2008 STMicroelectronics */ -- GitLab