import socket
import struct
import serial
import time
import csv
from enum import Enum
from GAME_METHODS import *


COM_PORT = 'COM5'
UDP_IP = "127.0.0.1"
BEAMNG_UDP_PORT = 4444
FORZA_UDP_PORT= 4843

class GameType(Enum):
    NONE=0,
    BEAMNG = 1,
    FORZA = 2

connectedArduino = False
connectedWebSocket = False
gameSelected = False
portToConnect= 0
gameType= GameType.NONE
carData = 0

#code runs from here<-----------------------------------------------------------------------------------------------------------

#select game 
while gameSelected == False:
    gameNo = input("1:BEAMNG\n2:FORZA\n")
    if gameNo == "1":
        portToConnect = BEAMNG_UDP_PORT
        gameSelected = True
        gameType=GameType.BEAMNG
        print("BeamNG Selected")
    elif gameNo == "2":
        portToConnect = FORZA_UDP_PORT
        gameType=GameType.FORZA
        gameSelected=True
        print("Forza Selected")

    else:
        print("please select a number from the list")

#check everything is connected
while connectedWebSocket == False:
    try:    
        sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        sock.bind((UDP_IP,portToConnect))
        connectedWebSocket = True
    except:
        print("please check you are able to open the socket on this system\ntired to open port: "+portToConnect)
        exit()

while connectedArduino == False:
    try:
        toPi=serial.Serial(COM_PORT,115200) #connect to arduino
        connectedArduino = True
    except:
        print("please check connection to arduino and verify the correct COM port")
        time.sleep(1)

csvOut = False
csvFile = open('dataOut.csv',"a")
##csvWriter = csv.writer(csvFile)
firstRun= True

#print(struct.calcsize(FORZA_METHODS.FORZA_DATA_FORMAT))
print("ready:\n")
while True:
    data, addr = sock.recvfrom(1024)
    if gameType == GameType.BEAMNG:
        unpackedData = struct.unpack(BEAMNG_METHODS.BEAMNG_DATA_FORMAT,data)
        carData = BEAMNG_METHODS.unpackData(unpackedData)
        kmh=carData["speed"]*3.6
    elif gameType == GameType.FORZA:
        unpackedData = struct.unpack(FORZA_METHODS.FORZA_DATA_FORMAT,data) 
        carData = FORZA_METHODS.unpackData(unpackedData)
        #carData = FORZA_METHODS.get_data(data)
        kmh = carData["Speed"]*3.6
        if csvOut == True:
            if firstRun == True:
                out=""
                for im,nm in carData.items():
                    out = out + im + ","
                csvFile.write(out + "\n")
                firstRun=False
            outString=""
            for itm,num in carData.items():
                outString = outString + str(num) +","
            csvFile.write(outString+"\n")

    toPi.write(str(kmh).encode()+":".encode())
    
