148 lines
4.3 KiB
Python
148 lines
4.3 KiB
Python
import sys
|
|
import time
|
|
import socket
|
|
import threading
|
|
|
|
import queue
|
|
import zmq
|
|
|
|
import pin as GPIO
|
|
GPIO.config('./config.json')
|
|
|
|
import MAX11270 as adc
|
|
import MCP4822 as dac
|
|
import PID as pid
|
|
import tcptools as TCP
|
|
import spithread as SPIThread
|
|
import clientthread as clientThread
|
|
import globalvars
|
|
######################################################################
|
|
#TCP/IP
|
|
HOST = '' #Symbolic name
|
|
PORT = 2000
|
|
|
|
######################################################################
|
|
# GPIO conf
|
|
GPIO.setmode(GPIO.BCM)
|
|
ADC_CLK_PIN = 21
|
|
ADC_MOSI_PIN = 20
|
|
ADC_MISO_PIN = 19
|
|
ADC_CS_PIN = 17 #ADC 0 -> input 0,1
|
|
ADC_SYNC_PIN = 27
|
|
ADC_RSTB_PIN = 22
|
|
|
|
DAC_CLK_PIN = 11
|
|
DAC_MOSI_PIN = 10
|
|
DAC_CS_PIN = 8
|
|
DAC_LDAC_PIN = 5
|
|
|
|
|
|
#----nonglobals-------
|
|
# this is the array of threads
|
|
t = [] # this is the array of threads
|
|
|
|
######################################################################
|
|
|
|
#Workaround for Windows to handle KeyboardInterrupt
|
|
def workaround():
|
|
try:
|
|
while True: input()
|
|
except (KeyboardInterrupt, EOFError):
|
|
socket.socket().connect((HOST,PORT))
|
|
######################################################################
|
|
#start program
|
|
|
|
# Setting up server
|
|
lock = threading.Lock() #create lock functionalities
|
|
print('\nCreate socket')
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#create socket
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
|
|
print(' ...done')
|
|
print('\nBind socket...')
|
|
#bind socket
|
|
try:
|
|
sock.bind((HOST,PORT))
|
|
except socket.error as msg:
|
|
print(' ...Bind failed. Error Code : '+str(msg.errno)+' Message : '+ msg.strerror)
|
|
sock.close()
|
|
sys.exit()
|
|
print(' ...done')
|
|
print('\nOpen socket listener...')
|
|
sock.listen(10)
|
|
print(' ...done')
|
|
|
|
# Setting up I/O
|
|
adc0 = adc.MAX11270(ADC_CLK_PIN, ADC_MOSI_PIN, ADC_MISO_PIN, ADC_CS_PIN, ADC_SYNC_PIN, ADC_RSTB_PIN)
|
|
|
|
|
|
dac0 = dac.MCP4822(DAC_CLK_PIN, DAC_MOSI_PIN, DAC_CS_PIN, DAC_LDAC_PIN, nullVoltage=1.29)
|
|
|
|
|
|
pid_obj = [pid.PID(0, 0, 0, 1, 0)]
|
|
|
|
|
|
#Start spithread
|
|
#new_t = threading.Thread(target=SPIThread.spithread,args=([adc0, adc1], [dac0, dac1], SPIQueue, pidqueue))
|
|
new_t = threading.Thread(target=SPIThread.spithread,args=([adc0], [dac0],))
|
|
new_t.deamon = True
|
|
new_t.start()
|
|
t.append(new_t) #append to array of threads
|
|
|
|
#Start pid thread
|
|
for i in range(len(pid_obj)):
|
|
new_t = threading.Thread(target=pid.run,args=(pid_obj[i], 100,i))
|
|
new_t.deamon = True
|
|
new_t.start()
|
|
t.append(new_t) #append to array of threads
|
|
|
|
#Start workaround only on Windows
|
|
if sys.platform.startswith('win'):
|
|
new_t = threading.Thread(target=workaround,args=())
|
|
new_t.deamon = True
|
|
new_t.start()
|
|
t.append(new_t) #append to array of threads
|
|
|
|
print('\nStart waiting for connections...')
|
|
while True:
|
|
conn = None
|
|
try:
|
|
#wait to accept a connection - blocking call
|
|
print('\nWait for connection...')
|
|
conn, addr = sock.accept()
|
|
print('Connected with ' + addr[0] + ':' + str(addr[1]))
|
|
print('\nOpen client thread...')
|
|
new_t = threading.Thread(target=clientThread.clientthread,args=(conn,))
|
|
new_t.deamon = True
|
|
new_t.start()
|
|
t.append(new_t) #append to array of threads
|
|
print(' ...done')
|
|
print('\nCleanup threads...')
|
|
t = [this_t for this_t in t if this_t.is_alive()]#cleanup t
|
|
print(' ...done')
|
|
|
|
except (KeyboardInterrupt,SystemExit): #Ctrl + break for keyboard interrupt (windows)
|
|
print('\nKeyboard interrupt...')
|
|
print('\nCleanup threads...')
|
|
t = [this_t for this_t in t if this_t.is_alive()]#cleanup t
|
|
print(' ...done')
|
|
print('\nClosing socket...')
|
|
sock.close()
|
|
print(' ...done')
|
|
print('\nWaiting for threads to close...')
|
|
globalvars.stopall = True
|
|
|
|
#Send end command to all threads
|
|
#SPIQueue.put(['END'])
|
|
#Connect to SPI thread via zmq tcp socket
|
|
context = zmq.Context()
|
|
SPIclient = context.socket(zmq.REQ)
|
|
SPIclient.connect("tcp://localhost:5555")
|
|
SPIclient.send("END\t".encode())
|
|
msg = SPIclient.recv()
|
|
|
|
for this_t in t: #wait for threads to close
|
|
this_t.join()
|
|
print(' ...done')
|
|
GPIO.cleanup()
|
|
sys.exit()
|