mirror of
				https://github.com/liberatedsystems/RNode_Firmware_CE.git
				synced 2024-07-02 14:34:13 +02:00 
			
		
		
		
	Library and example
This commit is contained in:
		
							parent
							
								
									255d978bd7
								
							
						
					
					
						commit
						0dd6ce6539
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,4 +1,5 @@
 | 
				
			|||||||
.DS_Store
 | 
					.DS_Store
 | 
				
			||||||
*.hex
 | 
					*.hex
 | 
				
			||||||
 | 
					*.pyc
 | 
				
			||||||
TODO
 | 
					TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										37
									
								
								Libraries/Example.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Libraries/Example.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					# This is a short example program that
 | 
				
			||||||
 | 
					# demonstrates the bare minimum of using
 | 
				
			||||||
 | 
					# RNode in a Python program. First we'll
 | 
				
			||||||
 | 
					# import the RNodeInterface class.
 | 
				
			||||||
 | 
					from RNode import RNodeInterface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# We'll also define which serial port the
 | 
				
			||||||
 | 
					# RNode is attached to.
 | 
				
			||||||
 | 
					serialPort = "/dev/ttyUSB0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This function gets called every time a
 | 
				
			||||||
 | 
					# packet is received
 | 
				
			||||||
 | 
					def gotPacket(data, rnode):
 | 
				
			||||||
 | 
						print "Received a packet: "+data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create an RNode instance. This configures
 | 
				
			||||||
 | 
					# and powers up the radio.
 | 
				
			||||||
 | 
					rnode = RNodeInterface(
 | 
				
			||||||
 | 
						callback = gotPacket,
 | 
				
			||||||
 | 
						name = "My RNode",
 | 
				
			||||||
 | 
						port = serialPort,
 | 
				
			||||||
 | 
						frequency = 868000000,
 | 
				
			||||||
 | 
						bandwidth = 125000,
 | 
				
			||||||
 | 
						txpower = 2,
 | 
				
			||||||
 | 
						sf = 7,
 | 
				
			||||||
 | 
						cr = 5,
 | 
				
			||||||
 | 
						loglevel = RNodeInterface.LOG_DEBUG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Enter a loop waiting for user input.
 | 
				
			||||||
 | 
					try:
 | 
				
			||||||
 | 
						print "Waiting for packets, hit enter to send a packet, Ctrl-C to exit"
 | 
				
			||||||
 | 
						while True:
 | 
				
			||||||
 | 
							raw_input()
 | 
				
			||||||
 | 
							rnode.send("Hello World!")
 | 
				
			||||||
 | 
					except KeyboardInterrupt as e:
 | 
				
			||||||
 | 
						print ""
 | 
				
			||||||
 | 
						exit()
 | 
				
			||||||
@ -1,12 +1,10 @@
 | 
				
			|||||||
from __future__ import print_function
 | 
					from __future__ import print_function
 | 
				
			||||||
from Interface import Interface
 | 
					 | 
				
			||||||
from time import sleep
 | 
					from time import sleep
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
import serial
 | 
					import serial
 | 
				
			||||||
import threading
 | 
					import threading
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import math
 | 
					import math
 | 
				
			||||||
import RNS
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class KISS():
 | 
					class KISS():
 | 
				
			||||||
	FEND			= chr(0xC0)
 | 
						FEND			= chr(0xC0)
 | 
				
			||||||
@ -54,6 +52,7 @@ class KISS():
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RNodeInterface():
 | 
					class RNodeInterface():
 | 
				
			||||||
 | 
						MTU = 500
 | 
				
			||||||
	MAX_CHUNK = 32768
 | 
						MAX_CHUNK = 32768
 | 
				
			||||||
	FREQ_MIN  = 137000000
 | 
						FREQ_MIN  = 137000000
 | 
				
			||||||
	FREQ_MAX  = 1020000000
 | 
						FREQ_MAX  = 1020000000
 | 
				
			||||||
@ -248,7 +247,7 @@ class RNodeInterface():
 | 
				
			|||||||
			return False
 | 
								return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def setPromiscuousMode(self, state):
 | 
						def setPromiscuousMode(self, state):
 | 
				
			||||||
		if state == True
 | 
							if state == True:
 | 
				
			||||||
			kiss_command = KISS.FEND+KISS.CMD_PROMISC+chr(0x01)+KISS.FEND
 | 
								kiss_command = KISS.FEND+KISS.CMD_PROMISC+chr(0x01)+KISS.FEND
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			kiss_command = KISS.FEND+KISS.CMD_PROMISC+chr(0x00)+KISS.FEND
 | 
								kiss_command = KISS.FEND+KISS.CMD_PROMISC+chr(0x00)+KISS.FEND
 | 
				
			||||||
@ -270,7 +269,7 @@ class RNodeInterface():
 | 
				
			|||||||
		self.callback(data, self)
 | 
							self.callback(data, self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def send(self, data):
 | 
						def send(self, data):
 | 
				
			||||||
		processOutgoing(data)
 | 
							self.processOutgoing(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def processOutgoing(self,data):
 | 
						def processOutgoing(self,data):
 | 
				
			||||||
		if self.online:
 | 
							if self.online:
 | 
				
			||||||
@ -321,7 +320,7 @@ class RNodeInterface():
 | 
				
			|||||||
						command = KISS.CMD_UNKNOWN
 | 
											command = KISS.CMD_UNKNOWN
 | 
				
			||||||
						data_buffer = ""
 | 
											data_buffer = ""
 | 
				
			||||||
						command_buffer = ""
 | 
											command_buffer = ""
 | 
				
			||||||
					elif (in_frame and len(data_buffer) < RNS.Reticulum.MTU):
 | 
										elif (in_frame and len(data_buffer) < RNodeInterface.MTU):
 | 
				
			||||||
						if (len(data_buffer) == 0 and command == KISS.CMD_UNKNOWN):
 | 
											if (len(data_buffer) == 0 and command == KISS.CMD_UNKNOWN):
 | 
				
			||||||
							command = byte
 | 
												command = byte
 | 
				
			||||||
						elif (command == KISS.CMD_DATA):
 | 
											elif (command == KISS.CMD_DATA):
 | 
				
			||||||
@ -416,11 +415,11 @@ class RNodeInterface():
 | 
				
			|||||||
							self.r_random = ord(byte)
 | 
												self.r_random = ord(byte)
 | 
				
			||||||
						elif (command == KISS.CMD_ERROR):
 | 
											elif (command == KISS.CMD_ERROR):
 | 
				
			||||||
							if (byte == KISS.ERROR_INITRADIO):
 | 
												if (byte == KISS.ERROR_INITRADIO):
 | 
				
			||||||
								self.log(str(self)+" hardware initialisation error (code "+RNS.hexrep(byte)+")", RNodeInterface.LOG_ERROR)
 | 
													self.log(str(self)+" hardware initialisation error (code "+self.hexrep(byte)+")", RNodeInterface.LOG_ERROR)
 | 
				
			||||||
							elif (byte == KISS.ERROR_INITRADIO):
 | 
												elif (byte == KISS.ERROR_INITRADIO):
 | 
				
			||||||
								self.log(str(self)+" hardware TX error (code "+RNS.hexrep(byte)+")", RNodeInterface.LOG_ERROR)
 | 
													self.log(str(self)+" hardware TX error (code "+self.hexrep(byte)+")", RNodeInterface.LOG_ERROR)
 | 
				
			||||||
							else:
 | 
												else:
 | 
				
			||||||
								self.log(str(self)+" hardware error (code "+RNS.hexrep(byte)+")", RNodeInterface.LOG_ERROR)
 | 
													self.log(str(self)+" hardware error (code "+self.hexrep(byte)+")", RNodeInterface.LOG_ERROR)
 | 
				
			||||||
						elif (command == KISS.CMD_READY):
 | 
											elif (command == KISS.CMD_READY):
 | 
				
			||||||
							# TODO: add timeout and reset if ready
 | 
												# TODO: add timeout and reset if ready
 | 
				
			||||||
							# command never arrives
 | 
												# command never arrives
 | 
				
			||||||
@ -441,15 +440,14 @@ class RNodeInterface():
 | 
				
			|||||||
			self.log("A serial port error occurred, the contained exception was: "+str(e), RNodeInterface.LOG_ERROR)
 | 
								self.log("A serial port error occurred, the contained exception was: "+str(e), RNodeInterface.LOG_ERROR)
 | 
				
			||||||
			self.log("The interface "+str(self.name)+" is now offline.", RNodeInterface.LOG_ERROR)
 | 
								self.log("The interface "+str(self.name)+" is now offline.", RNodeInterface.LOG_ERROR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def log(msg, level=3):
 | 
						def log(self, msg, level=3):
 | 
				
			||||||
 | 
							logtimefmt   = "%Y-%m-%d %H:%M:%S"
 | 
				
			||||||
		if self.loglevel >= level:
 | 
							if self.loglevel >= level:
 | 
				
			||||||
			timestamp = time.time()
 | 
								timestamp = time.time()
 | 
				
			||||||
			logstring = "["+time.strftime(logtimefmt)+"] ["+self.loglevelname(level)+"] "+msg
 | 
								logstring = "["+time.strftime(logtimefmt)+"] ["+self.loglevelname(level)+"] "+msg
 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (logdest == LOG_STDOUT):
 | 
					 | 
				
			||||||
			print(logstring)
 | 
								print(logstring)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def loglevelname(level):
 | 
						def loglevelname(self, level):
 | 
				
			||||||
		if (level == RNodeInterface.LOG_CRITICAL):
 | 
							if (level == RNodeInterface.LOG_CRITICAL):
 | 
				
			||||||
			return "Critical"
 | 
								return "Critical"
 | 
				
			||||||
		if (level == RNodeInterface.LOG_ERROR):
 | 
							if (level == RNodeInterface.LOG_ERROR):
 | 
				
			||||||
@ -467,6 +465,13 @@ class RNodeInterface():
 | 
				
			|||||||
		if (level == RNodeInterface.LOG_EXTREME):
 | 
							if (level == RNodeInterface.LOG_EXTREME):
 | 
				
			||||||
			return "Extra"
 | 
								return "Extra"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def hexrep(data, delimit=True):
 | 
				
			||||||
 | 
							delimiter = ":"
 | 
				
			||||||
 | 
							if not delimit:
 | 
				
			||||||
 | 
								delimiter = ""
 | 
				
			||||||
 | 
							hexrep = delimiter.join("{:02x}".format(ord(c)) for c in data)
 | 
				
			||||||
 | 
							return hexrep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def __str__(self):
 | 
						def __str__(self):
 | 
				
			||||||
		return "RNodeInterface["+self.name+"]"
 | 
							return "RNodeInterface["+self.name+"]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -62,7 +62,7 @@ Have a look in the "Libraries" folder for includes to let you easily use RNode i
 | 
				
			|||||||
Here's a Python example:
 | 
					Here's a Python example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```python
 | 
					```python
 | 
				
			||||||
import RNodeInterface
 | 
					from RNode import RNodeInterface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def gotPacket(data, rnode):
 | 
					def gotPacket(data, rnode):
 | 
				
			||||||
	print "Received a packet: "+data
 | 
						print "Received a packet: "+data
 | 
				
			||||||
@ -76,7 +76,7 @@ rnode = RNodeInterface(
 | 
				
			|||||||
	txpower = 2,
 | 
						txpower = 2,
 | 
				
			||||||
	sf = 7,
 | 
						sf = 7,
 | 
				
			||||||
	cr = 5,
 | 
						cr = 5,
 | 
				
			||||||
	loglevel = RnodeInterface.LOG_DEBUG)
 | 
						loglevel = RNodeInterface.LOG_DEBUG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rnode.send("Hello World!")
 | 
					rnode.send("Hello World!")
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user