Browse Source

update radio_list_update by inkfish

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@510 bbd45198-f89e-11dd-88c7-29a3b14d5316
wuyangyong 15 years ago
parent
commit
a4ce05206f
2 changed files with 776 additions and 580 deletions
  1. 614 572
      bsp/stm32_radio/player_ui.c
  2. 162 8
      bsp/stm32_radio/radio_list_update.c

File diff suppressed because it is too large
+ 614 - 572
bsp/stm32_radio/player_ui.c


+ 162 - 8
bsp/stm32_radio/radio_list_update.c

@@ -1,3 +1,11 @@
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_system.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/workbench.h>
+
 #include <stm32f10x.h>
 #include <rtthread.h>
 #include <dfs_posix.h>
@@ -20,8 +28,16 @@ extern int http_resolve_address(struct sockaddr_in *server, const char * url, ch
 
 const char _radio_list_update_get[] = "GET %s HTTP/1.0\r\nHost: %s:%d\r\nUser-Agent: RT-Thread HTTP Agent\r\nConnection: close\r\n\r\n";
 rt_mq_t update_radio_mq = RT_NULL;
+static struct rtgui_view* update_radio_list_view = RT_NULL;
 
+typedef enum
+{
+    UPDATE_RAIDO_LIST_PROC,
+    UPDATE_RADIO_LIST_CONNECT_FAILED,
+    UPDATE_RADIO_LIST_SUCCEED,
+} UPDATE_RADIO_LIST_STATE;
 
+static UPDATE_RADIO_LIST_STATE update_radio_list_state;
 
 int  radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_addr, const char* url)
 {
@@ -39,6 +55,7 @@ int  radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
     peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server));
     if ( peer_handle < 0 )
     {
+        closesocket(socket_handle);
         rt_kprintf( "RLUS: CONNECT FAILED %i\n", peer_handle );
         return -1;
     }
@@ -66,8 +83,11 @@ int  radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
         rc = http_read_line(peer_handle, mimeBuffer, 100);
         rt_kprintf(">>%s", mimeBuffer);
 
-        if ( rc < 0 ) return rc;
-
+        if ( rc < 0 )
+        {
+            closesocket(peer_handle);
+            return rc;
+        }
         // End of headers is a blank line.  exit.
         if (rc == 0) break;
         if ((rc == 2) && (mimeBuffer[0] == '\r')) break;
@@ -78,6 +98,7 @@ int  radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
             if(rc)
             {
                 rt_kprintf("HTTP: status code = %d!\n", rc);
+                closesocket(peer_handle);
                 return -rc;
             }
         }
@@ -88,6 +109,7 @@ int  radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
             if (strstr(mimeBuffer, "text/plain") == RT_NULL)
             {
                 rt_kprintf("radio list update content is not text/plain.\n");
+                closesocket(peer_handle);
                 return -1;
             }
         }
@@ -98,6 +120,7 @@ int  radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
             if (strstr(mimeBuffer, "text/plain") == RT_NULL)
             {
                 rt_kprintf("radio list update content is not text/plain.\n");
+                closesocket(peer_handle);
                 return -1;
             }
         }
@@ -105,9 +128,10 @@ int  radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
 
     return peer_handle;
 }
+
 int radio_list_update_servicer_session_open(char* url)
 {
-    int peer_handle = 0;
+    int peer_handle = -1;
     struct sockaddr_in server;
     char *request, host_addr[32];
 
@@ -124,7 +148,7 @@ int radio_list_update_servicer_session_open(char* url)
     return peer_handle;
 
 }
-void update_radio_list(char* url)
+int update_radio_list(char* url)
 {
     char *buf = NULL;
     int peer_handle = 0;
@@ -135,13 +159,13 @@ void update_radio_list(char* url)
 
     if(peer_handle < 0)
     {
-        return;
+        return -1;
     }
 
     fd = open(RADIO_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
     if(fd < 0)
     {
-        return;
+        return -1;
     }
     buf = rt_malloc (512);
     while ( 1 )
@@ -160,11 +184,13 @@ void update_radio_list(char* url)
     }
     rt_free(buf);
 
+    closesocket(peer_handle);
+
     if(close(fd) == 0)
     {
         rt_kprintf("Update radio list succeed \r\n");
     }
-
+    return 0;
 }
 
 void update_radio_list_req(void)
