TimeBinControl/src/server.py

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()