Beispiel #1
0
static void manage_setvalue(const char *path)
{
	char *port = strstr(path, "&set=");
	if (!port) return;
	port += 5;

	char *value = strstr(path, "&value=");
	if (!value) return;
	value += 7;

	switch (*port) {
	case 'D':
	{
		int r = atoi(port + 1);
		if (r < 0 || r > 11) return;
		r += 2;
		Serial << "setPWM " << r << " " << value <<"\n";
		lduino.setPWM(r, atoi(value));
		break;
	}
	case 'A':
	{
		int r = atoi(port + 1);
		if (r < 0 || r > 11) return;
		r += 54;
		Serial << "setAnalog " << r << " " << value << "\n";
		lduino.setAnalogInput(r, atoi(value));
		break;
	}
	}
}
Beispiel #2
0
static void manage_toggle(const char *path)
{	
	char *toggle = strstr(path, "&toggle=");
	if (!toggle) return;
	toggle += 8;
	
	switch (*toggle) {	
	case 'D':
	{
		int r = atoi(toggle + 1);
		if (r < 0 || r > 11) return;
		r += 2;
		Serial << "toggle " << r << "\n";
		lduino.toggleDigitalOutput(r);
		break;
	}
	case 'R':
	{
		int r = atoi(toggle + 1);
		if (r < 0 || r > 9) return;
		r += 22;
		Serial << "toggle " << r << "\n";
		lduino.toggleDigitalOutput(r);
		break;
	}
	case 'A':
	{
		int r = atoi(toggle + 1);
		if (r < 0 || r > 11) return;
		r += 54;
		Serial << "toggle " << r << "\n";
		lduino.toggleDigitalInput(r);
		break;
	}
	case 'r':
		lduino.ToggleProgramRunning();
		break;
	case 'i':
		lduino.ToggleIO_Polling();
		break;
	default:
		break;
	}

	return;
}
Beispiel #3
0
static boolean getstate_handler(TinyWebServer& web_server)
{
	web_server.send_error_code(200);
	web_server.send_content_type("text/xml");
	web_server.send_content_type("Connection: keep-alive");
	web_server.end_headers();

	manage_toggle(web_server.get_path());
	manage_setvalue(web_server.get_path());
	Client& stream = web_server.get_client();
	lduino.XML_State(stream);
	return true;
}
Beispiel #4
0
static void main_page(Client& client, String status = "")
{
	//index_html.print(client);
	String str((__FlashStringHelper *)index_html_flash);
	str.replace(F("%status"), status.length() > 0 ? status + '\n' : "");
	str.replace(F("%useDHCP"), IP_Config.useDHCP ? "checked": "");
	str.replace(F("%mac"), MAC2Ascii(IP_Config.mac_address));
	str.replace(F("%ip"), IP2Ascii(IP_Config.local_ip));
	str.replace(F("%subnet"), IP2Ascii(IP_Config.subnet));
	str.replace(F("%dns"), IP2Ascii(IP_Config.dns_server));
	str.replace(F("%gateway"), IP2Ascii(IP_Config.gateway));
	client << str;
	lduino.PrintStats(client);
	client << F("<pre></body></html>");
}
Beispiel #5
0
static void file_uploader_handler(TinyWebServer& web_server, TinyWebPutHandler::PutAction action, char* buffer, int size)
{
	static char *boundary = NULL;
	static size_t boundary_len = 0;
	static CircularBuffer<char, 128> cb;
	static enum state { search_begin=0, search_data, search_filename, in_filename, in_data} st;
	static int file_size = 0;
	static String fname = "";
	const char *ct;

	switch (action) {
	case TinyWebPutHandler::START: 
	{
		ct = web_server.get_header_value("Content-Type");
		if (!ct) {
			Serial << F("Missing Content-Type\n");
			break;
		}
		boundary = strstr(ct, "boundary=");
		if (!boundary) {
			Serial << F("Missing boundary= in '") << ct << "'\n";
			break;
		}
		boundary += 5;
		boundary[0] = '\r';
		boundary[1] = '\n';
		boundary[2] = '-';
		boundary[3] = '-';
		boundary_len = strlen(boundary);
		D(Serial.print("**** Upload file "));
		D(Serial.println(fname));
		st = search_begin;
		file_size = 0;
		lduino.setStatus(F("Loading new ladder program"));
		break;
	}

	static char *fname_tag = "filename=\"";

	case TinyWebPutHandler::WRITE:
		for (int i = 0; i < size; i++) {
			D(Serial.write(*buffer));

			switch(st) {
			case search_begin:
				cb.push(*buffer++);
				if (cb.remain() < boundary_len-2) break;
				if (cb.match(boundary+2, boundary_len-2)) {
					st = search_filename;
					D(Serial.println("search_filename"));
					cb.flush();
					fname = "";
				}
				else {
					cb.pop();
				}
				break;
			case search_filename:
				cb.push(*buffer++);
				if (cb.remain() < strlen(fname_tag)) break;
				if (cb.match(fname_tag, strlen(fname_tag))) {
					st = in_filename;
					D(Serial.println("in_filename"));
					cb.flush();
				}
				else {
					cb.pop();
				}
				break;
			case in_filename:
				if (*buffer == '\"') {
					buffer++;
					st = search_data;
					D(Serial << F("fname=") << fname << "\n");
					D(Serial.println("search_data"));
				}
				else {
					fname += *buffer++;
				}
				break;
			case search_data:
				cb.push(*buffer++);
				if (cb.remain() < 4) break;
				if (cb.match("\r\n\r\n", 4)) {
					st = in_data;
					D(Serial.println("in_data"));
					cb.flush();
				}
				else {
					cb.pop();
				}
				break;
			case in_data:
				cb.push(*buffer++);
				if (cb.remain() < boundary_len) break;
				if (cb.match(boundary, boundary_len)) {
					st = search_data;
					D(Serial.println("search_data"));
					cb.flush();
				}
				else {
					if (file_size == 0) lduino.ClearProgram();
					char c = cb.pop();
					file_size++;
					lduino.LoadProgramLine(c);
				}
				break;
			};
		}
		break;

	case TinyWebPutHandler::END:
		D(Serial.println("**** END"));
		D(Serial.print("file size "));
		D(Serial.println(file_size));
		Client& client = web_server.get_client();
		String status;
		if (file_size > 0 && lduino.getProgramReady()) {
			status += fname;
			status += F(" loaded");
		}
		else {
			status += F("Upload failure");
		}
		Serial << status << '\n';
		lduino.setStatus(status);
		//main_page(client, status);
		break;
	}
}
Beispiel #6
0
static void file_uploader_handler(TinyWebServer& web_server, TinyWebPutHandler::PutAction action, char* buffer, int size)
{
	static char *boundary = NULL;
	static size_t boundary_len = 0;
	static CircularBuffer<char, 128> cb;
	static enum state { search_begin=0, search_data, in_data} st;
	static int file_size = 0;
	static char *fname;
	
	switch (action) {
	case TinyWebPutHandler::START: 
	{
		fname = web_server.get_file_from_path(web_server.get_path());
		const char *ct = web_server.get_header_value("Content-Type");
		if (!ct) break;
		boundary = strstr(ct, "boundary=");
		if (!boundary) break;
		boundary += 5;
		boundary[0] = '\r';
		boundary[1] = '\n';
		boundary[2] = '-';
		boundary[3] = '-';
		boundary_len = strlen(boundary);
		D(Serial.print("**** Upload file "));
		D(Serial.println(fname));
		free(fname);
		st = search_begin;
		file_size = 0;
		break;
	}

	case TinyWebPutHandler::WRITE:
		for (int i = 0; i < size; i++) {
			D(Serial.write(*buffer));
			cb.push(*buffer++);
			switch(st) {
			case search_begin:
				if (cb.remain() < boundary_len-2) break;
				if (cb.match(boundary+2, boundary_len-2)) {
					st = search_data;
					D(Serial.println("search_data"));
					cb.flush();
				}
				else {
					cb.pop();
				}
				break;
			case search_data:
				if (cb.remain() < 4) break;
				if (cb.match("\r\n\r\n", 4)) {
					st = in_data;
					D(Serial.println("in_data"));
					cb.flush();
				}
				else {
					cb.pop();
				}
				break;
			case in_data:
				if (cb.remain() < boundary_len) break;
				if (cb.match(boundary, boundary_len)) {
					st = search_data;
					D(Serial.println("search_data"));
					cb.flush();
				}
				else {
					if (file_size == 0) lduino.ClearProgram();
					char c = cb.pop();
					file_size++;
					lduino.LoadProgramLine(c);
				}
				break;
			};
		}
		break;

	case TinyWebPutHandler::END:
		D(Serial.println("**** END"));
		D(Serial.print("file size "));
		D(Serial.println(file_size));
		Client& client = web_server.get_client();
		String status;
		if (file_size > 0 && lduino.getProgramReady()) {
			status += F("<font color='green'>New ladder program uploaded - file size: ");
			status += file_size;
			status += F(" bytes</font>");
		}
		else {
			status += F("<font color='red'>Upload aborted</font>");
		}
		main_page(client, status);
		break;
	}
}