@@ -174,6 +200,7 @@ void update_radio_list_req(void)
     extern rt_mq_t player_thread_mq;
     char* ch = RT_NULL;
 
+    update_radio_list_state = UPDATE_RAIDO_LIST_PROC;
     request.type = PLAYER_REQUEST_UPDATE_RADIO_LIST;
     ch = strncpy(request.fn, RADIO_LIST_UPDATE_URL, strlen(RADIO_LIST_UPDATE_URL));
 
@@ -187,6 +214,8 @@ void update_radio_thread(void* parameter)
     rt_err_t result;
     struct player_request request;
     rt_thread_t update_radio_list_thread;
+
+
     while(1)
     {
         /* get request from message queue */
@@ -196,11 +225,25 @@ void update_radio_thread(void* parameter)
         {
             switch (request.type)
             {
+
             case PLAYER_REQUEST_UPDATE_RADIO_LIST:
                 if ((strstr(request.fn, "http://") == request.fn ||
                         (strstr(request.fn, "HTTP://") == request.fn )))
                 {
-                    update_radio_list(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;
             }
@@ -212,3 +255,114 @@ void update_radio_thread(void* parameter)
     }
 }
 
+void drawing_update_state_info(struct rtgui_widget* widget)
+{
+    char* line;
+    struct rtgui_dc* dc;
+    struct rtgui_rect rect;
+
+    line = rtgui_malloc(256);
+    if (line == RT_NULL) return ;
+
+    dc = rtgui_dc_begin_drawing(widget);
+    if (dc == RT_NULL)
+    {
+        rt_free(line);
+        return;
+    }
+
+    rtgui_widget_get_rect(widget, &rect);
+
+    /* fill background */
+    rtgui_dc_fill_rect(dc, &rect);
+
+    rect.y2 = rect.y1 + 18;
+    switch(update_radio_list_state)
+    {
+    case UPDATE_RAIDO_LIST_PROC:
+        sprintf(line, "正在更新电台列表......");
+        break	;
+
+    case UPDATE_RADIO_LIST_CONNECT_FAILED:
+        sprintf(line, "更新电台列表失败,请返回");
+        break;
+
+    case UPDATE_RADIO_LIST_SUCCEED:
+        sprintf(line, "更新电台列表成功,请返回");
+        break;
+    }
+
+    rtgui_dc_draw_text(dc, line, &rect);
+
+    rtgui_dc_end_drawing(dc);
+
+    rtgui_free(line);
+}
+
+static rt_bool_t update_radio_list_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
+{
+    switch (event->type)
+    {
+    case RTGUI_EVENT_COMMAND:
+    {
+        struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event;
+        switch(ecmd->type)
+        {
+        case RTGUI_EVENT_PAINT:
+            drawing_update_state_info(widget);
+            return RT_FALSE;
+        }
+        return RT_FALSE;
+    }
+    case RTGUI_EVENT_PAINT:
+    {
+        drawing_update_state_info(widget);
+        return RT_FALSE;
+    }
+
+    case RTGUI_EVENT_KBD:
+    {
+        struct rtgui_event_kbd* ekbd;
+
+        ekbd = (struct rtgui_event_kbd*)event;
+        if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN)
+        {
+            rtgui_workbench_t* workbench;
+
+            workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(update_radio_list_view)->parent);
+            rtgui_workbench_remove_view(workbench, update_radio_list_view);
+
+            rtgui_view_destroy(update_radio_list_view);
+            update_radio_list_view = RT_NULL;
+        }
+    }
+    return RT_FALSE;
+    }
+
+    /* use parent event handler */
+    return rtgui_view_event_handler(widget, event);
+}
+
+rtgui_view_t *update_radio_list_view_create(rtgui_workbench_t* workbench)
+{
+    if (update_radio_list_view != RT_NULL)
+    {
+        rtgui_view_show(update_radio_list_view, RT_FALSE);
+    }
+    else
+    {
+        /* create a view */
+        update_radio_list_view = rtgui_view_create("update radio list Info");
+        /* set view event handler */
+        rtgui_widget_set_event_handler(RTGUI_WIDGET(update_radio_list_view), update_radio_list_view_event_handler);
+        /* this view can be focused */
+        RTGUI_WIDGET(update_radio_list_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
+
+        /* add view to workbench */
+        rtgui_workbench_add_view(workbench, update_radio_list_view);
+    }
+
+    return update_radio_list_view;
+}
+
+

Some files were not shown because too many files changed in this diff