summaryrefslogtreecommitdiff
path: root/minion/src/wifi_module.hpp
blob: 55abdfc035de1ccb9212902ad24c68a32dfbec9d (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#pragma once

#include "http/request.hpp"

#include <SoftwareSerial.h>
#include <stddef.h>
#include <stdint.h>

constexpr auto MAX_NETWORK_MODULE_RESPONSE_LENGTH = 128U;

constexpr auto REQUEST_DATA_LENGTH_BUF_SIZE = 16U;
constexpr auto REQUEST_METHOD_STR_MAX_LENGTH = 10U;
constexpr auto REQUEST_PATH_MAX_LENGTH = 64U;
constexpr auto REQUEST_HTTP_VERSION_MAX_LENGTH = 10U;

constexpr auto ASCII_TO_CHAR = 48U;

constexpr auto TIMEOUT_SHORT = 1500U;
constexpr auto TIMEOUT_MEDIUM = 4000U;
constexpr auto TIMEOUT_LONG = 10000U;

enum WifiMode
{
	Station = 1,
	SoftAP = 2,
	SoftAPAndStation = 3
};

enum ResponseStatus
{
	OK,
	FAIL,
	ERROR,
	TIMEOUT
};

struct WiFiModuleOptions
{
	uint8_t receive_pin;
	uint8_t transmit_pin;
};

class WiFiModule
{
public:
	explicit WiFiModule(const WiFiModuleOptions &options) noexcept;

	void begin(size_t baudrate) noexcept;

	auto get_available() noexcept -> int;

	void reset() noexcept;

	/**
	 * Connects to a wifi network.
	 *
	 * @param ssid The service set identifier of a wifi network.
	 * @param password The wifi network password.
	 *
	 * @returns Whether or not it succeeded.
	 */
	auto connect_to_wifi(const char *ssid, const char *password) noexcept -> bool;

	void set_wifi_mode(WifiMode wifi_mode) noexcept;

	void set_multiple_connections_enabled(bool is_enabled) noexcept;

	void set_echo_enabled(bool is_enabled) noexcept;

	void create_tcp_server(size_t port) noexcept;

	/**
	 * Tests the connection to the wifi module.
	 *
	 * @returns Whether or not the test succeeded.
	 */
	auto test() noexcept -> bool;

	/**
	 * Gets local IP address of the wifi module.
	 *
	 * @param local_ip_out Local IP output buffer.
	 *
	 * @returns A pointer to the local IP output buffer.
	 */
	auto get_local_ip(char *local_ip_out) noexcept -> const char *;

	/**
	 * Reads a incoming HTTP request.
	 *
	 * @returns A pointer to the request. Has to be deleted after use. Is nullptr if
	 * reading the request failed.
	 */
	auto read_incoming_request() noexcept -> HTTPRequest *;

	auto close_connection(size_t connection_id) noexcept -> bool;

	auto send(size_t connection_id, const char *data) noexcept -> bool;

private:
	SoftwareSerial _serial;

	/**
	 * Sends a command to the wifi module.
	 *
	 * @param command A command without the "AT+" in the beginning.
	 *
	 * @returns Whether or not it succeeded.
	 */
	auto _send_serial(const char *command) noexcept -> bool;

	size_t _read_connection_id() noexcept;

	size_t _read_request_data_length() noexcept;

	HTTPRequestMethod _read_request_method(size_t &request_data_length) noexcept;

	/**
	 * Reads from the wifi module until it responds with a status.
	 *
	 * @param timeout Timeout in milliseconds.
	 * @param response_out Response output buffer.
	 *
	 * @returns The response status.
	 *
	 */
	auto _read(uint64_t timeout, char *response_out) noexcept -> ResponseStatus;

	void
	_read_to(char *buffer_out, size_t length, char stop_char, uint64_t timeout) noexcept;

	void _read_bytes(char *buffer_out, size_t length, uint64_t timeout) noexcept;

	auto _read_byte() noexcept -> char;
};