freenove_car/Code/Server/server.py

306 lines
12 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
import io
import socket
import struct
import time
import picamera
import fcntl
import sys
import threading
from Motor import *
from servo import *
from Led import *
from Buzzer import *
from ADC import *
from Thread import *
from Light import *
from Ultrasonic import *
from Line_Tracking import *
from threading import Timer
from threading import Thread
from Command import COMMAND as cmd
class Server:
def __init__(self):
self.PWM=Motor()
self.servo=Servo()
self.led=Led()
self.ultrasonic=Ultrasonic()
self.buzzer=Buzzer()
self.adc=Adc()
self.light=Light()
self.infrared=Line_Tracking()
self.tcp_Flag = True
self.sonic=False
self.Light=False
self.Mode = 'one'
self.endChar='\n'
self.intervalChar='#'
def get_interface_ip(self):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(s.fileno(),
0x8915,
struct.pack('256s',b'wlan0'[:15])
)[20:24])
def StartTcpServer(self):
HOST=str(self.get_interface_ip())
self.server_socket1 = socket.socket()
self.server_socket1.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
self.server_socket1.bind((HOST, 5000))
self.server_socket1.listen(1)
self.server_socket = socket.socket()
self.server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
self.server_socket.bind((HOST, 8000))
self.server_socket.listen(1)
print('Server address: '+HOST)
def StopTcpServer(self):
try:
self.connection.close()
self.connection1.close()
except Exception as e:
print ('\n'+"No client connection")
def Reset(self):
self.StopTcpServer()
self.StartTcpServer()
self.SendVideo=Thread(target=self.sendvideo)
self.ReadData=Thread(target=self.readdata)
self.SendVideo.start()
self.ReadData.start()
def send(self,data):
self.connection1.send(data.encode('utf-8'))
def sendvideo(self):
try:
self.connection,self.client_address = self.server_socket.accept()
self.connection=self.connection.makefile('wb')
except:
pass
self.server_socket.close()
try:
with picamera.PiCamera() as camera:
camera.resolution = (400,300) # pi camera resolution
camera.framerate = 15 # 15 frames/sec
time.sleep(2) # give 2 secs for camera to initilize
start = time.time()
stream = io.BytesIO()
# send jpeg format video stream
print ("Start transmit ... ")
for foo in camera.capture_continuous(stream, 'jpeg', use_video_port = True):
try:
self.connection.flush()
stream.seek(0)
b = stream.read()
length=len(b)
if length >5120000:
continue
lengthBin = struct.pack('L', length)
self.connection.write(lengthBin)
self.connection.write(b)
stream.seek(0)
stream.truncate()
except Exception as e:
print(e)
print ("End transmit ... " )
break
except:
#print "Camera unintall"
pass
def stopMode(self):
try:
stop_thread(self.infraredRun)
self.PWM.setMotorModel(0,0,0,0)
except:
pass
try:
stop_thread(self.lightRun)
self.PWM.setMotorModel(0,0,0,0)
except:
pass
try:
stop_thread(self.ultrasonicRun)
self.PWM.setMotorModel(0,0,0,0)
self.servo.setServoPwm('0',90)
self.servo.setServoPwm('1',90)
except:
pass
def readdata(self):
try:
try:
self.connection1,self.client_address1 = self.server_socket1.accept()
print ("Client connection successful !")
except:
print ("Client connect failed")
restCmd=""
self.server_socket1.close()
while True:
try:
AllData=restCmd+self.connection1.recv(1024).decode('utf-8')
except:
if self.tcp_Flag:
self.Reset()
break
print(AllData)
if len(AllData) < 5:
restCmd=AllData
if restCmd=='' and self.tcp_Flag:
self.Reset()
break
restCmd=""
if AllData=='':
break
else:
cmdArray=AllData.split("\n")
if(cmdArray[-1] != ""):
restCmd=cmdArray[-1]
cmdArray=cmdArray[:-1]
for oneCmd in cmdArray:
data=oneCmd.split("#")
if data==None:
continue
elif cmd.CMD_MODE in data:
if data[1]=='one' or data[1]=="1":
self.stopMode()
self.Mode='one'
elif data[1]=='two' or data[1]=="3":
self.stopMode()
self.Mode='two'
self.lightRun=Thread(target=self.light.run)
self.lightRun.start()
elif data[1]=='three' or data[1]=="4":
self.stopMode()
self.Mode='three'
self.ultrasonicRun=threading.Thread(target=self.ultrasonic.run)
self.ultrasonicRun.start()
elif data[1]=='four' or data[1]=="2":
self.stopMode()
self.Mode='four'
self.infraredRun=threading.Thread(target=self.infrared.run)
self.infraredRun.start()
elif (cmd.CMD_MOTOR in data) and self.Mode=='one':
try:
data1=int(data[1])
data2=int(data[2])
data3=int(data[3])
data4=int(data[4])
if data1==None or data2==None or data2==None or data3==None:
continue
self.PWM.setMotorModel(data1,data2,data3,data4)
except:
pass
elif cmd.CMD_SERVO in data:
try:
data1=data[1]
data2=int(data[2])
if data1==None or data2==None:
continue
self.servo.setServoPwm(data1,data2)
#self.led.ledIndex(1,data2,0,data2)
#self.led.ledIndex(8,data2,0,data2)
except:
pass
elif cmd.CMD_LED in data:
try:
data1=int(data[1])
data2=int(data[2])
data3=int(data[3])
data4=int(data[4])
if data1==None or data2==None or data2==None or data3==None:
continue
self.led.ledIndex(data1,data2,data3,data4)
except:
pass
elif cmd.CMD_LED_MOD in data:
self.LedMoD=data[1]
if self.LedMoD== '0':
try:
stop_thread(Led_Mode)
except:
pass
self.led.ledMode(self.LedMoD)
time.sleep(0.1)
self.led.ledMode(self.LedMoD)
else :
try:
stop_thread(Led_Mode)
except:
pass
time.sleep(0.1)
Led_Mode=Thread(target=self.led.ledMode,args=(data[1],))
Led_Mode.start()
elif cmd.CMD_SONIC in data:
if data[1]=='1':
self.sonic=True
self.ultrasonicTimer = threading.Timer(0.5,self.sendUltrasonic)
self.ultrasonicTimer.start()
else:
self.sonic=False
elif cmd.CMD_BUZZER in data:
try:
self.buzzer.run(data[1])
except:
pass
elif cmd.CMD_LIGHT in data:
if data[1]=='1':
self.Light=True
self.lightTimer = threading.Timer(0.3,self.sendLight)
self.lightTimer.start()
else:
self.Light=False
elif cmd.CMD_POWER in data:
ADC_Power=self.adc.recvADC(2)*3
try:
self.send(cmd.CMD_POWER+'#'+str(ADC_Power)+'\n')
except:
pass
except Exception as e:
print(e)
self.StopTcpServer()
def sendUltrasonic(self):
if self.sonic==True:
ADC_Ultrasonic=self.ultrasonic.get_distance()
if ADC_Ultrasonic==self.ultrasonic.get_distance():
try:
self.send(cmd.CMD_SONIC+"#"+str(ADC_Ultrasonic)+'\n')
except:
self.sonic=False
self.ultrasonicTimer = threading.Timer(0.13,self.sendUltrasonic)
self.ultrasonicTimer.start()
def sendLight(self):
if self.Light==True:
ADC_Light1=self.adc.recvADC(0)
ADC_Light2=self.adc.recvADC(1)
try:
self.send(cmd.CMD_LIGHT+'#'+str(ADC_Light1)+'#'+str(ADC_Light2)+'\n')
except:
self.Light=False
self.lightTimer = threading.Timer(0.17,self.sendLight)
self.lightTimer.start()
def Power(self):
while True:
ADC_Power=self.adc.recvADC(2)*3
time.sleep(3)
if ADC_Power < 6.8:
for i in range(4):
self.buzzer.run('1')
time.sleep(0.1)
self.buzzer.run('0')
time.sleep(0.1)
elif ADC_Power< 7:
for i in range(2):
self.buzzer.run('1')
time.sleep(0.1)
self.buzzer.run('0')
time.sleep(0.1)
else:
self.buzzer.run('0')
if __name__=='__main__':
pass