build: W600-SDK importiert, Firmware-Build und Hello am EVK
Docker-Build mit gcc-arm-none-eabi 4.9-2014q4 (statt Homebrew-Cask) verwendet, Dockerfile/tools/docker.sh dafür aus Task 13 vorgezogen. cmake/sdk.cmake schont gcc 4.9 (kennt -fcommon/-Wno-error=... nicht). Zwei zusätzliche SDK-Stubs (EarlyInit, pre_gpio_config) in src/sys/sdk_stubs.c ergänzt, siehe sdk/PATCHES.md.
This commit is contained in:
@@ -0,0 +1,235 @@
|
||||
#include <string.h>
|
||||
#include "wm_include.h"
|
||||
#include "wm_config.h"
|
||||
#include "wm_http_client.h"
|
||||
#include "lwip/sys.h"
|
||||
#include "wm_wl_task.h"
|
||||
|
||||
#if TLS_CONFIG_HTTP_CLIENT_TASK
|
||||
#define HTTP_CLIENT_STK_SIZE 256
|
||||
static sys_mbox_t http_client_mbox = SYS_MBOX_NULL;
|
||||
static OS_STK httpClientStk[HTTP_CLIENT_STK_SIZE];
|
||||
#define HTTP_CLIENT_BUFFER_SIZE 1024
|
||||
extern u8 pSession_flag;
|
||||
static UINT32 http_snd_req_local(
|
||||
HTTP_SESSION_HANDLE pHTTP, HTTPParameters ClientParams, HTTP_VERB verb, CHAR* pSndData, u32 dataLen,
|
||||
http_client_recv_callback_fn recv_fn)
|
||||
{
|
||||
INT32 nRetCode;
|
||||
UINT32 nSize,nTotal = 0;
|
||||
CHAR* Buffer = NULL;
|
||||
UINT32 nSndDataLen ;
|
||||
CHAR token[32];
|
||||
UINT32 size=32;
|
||||
char *pRecvData=NULL;
|
||||
u32 totallen;
|
||||
do
|
||||
{
|
||||
Buffer = (CHAR*)tls_mem_alloc(HTTP_CLIENT_BUFFER_SIZE);
|
||||
if(Buffer == NULL)
|
||||
{
|
||||
return HTTP_CLIENT_ERROR_NO_MEMORY;
|
||||
}
|
||||
memset(Buffer, 0, HTTP_CLIENT_BUFFER_SIZE);
|
||||
//printf("\nHTTP Client v1.0\n\n");
|
||||
nSndDataLen = (pSndData==NULL ? 0 : dataLen);
|
||||
// Set the Verb
|
||||
nRetCode = HTTPClientSetVerb(pHTTP,verb);
|
||||
if(nRetCode != HTTP_CLIENT_SUCCESS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
#if TLS_CONFIG_HTTP_CLIENT_AUTH
|
||||
// Set authentication
|
||||
if(ClientParams.AuthType != AuthSchemaNone)
|
||||
{
|
||||
if((nRetCode = HTTPClientSetAuth(pHTTP,ClientParams.AuthType,NULL)) != HTTP_CLIENT_SUCCESS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Set authentication
|
||||
if((nRetCode = HTTPClientSetCredentials(pHTTP,ClientParams.UserName,ClientParams.Password)) != HTTP_CLIENT_SUCCESS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif //TLS_CONFIG_HTTP_CLIENT_AUTH
|
||||
#if TLS_CONFIG_HTTP_CLIENT_PROXY
|
||||
// Use Proxy server
|
||||
if(ClientParams.UseProxy == TRUE)
|
||||
{
|
||||
if((nRetCode = HTTPClientSetProxy(pHTTP,ClientParams.ProxyHost,ClientParams.ProxyPort,NULL,NULL)) != HTTP_CLIENT_SUCCESS)
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif //TLS_CONFIG_HTTP_CLIENT_PROXY
|
||||
if((nRetCode = HTTPClientSendRequest(pHTTP,ClientParams.Uri,pSndData,nSndDataLen,verb==VerbPost || verb==VerbPut,0,0)) != HTTP_CLIENT_SUCCESS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
// Retrieve the the headers and analyze them
|
||||
if((nRetCode = HTTPClientRecvResponse(pHTTP,30)) != HTTP_CLIENT_SUCCESS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
memset(token, 0, 32);
|
||||
if((nRetCode = HTTPClientFindFirstHeader(pHTTP, "content-length", token, &size)) != HTTP_CLIENT_SUCCESS)
|
||||
{
|
||||
totallen = HTTP_CLIENT_BUFFER_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
totallen = atol(strstr(token,":")+1);
|
||||
|
||||
}
|
||||
HTTPClientFindCloseHeader(pHTTP);
|
||||
//printf("Start to receive data from remote server...\n");
|
||||
// Get the data until we get an error or end of stream code
|
||||
pSession_flag = 0;
|
||||
while(nRetCode == HTTP_CLIENT_SUCCESS || nRetCode != HTTP_CLIENT_EOS)
|
||||
{
|
||||
// Set the size of our buffer
|
||||
nSize = HTTP_CLIENT_BUFFER_SIZE;
|
||||
// Get the data
|
||||
nRetCode = HTTPClientReadData(pHTTP,Buffer,nSize,300,&nSize);
|
||||
if(nRetCode != HTTP_CLIENT_SUCCESS && nRetCode != HTTP_CLIENT_EOS)
|
||||
break;
|
||||
pRecvData = tls_mem_alloc(nSize);
|
||||
if(pRecvData == NULL)
|
||||
{
|
||||
nRetCode = HTTP_CLIENT_ERROR_NO_MEMORY;
|
||||
break;
|
||||
}
|
||||
memcpy(pRecvData, Buffer, nSize);
|
||||
recv_fn(pHTTP, pRecvData, totallen, nSize);
|
||||
}
|
||||
} while(0); // Run only once
|
||||
if(Buffer)
|
||||
tls_mem_free(Buffer);
|
||||
if(pHTTP)
|
||||
HTTPClientCloseRequest(&pHTTP);
|
||||
if(ClientParams.Verbose == TRUE)
|
||||
{
|
||||
printf("\n\nHTTP Client terminated %d (got %d kb)\n\n",nRetCode,(nTotal/ 1024));
|
||||
}
|
||||
return nRetCode;
|
||||
}
|
||||
|
||||
static void http_client_rx(void *sdata)
|
||||
{
|
||||
int ret;
|
||||
void *msg;
|
||||
http_client_msg *http_msg;
|
||||
for(;;)
|
||||
{
|
||||
sys_arch_mbox_fetch(&http_client_mbox, (void **)&msg, 0);
|
||||
http_msg = (http_client_msg *)msg;
|
||||
ret = http_snd_req_local(http_msg->pSession,
|
||||
http_msg->param,
|
||||
http_msg->method,
|
||||
http_msg->sendData,
|
||||
http_msg->dataLen,
|
||||
http_msg->recv_fn);
|
||||
//printf("http_client_rx ret=%d\n", ret);
|
||||
if(ret == HTTP_CLIENT_SUCCESS || ret == HTTP_CLIENT_EOS)
|
||||
{
|
||||
;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(http_msg->err_fn != NULL)
|
||||
http_msg->err_fn(http_msg->pSession, ret);
|
||||
}
|
||||
if(http_msg->sendData != NULL)
|
||||
tls_mem_free(http_msg->sendData);
|
||||
if(http_msg->param.Uri)
|
||||
tls_mem_free(http_msg->param.Uri);
|
||||
tls_mem_free(http_msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
int http_client_task_init(void)
|
||||
{
|
||||
if(sys_mbox_new(&http_client_mbox, 32) != ERR_OK) {
|
||||
return WM_FAILED;
|
||||
}
|
||||
tls_os_task_create(NULL, "HTTPCLNT",
|
||||
http_client_rx,
|
||||
NULL,
|
||||
(void *)httpClientStk, /* task's stack start address */
|
||||
HTTP_CLIENT_STK_SIZE * sizeof(u32), /* task's stack size, unit:byte */
|
||||
TLS_HTTP_CLIENT_TASK_PRIO,
|
||||
0);
|
||||
return WM_SUCCESS;
|
||||
}
|
||||
|
||||
int http_client_post(http_client_msg * msg)
|
||||
{
|
||||
int len;
|
||||
err_t err;
|
||||
http_client_msg * msg1 = tls_mem_alloc(sizeof(http_client_msg));
|
||||
if(!msg1)
|
||||
return HTTP_CLIENT_ERROR_NO_MEMORY;
|
||||
memset(msg1, 0, sizeof(http_client_msg));
|
||||
memcpy(msg1, msg, sizeof(http_client_msg));
|
||||
if(msg->dataLen > 0)
|
||||
{
|
||||
msg1->sendData = tls_mem_alloc(msg->dataLen);
|
||||
if(msg1->sendData == NULL)
|
||||
{
|
||||
tls_mem_free(msg1);
|
||||
return HTTP_CLIENT_ERROR_NO_MEMORY;
|
||||
}
|
||||
memcpy(msg1->sendData, msg->sendData, msg->dataLen);
|
||||
}
|
||||
else
|
||||
msg1->sendData = NULL;
|
||||
if(msg->param.Uri != NULL)
|
||||
{
|
||||
len = strlen(msg->param.Uri);
|
||||
msg1->param.Uri = tls_mem_alloc(len + 1);
|
||||
if(msg1->param.Uri == NULL)
|
||||
{
|
||||
if(msg1->sendData)
|
||||
tls_mem_free(msg1->sendData);
|
||||
tls_mem_free(msg1);
|
||||
return HTTP_CLIENT_ERROR_NO_MEMORY;
|
||||
}
|
||||
memset(msg1->param.Uri, 0, len + 1);
|
||||
memcpy(msg1->param.Uri,msg->param.Uri,len);
|
||||
}
|
||||
|
||||
// Open the HTTP request handle
|
||||
msg->pSession= HTTPClientOpenRequest(0);
|
||||
if(!msg->pSession)
|
||||
{
|
||||
if(msg1->sendData)
|
||||
tls_mem_free(msg1->sendData);
|
||||
if(msg1->param.Uri)
|
||||
tls_mem_free(msg1->param.Uri);
|
||||
tls_mem_free(msg1);
|
||||
return HTTP_CLIENT_ERROR_INVALID_HANDLE;
|
||||
}
|
||||
msg1->pSession = msg->pSession;
|
||||
err = sys_mbox_trypost(&http_client_mbox, msg1);
|
||||
//printf("post err=%d\n", err);
|
||||
if(err != ERR_OK)
|
||||
{
|
||||
HTTPClientCloseRequest(&msg->pSession);
|
||||
if(msg1->sendData)
|
||||
tls_mem_free(msg1->sendData);
|
||||
if(msg1->param.Uri)
|
||||
tls_mem_free(msg1->param.Uri);
|
||||
tls_mem_free(msg1);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
#endif //TLS_CONFIG_HTTP_CLIENT_TASK
|
||||
|
||||
Reference in New Issue
Block a user