Skip to content

Commit d34ef1d

Browse files
committed
ftespnow: Initial commit
1 parent a1a9e57 commit d34ef1d

7 files changed

Lines changed: 156 additions & 0 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
MANIFEST
22
__pycache__
3+
.vscode/
34
*.egg-info
45
*/dist/
56
*.org
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import espnow
2+
import json
3+
4+
class CLIENT:
5+
def __init__(self) -> None:
6+
self.esp = espnow.ESPNow()
7+
8+
def configure(self, timeout=5) -> None:
9+
self.timeout: int = timeout
10+
11+
def connect(self, peer: str) -> None:
12+
self.peer: str = peer
13+
self.esp.active(True)
14+
self.esp.add_peer(self.peer)
15+
16+
def send_message(self, data: str) -> bool:
17+
ack: bool = self.esp.send(self.peer, data)
18+
return ack
19+
20+
def receive_message(self, recv_timeout :int= 5) -> list | None:
21+
received = self.esp.recv(recv_timeout)
22+
if received[0] == None: return
23+
return received
24+
25+
def send_txt(self, filename: str) -> bool:
26+
with open(filename, 'r') as f:
27+
data: str = str(f.readlines())
28+
sent: bool = self.send_message(data)
29+
return sent
30+
31+
def send_json(self, filename: str, *, indent: int=4) -> bool:
32+
with open(filename, 'r') as f:
33+
unparsed = json.load(f)
34+
parsed: str = json.dumps(unparsed, indent=indent)
35+
sent: bool = self.send_message(parsed)
36+
return sent
37+
38+
def receive_to_txt(self, target_file: str, mode: str='a') -> bool:
39+
if ".txt" not in target_file: raise SyntaxError("File format must be .txt")
40+
try:
41+
data: list | None = self.receive_message()
42+
if data == None: return False
43+
data_list: list[str] = str(data[-1]).split("\n")
44+
if data_list[-1] == "": data_list = data_list[:-1]
45+
with open(target_file, mode) as f:
46+
f.writelines(data_list)
47+
return True
48+
except SyntaxError:
49+
raise
50+
51+
def receive_to_json(self, target_file: str, mode: str='a') -> bool:
52+
if ".json" not in target_file: raise SyntaxError("File format must be .json")
53+
try:
54+
data: list | None = self.receive_message()
55+
if data == None: return False
56+
mac: str = str(data[0])
57+
message = json.loads(str(data[-1]))
58+
unparsed: dict = {
59+
"mac": mac,
60+
"message": message
61+
}
62+
with open(target_file, mode) as f:
63+
json.dump(unparsed, f)
64+
return True
65+
except SyntaxError:
66+
raise
67+
68+
def receive_to_dict(self) -> dict:
69+
data: list | None = self.receive_message()
70+
if data == None: return {}
71+
mac: str = str(data[0])
72+
message = json.loads(str(data[-1]))
73+
unparsed: dict = {
74+
"mac": mac,
75+
"message": message
76+
}
77+
return unparsed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
metadata(
2+
description="Client-side commands",
3+
version="0.1.0",
4+
)
5+
6+
require("ftespnow")
7+
require("json")
8+
require("espnow")
9+
package("ftespnow")
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import espnow
2+
import json
3+
4+
class SERVER:
5+
def __init__(self, *, timeout: int=5) -> None:
6+
self.esp = espnow.ESPNow()
7+
self.timeout = timeout
8+
9+
def configure(self, *, timeout: int=5) -> None:
10+
self.timeout = timeout
11+
12+
def send_message(self, peer: str, data: str) -> bool:
13+
ack: bool = self.esp.send(peer, data)
14+
return ack
15+
16+
def receive_message(self, recv_timeout :int= 5) -> list | None:
17+
received = self.esp.recv(recv_timeout)
18+
if received[0] == None: return
19+
return received
20+
21+
def send_txt(self, peer: str, filename: str) -> bool:
22+
with open(filename, 'r') as f:
23+
data: str = str(f.readlines())
24+
sent: bool = self.send_message(peer, data)
25+
return sent
26+
27+
def send_json(self, peer: str, filename: str, *, indent: int=4) -> bool:
28+
with open(filename, 'r') as f:
29+
unparsed = json.load(f)
30+
parsed: str = json.dumps(unparsed, indent=indent)
31+
sent: bool = self.send_message(peer, parsed)
32+
return sent
33+
34+
def receive_to_txt(self, target_file: str, mode: str='a') -> bool:
35+
if ".txt" not in target_file: raise SyntaxError("File format must be .txt")
36+
try:
37+
data: list | None = self.receive_message()
38+
if data == None: return False
39+
data_list: list[str] = str(data[-1]).split("\n")
40+
if data_list[-1] == "": data_list = data_list[:-1]
41+
with open(target_file, mode) as f:
42+
f.writelines(data_list)
43+
return True
44+
except SyntaxError:
45+
raise
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
metadata(
2+
description="Server-side commands",
3+
version="0.1.0",
4+
)
5+
6+
require("ftespnow")
7+
require("json")
8+
require("espnow")
9+
package("ftespnow")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
try:
2+
from .clinet import *
3+
except ImportError:
4+
pass
5+
6+
try:
7+
from.server import *
8+
except ImportError:
9+
pass

micropython/ftespnow/manifest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
metadata(
2+
description="Extends the micropython espnow module with methods to support file transfers.",
3+
version="0.1.0",
4+
)
5+
6+
module("ftespnow")

0 commit comments

Comments
 (0)