diff --git a/common.mk b/common.mk index 4320f98..d0a093d 100644 --- a/common.mk +++ b/common.mk @@ -57,9 +57,9 @@ MODULE_INCDIR += include/lwip include/lwip/ipv4 include/lwip/ipv6 SDK_INCDIR=include/espressif # libraries to link, mainly blobs provided by the esp-iot-rtos SDK -LIBS ?= c gcc json lwip main net80211 phy pp ssl udhcp wpa hal +LIBS ?= gcc json lwip main net80211 phy pp ssl udhcp wpa hal -CFLAGS = -Wall -Werror -Wl,-EL -nostdlib -mlongcalls -mtext-section-literals +CFLAGS = -Wall -Werror -Wl,-EL -nostdlib -mlongcalls -mtext-section-literals -std=gnu99 LDFLAGS = -nostdlib -Wl,--no-check-sections -Wl,-L$(ROOT)lib -u call_user_start -Wl,-static -Wl,-Map=build/${TARGET}.map ifeq ($(FLAVOR),debug) diff --git a/examples/http_get/FreeRTOSConfig.h b/examples/http_get/FreeRTOSConfig.h new file mode 100644 index 0000000..4d9565a --- /dev/null +++ b/examples/http_get/FreeRTOSConfig.h @@ -0,0 +1,141 @@ +/* + FreeRTOS V7.5.2 - Copyright (C) 2013 Real Time Engineers Ltd. + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 80000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 100 ) +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 15 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short )156 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 32 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 + +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 + +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MUTEXES 1 +#define configUSE_TIMERS 1 + +#if configUSE_TIMERS +#define configTIMER_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define configTIMER_QUEUE_LENGTH (10) +#define configTIMER_TASK_STACK_DEPTH ( ( unsigned short ) 512 ) +#endif + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +/*set the #define for debug info*/ +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255 +(lowest) to 0 (1?) (highest). */ +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */ + + +/* This is the value being used as per the ST library which permits 16 +priority values, 0 to 15. This must correspond to the +configKERNEL_INTERRUPT_PRIORITY setting. Here 15 corresponds to the lowest +NVIC value of 255. */ +#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15 + +#endif /* FREERTOS_CONFIG_H */ + diff --git a/examples/http_get/Makefile b/examples/http_get/Makefile new file mode 100644 index 0000000..571d50a --- /dev/null +++ b/examples/http_get/Makefile @@ -0,0 +1,2 @@ +TARGET=http_get +include ../../common.mk diff --git a/examples/http_get/main.c b/examples/http_get/main.c new file mode 100644 index 0000000..b9c7e6d --- /dev/null +++ b/examples/http_get/main.c @@ -0,0 +1,122 @@ +#include "esp_common.h" + +#include "FreeRTOS.h" +#include "task.h" + +#include "lwip/sockets.h" +#include "lwip/dns.h" +#include "lwip/netdb.h" + +#include "espressif/blob_prototypes.h" + +#define WEB_SERVER "chainxor.org" +#define WEB_PORT 80 +#define WEB_URL "http://chainxor.org/" + +/* FILL THESE IN!!!!!!!!!! */ +#define WIFI_SSID "SSID Name Here" +#define WIFI_PASS "Wifi Password Here" + +void http_get_task(void *pvParameters) +{ + int successes = 0, failures = 0; + printf("HTTP get task starting...\r\n"); + + while(1) { + const struct addrinfo hints = { + .ai_family = AF_INET, + .ai_socktype = SOCK_STREAM, + }; + struct addrinfo *res; + + printf("Running DNS lookup for %s...\r\n", WEB_SERVER); + int err = getaddrinfo(WEB_SERVER, "80", &hints, &res); + + if(err != 0 || res == NULL) { + printf("DNS lookup failed err=%d res=%p\r\n", err, res); + if(res) + freeaddrinfo(res); + vTaskDelay(1000 / portTICK_RATE_MS); + failures++; + continue; + } + printf("DNS lookup succeeded. IP=%s\r\n", inet_ntoa(res->ai_addr)); + + int s = socket(res->ai_family, res->ai_socktype, 0); + if(s < 0) { + printf("... Failed to allocate socket.\r\n"); + freeaddrinfo(res); + vTaskDelay(1000 / portTICK_RATE_MS); + failures++; + continue; + } + + printf("... allocated socket\r\n"); + + if(connect(s, res->ai_addr, res->ai_addrlen) != 0) { + close(s); + freeaddrinfo(res); + printf("... socket connect failed.\r\n"); + vTaskDelay(4000 / portTICK_RATE_MS); + failures++; + continue; + } + + printf("... connected\r\n"); + freeaddrinfo(res); + + const char *req = + "GET "WEB_URL"\r\n" + "User-Agent: esp-open-rtos/0.1 esp8266\r\n" + "\r\n"; + if (write(s, req, strlen(req) + 1) < 0) { + printf("... socket send failed\r\n"); + close(s); + vTaskDelay(4000 / portTICK_RATE_MS); + failures++; + continue; + } + printf("... socket send success\r\n"); + + static char recv_buf[128]; + int r; + do { + bzero(recv_buf, 128); + r = read(s, recv_buf, 127); + if(r > 0) { + printf("%s", recv_buf); + } + } while(r > 0); + + printf("... done reading from socket. Last read return=%d errno=%d\r\n", r, errno); + if(r != 0) + failures++; + else + successes++; + close(s); + printf("successes = %d failures = %d\r\n", successes, failures); + for(int countdown = 10; countdown >= 0; countdown--) { + printf("%d... ", countdown); + vTaskDelay(1000 / portTICK_RATE_MS); + } + printf("\r\nStarting again!\r\n"); + } +} + +void user_init(void) +{ + uart_div_modify(0, UART_CLK_FREQ / 115200); + printf("SDK version:%s\n", system_get_sdk_version()); + + struct station_config config = { + .ssid = WIFI_SSID, + .password = WIFI_PASS, + }; + + /* required to call wifi_set_opmode before station_set_config */ + wifi_set_opmode(STATIONAP_MODE); + wifi_station_set_config(&config); + + xTaskCreate(&http_get_task, (signed char *)"get_task", 256, NULL, 2, NULL); +} +