aboutsummaryrefslogtreecommitdiff
path: root/stm32f091/esp8266.c
blob: d45954e3200e9448fe7521093093d770876c3654 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stm32f0xx_hal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stm32f0xx.h>

#include "esp8266.h"
#include "setup.h"
#include "consts.h"
#include "server.h"
#include "util.h"

// macro for concise sending of multiple commands
#define ws_esp8266_send_seq(cmd) { \
	uint8_t _cmd[] = cmd; \
	ws_server_send(_cmd, sizeof(_cmd)); \
}

uint8_t g_ws_esp8266_dma_rx_buffer[WS_DMA_RX_BUFFER_SIZE];
uint8_t g_ws_esp8266_dma_tx_buffer[WS_DMA_TX_BUFFER_SIZE];

void DMA1_Ch1_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_usart1_rx); }
void DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_usart1_tx); }
void USART1_IRQHandler(void) {
	if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) {
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		HAL_UART_RxCpltCallback(&huart1);
		HAL_UART_DMAStop(&huart1);
		ws_esp8266_start_receive();
	}
	HAL_UART_IRQHandler(&huart1);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) {
	size_t len = strlen((char*) g_ws_esp8266_dma_rx_buffer);
	if (len > 0) ws_server_req_incoming(g_ws_esp8266_dma_rx_buffer, len);

	memset(g_ws_esp8266_dma_rx_buffer, 0, WS_DMA_RX_BUFFER_SIZE);
	ws_esp8266_start_receive();
}

void ws_esp8266_send(uint8_t* data, size_t size) {
	size_t limited_size = WS_MIN(size, WS_DMA_TX_BUFFER_SIZE - 1);
	memcpy(g_ws_esp8266_dma_tx_buffer, data, limited_size);
	g_ws_esp8266_dma_tx_buffer[limited_size] = 0x00;

#ifdef WS_DBG_PRINT_ESP_OVER_USART2
	uint8_t green[] = { 0x1b, 0x5b, 0x33, 0x32, 0x6d };
	HAL_UART_Transmit(&huart2, green, sizeof(green), 100);
	HAL_UART_Transmit(&huart2, g_ws_esp8266_dma_tx_buffer, strlen((char*) g_ws_esp8266_dma_tx_buffer), 100);
#endif

	HAL_UART_Transmit_DMA(&huart1, g_ws_esp8266_dma_tx_buffer, strlen((char*) g_ws_esp8266_dma_tx_buffer));
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}

void ws_esp8266_start_receive() {
	HAL_UART_Receive_DMA(&huart1, g_ws_esp8266_dma_rx_buffer, WS_DMA_RX_BUFFER_SIZE);
	__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
}

void ws_esp8266_connect() {
	ws_esp8266_send_seq("AT+CWJAP=\"" WS_ESP8266_WLAN_SSID "\",\"" WS_ESP8266_WLAN_PASSWD "\"\r\n");
}

void ws_esp8266_ap_client_mode() {
	ws_esp8266_send_seq("AT+CWMODE=1\r\n");
}

void ws_esp8266_start_tcp_server() {
	ws_esp8266_send_seq("AT+CIPSERVER=0\r\n");
	ws_esp8266_send_seq("AT+CIPMUX=1\r\n");
	ws_esp8266_send_seq("AT+CIPSERVER=1," WS_SERVER_PORT "\r\n");
}

void ws_esp8266_set_mac() {
	ws_esp8266_send_seq("AT+CIPSTAMAC=\"" WS_ESP8266_WLAN_MAC "\"\r\n");
}

void ws_esp8266_set_ip() {
	ws_esp8266_send_seq("AT+CIPSTA=\"" WS_ESP8266_WLAN_IP "\"\r\n");
}

// TODO: refactor code from here to EOF
void ws_esp8266_ATsendCommand(uint8_t* data){
	char dataChar[20];
	uint8_t Tx_send[]="AT+CIPSEND=0,";

	itoa(strlen((char*)data),dataChar,10);
	strcat((char*)Tx_send,dataChar);
	strcat((char*)Tx_send,"\r\n");
	HAL_UART_Transmit(&huart1, Tx_send, strlen((char*)Tx_send),1000);
	HAL_Delay(2000);
	HAL_UART_Transmit(&huart1, data, strlen((char*)data),1000);
	HAL_Delay(1000);
	HAL_UART_Transmit(&huart2, data, strlen((char*)data),1000);
	HAL_Delay(5000);
}
void ws_esp8266_close(){

	uint8_t Tx_close[]="AT+CIPCLOSE=0\r\n";


	    HAL_UART_Transmit(&huart1, Tx_close,strlen((char*)Tx_close), 100);

		HAL_Delay(3000);

}