0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

wemosでwebsocket その2

Last updated at Posted at 2023-05-22

概要

wemosでwebsocket、やってみた。
練習問題、やってみた。

練習問題

websocket serverで、俺言語インタープリターを実行せよ。

方針

  • IPアドレス、192.168.0.104
  • ポート、50002

写真

image.png

サンプルコード

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "WebSocketsServer.h"

const char * ssid = "****";
const char * password = "****";

ESP8266WebServer server;
WebSocketsServer webSocket = WebSocketsServer(50002);

char webpage[] PROGMEM = R"=====(
<html>
<head>
	<script>
		var Socket;
		function init() {
			Socket = new WebSocket('ws://' + window.location.hostname + ':50002/');
			Socket.onmessage = function(event) {
				document.getElementById("rxConsole").value = event.data;
			}
		}
		function sendText() {
			Socket.send(document.getElementById("txBar").value);
			document.getElementById("txBar").value = "";
		}
	</script>
</head>
<body onload="javascript:init()">
	<center>
	<h1>俺言語</h1>
	<div>
		<input type="text" placeholder="10 a=0" id="txBar" onkeydown="if (event.keyCode == 13) sendText();" />
	</div>
	<br>
	<div>
		<textarea id="rxConsole" rows="13" cols="50"></textarea>
	</div>
	</center>
</body>
</html>
)=====";

char ram[400];
int Pcc = 257;
int Rmd = 258;
int Bnd = 259;
int Lbf = 270;
int Obj = 0;
int Ptr = Lbf;
int Cur;
int Vc;
int Adr;
int Adr2;
char Val;
int i;
const int led = LED_BUILTIN;
String out = "";

