hanze/muizenval

client/interface.ino in master
Repositories | Summary | Log | Files

interface.ino (3371B) download


  1#include "include/config.h"
  2#include "include/interface.h"
  3#include "include/led.h"
  4
  5json null_response;
  6
  7static const char* method_strings[] = {
  8	[interface::METHOD_GET]	 = "GET",
  9	[interface::METHOD_POST] = "POST",
 10};
 11
 12void interface::begin() {
 13	writeLED(COLOR_MAGENTA);
 14
 15	usbSerial.begin(remoteBaud);
 16	usbSerial.setTimeout(remoteTimeout);
 17
 18	if (remoteForce)
 19		return;
 20
 21	pinMode(modemPowerPin, OUTPUT);		 // Put voltage on the nb-iot module
 22	pinMode(modemVoltagePin, OUTPUT);	 // Switch module voltage
 23	pinMode(modemEnablePin, OUTPUT);	 // Set state to active
 24
 25	digitalWrite(modemPowerPin, HIGH);
 26	digitalWrite(modemVoltagePin, LOW);
 27	digitalWrite(modemEnablePin, HIGH);
 28	modemSerial.begin(modemBaud);
 29
 30	while (!modemSerial)
 31		;
 32
 33	// -*- module initialization -*-
 34	for (;;) {
 35		modemSerial.write("AT\r\n");
 36		delay(1000);
 37		if (modemSerial.available())
 38			break;
 39	}
 40
 41	while (modemSerial.available())	   // clear cache
 42		modemSerial.read();
 43
 44	// commands...
 45
 46	modemReady = true;
 47
 48	writeLED(COLOR_BLUE);
 49}
 50
 51void interface::beginRemote() {
 52	if (remoteReady)	// already initalizised
 53		return;
 54
 55	delay(2500);
 56
 57	sendToken();
 58
 59	writeLED(COLOR_MAGENTA);
 60	remoteReady = true;
 61}
 62
 63void interface::endRemote() {
 64	if (!remoteReady)
 65		return;
 66
 67	writeLED(COLOR_BLUE);
 68	remoteReady = false;
 69}
 70
 71int interface::send(interface::method method, const char* endpoint) {
 72	if (usbSerial) {
 73		beginRemote();
 74
 75		json cmd_request;
 76		cmd_request["method"]	= method_strings[method];
 77		cmd_request["endpoint"] = endpoint;
 78		cmd_request["body"]		= request;
 79
 80		json cmd_response;
 81		if (remote("send", cmd_request, cmd_response))
 82			return 0;
 83
 84		request	 = nullptr;
 85		response = cmd_response["body"];
 86		return cmd_response["code"];
 87	} else if (modemReady) {
 88		endRemote();
 89		// modem
 90		return 0;
 91	} else {
 92		endRemote();
 93		writeLED(COLOR_RED);
 94		return 0;
 95	}
 96}
 97
 98void interface::sendToken() {
 99	json req;
100	req["token"] = config.token;
101	remote("set_token", req, null_response, COMMAND_FORCE);
102}
103
104
105interface::command_status interface::remote(const char* command, json params, json& response, command_flags flags) {
106	bool force = flags & COMMAND_FORCE;
107
108	if (!force && !remoteReady)
109		return interface::STATUS_NOT_READY;
110
111	usbSerial.print(command);
112	usbSerial.print(" ");
113	params.printTo(usbSerial);
114	usbSerial.print("\n");
115
116	String line = usbSerial.readStringUntil('\n');
117	String status;
118	if (line.indexOf(' ') != -1) {
119		status	 = line.substring(0, line.indexOf(' '));
120		response = json::parse(line.substring(line.indexOf(' ') + 1));
121	} else {
122		status = line;
123	}
124	if (!status.length()) {
125		return interface::STATUS_TIMEOUT;
126	} else if (status == "ok") {
127		return interface::STATUS_OK;
128	} else {
129		response = status;
130		return interface::STATUS_ERROR;
131	}
132}
133
134interface::command_status interface::modem(const char* request, char* response, command_flags flags) {
135	return STATUS_NOT_READY;
136	/*
137	char   line[lineBuffer];
138	size_t lineLen;
139	char   buf;
140
141	bool force	= flags & COMMAND_FORCE,
142		 block	= flags & COMMAND_BLOCK,
143		 ignore = flags & COMMAND_IGNORE;
144
145	if (!force && !modemReady)
146		return interface::STATUS_NOT_READY;
147
148	if (response)
149		response[0] = '\0';
150
151	modemSerial.write("AT");
152	modemSerial.write(request);
153	modemSerial.write("\r\n");
154
155
156	delay(commandDelay * 1000);*/
157}
158
159interface::command_status interface::modem(const char* request, command_flags flags) {
160	return modem(request, NULL, flags);
161}