char RD(int ado) {
	char v = ram[ado];
	return v;
}
void WR(int ado, char data) {
	ram[ado] = data;
}
void putchr(char c) {
	out += String(c);
}
void putint(int c) {
	out += String(c);
}
void putstr(const char * s) {
	while (* s)
		putchr(* s++);
}
void crlf() {
	putchr('\r');
	putchr('\n');
}
int putl(int pt, char d) {
	while (RD(pt) != d)
	{
		putchr(RD(pt++));
	}
	return pt;
}
void putlp(int d) {
	while (RD(Ptr) != d)
	{
		putchr(RD(Ptr++));
	}
}
boolean num() {
	if (48 <= RD(Ptr) && RD(Ptr) <= 57)
		return true;
	else
		return false;
}
boolean getnm2() {
	char ch;
	if (!num())
		return false;
	int n = 0;
	do
	{
		n *= 10;
		ch = RD(Ptr++);
		n += ch - 48;
	} while (num());
	Val = n;
	return true;
}
int nxtln(int pt) {
	for (pt += 1; RD(pt++) != '\0';)
		;
	return pt;
}
boolean fndln() {
	for (Cur = Obj; Cur != RD(Bnd); Cur = nxtln(Cur))
	{
		if (RD(Cur) == RD(Pcc))
			return true;
	}
	return false;
}
boolean nxline() {
	for (Cur = Obj; Cur != RD(Bnd); Cur = nxtln(Cur))
	{
		if (RD(Cur) > RD(Pcc))
			return true;
	}
	return false;
}
void getvr() {
	Vc = RD(Ptr);
	if (Vc == 'a')
		Adr = 260;
	else if (Vc == '#')
		Adr = Pcc;
	else if (Vc == 'b')
		Adr = 261;
	else if (Vc == 'c')
		Adr = 262;
	else if (Vc == 'd')
		Adr = 263;
	else if (Vc == 'e')
		Adr = 264;
	else if (Vc == 'f')
		Adr = 265;
	else if (Vc == '%')
		Adr = Rmd;
	else
		Adr = 260;
}
void getvr2() {
	char cc = RD(Ptr);
	if (cc == 'a')
		Adr2 = 260;
	else if (cc == '#')
		Adr2 = Pcc;
	else if (cc == 'b')
		Adr2 = 261;
	else if (cc == 'c')
		Adr2 = 262;
	else if (cc == 'd')
		Adr2 = 263;
	else if (cc == 'e')
		Adr2 = 264;
	else if (cc == 'f')
		Adr2 = 265;
	else if (cc == '%')
		Adr2 = Rmd;
	else
		Adr2 = 260;
}
void term() {
	char cc;
	cc = RD(Ptr++);
	char Val2 = Val;
	factr();
	if (cc == '*')
	{
		Val = Val2 * Val;
	}
	else if (cc == '+')
	{
		Val = Val2 + Val;
	}
	else if (cc == '-')
	{
		Val = Val2 - Val;
	}
	else if (cc == '/')
	{
		WR(Rmd, Val2 % Val);
		Val = Val2 / Val;
	}
	else if (cc == '=')
	{
		if (Val2 == Val)
			Val = 1;
		else
			Val = 0;
	}
	else if (cc == '>')
	{
		if (Val2 >= Val)
			Val = 1;
		else
			Val = 0;
	}
	else
	{
		if (Val2 < Val)
			Val = 1;
		else
			Val = 0;
	}
}
void factr() {
	char cc;
	if (RD(Ptr) == '\0')
	{
		Val = 0;
		return;
	}
	if (getnm2())
		return;
	cc = RD(Ptr++);
	if (cc == '?')
	{
	}
	else if (cc == '$')
	{
	}
	else if (cc == '(')
	{
	}
	else
	{
		Ptr--;
		getvr2();
		Val = RD(Adr2);
		Ptr++;
	}
}
void expr() {
	char cc;
	factr();
	while ((cc = RD(Ptr)) != '\0' && cc != ')')
	{
		term();
	}
	Ptr++;
}
void ordr() {//siki hyouka
	getvr();//hidari
	Ptr++;
	Ptr++;
	if (RD(Ptr) == '"')
	{
		Ptr++;
		putlp('"');
	}
	else
	{
		expr();//migi
		if (Vc == '$')
		{
		}
		else if (Vc == '?')//print
		{
			putint(Val);
			putchr('\t');
		}
		else if (Vc == 'l')//led
		{
			digitalWrite(led, Val);
		}
		else if (Vc == '"')//delay
		{
			delay(Val);
		}
		else
		{
			WR(Adr, Val);
		}
	}
}
void run() {
	int ima = 0;
	Ptr = Lbf;
	if (!getnm2())
	{
		Ptr = Lbf;
		WR(Pcc, 0);
		for ( ; ; )
		{
			ima = RD(Pcc);
			ordr();
			if (RD(Pcc) == 0 && ima == 0)
			{
				break;
			}
			else
			{
				if (RD(Pcc) == 0)
					WR(Pcc, ima);
				if (RD(Pcc) == 1)
					ima = 1;
				if (RD(Pcc) == ima)
				{
					if (nxline())
					{
						WR(Pcc, RD(Cur));
						Ptr = Cur + 2;
					}
					else
					{
						break;
					}
				}
				else
				{
					if (fndln())
					{
						WR(Pcc, RD(Cur));
						Ptr = Cur + 2;
					}
					else
					{
						break;
					}
				}
			}
		}
	}
	else
	{
		if (Val == 0) //list
		{
			int pt;
			for (pt = Obj; pt < RD(Bnd); pt++)
			{
				putint(RD(pt));
				pt += 1;
				pt = putl(pt, '\0');
				crlf();
			}
		}
		else
		{
			int src;
			int dst;
			int m;
			int h;
			int f = 0;
			WR(Pcc, Val);
			if (fndln())
			{
				src = nxtln(Cur);
				for (dst = Cur; src != RD(Bnd); dst++, src++)
				{
					WR(dst, RD(src));
				}
				WR(Bnd, dst);
			}
			if (nxline())
			{
				f = 1;
			}
			src = RD(Bnd);
			for (m = 2, h = Ptr; RD(h) != '\0'; m++)
			{
				h++;
			}
			if (m > 2)
			{
				WR(Bnd, src + m);
				if (f == 1)
				{
					Cur--;
					for (dst = RD(Bnd); src != Cur; dst--, src--)
					{
						WR(dst, RD(src));
					}
					src++;
				}
				WR(src, Val);
				src += 1;
				for (i = 1; i < m; i++)
				{
					WR(src++, RD(Ptr++));
				}
			}
		}
	}
	for (i = 0; i < 129; i++)
	{
		WR(i + Lbf, '\0');
	}
	Ptr = Lbf;
	putstr("OK\r\n");
}
void onLine(String line) {
	int len;
	int i;
	char c[130];
	len = line.length();
	line.toCharArray(c, len + 1);
	for (i = 0; i < len; i++)
	{
		char ch = c[i];
		putchr(ch);
		WR(Ptr++, ch);
	}
	putchr('\n');
	WR(Ptr++, '\0');
	run();
}

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
	if (type == WStype_TEXT)
	{
		//for (int i = 0; i < length; i++)
		//	Serial.print((char) payload[i]);
		//Serial.println();
		out = "";
		String text = (char *) payload;
		Serial.println(text);
		onLine(text);
		webSocket.broadcastTXT(out);
	}
}
void setup() {
	pinMode(LED_BUILTIN, OUTPUT);
	digitalWrite(LED_BUILTIN, LOW);
	WiFi.begin(ssid, password);
	Serial.begin(115200);
	while (WiFi.status() != WL_CONNECTED)
	{
		Serial.print(".");
		delay(500);
	}
	Serial.println("");
	Serial.print("IP Address: ");
	Serial.println(WiFi.localIP());
	server.on("/", []() {
		server.send_P(200, "text/html", webpage);
	});
	server.begin();
	webSocket.begin();
	webSocket.onEvent(webSocketEvent);
	Serial.println("ore server started");
	for (i = 0; i < 400; i++)
	{
		WR(i, '\0');
	}
	WR(Bnd, 0);
	putstr("\r\nore server v1.0\r\n");
}
void loop() {
	webSocket.loop();
	server.handleClient();
}




以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?