OutGauge Mode 2
OutGauge Delay 4
OutGauge IP 127.0.0.1
OutGauge Port 30000
OutGauge ID 2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO.Ports;
using System.Threading;
namespace OutGauge
{
class Program
{
const int BufferSize = 1024;
const string Host = "127.0.0.1";
const ushort Port = 35555;
static SerialPort _serialPort;
static void Main()
{
StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();
// Allow the user to set the appropriate properties.
_serialPort.PortName = "COM3";
_serialPort.BaudRate = 57600;
_serialPort.DataBits = 8;
_serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), "None");
_serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "Two");
// Set the read/write timeouts
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.Open();
// Create UDP socket.
Socket socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
byte[] buffer = new byte[BufferSize];
try
{
// Create EndPoint for LFS and bind the socket to it.
IPEndPoint endPoint = new IPEndPoint(
IPAddress.Parse(Host),
Port);
socket.Bind(endPoint);
while (true)
{
// Receive packet data.
int received = socket.Receive(buffer);
if (received > 0)
{
// Copy data from buffer into correctly sized array.
byte[] data = new byte[received];
Buffer.BlockCopy(buffer, 0, data, 0, received);
// Packet received...
OutGaugePack packet = new OutGaugePack(data);
OutGaugePacketReceived(packet);
}
else
{
Console.WriteLine("Lost connection to OutGauge");
break;
}
}
}
catch (SocketException ex)
{
Console.WriteLine("Socket Error: {0}", ex.Message);
}
}
static void OutGaugePacketReceived(OutGaugePack packet)
{
// Do stuff with packet etc..
_serialPort.Write("S"); // Start-byte for uC
if ((int)packet.RPM < 10){
_serialPort.Write("000");
} else if ((int)packet.RPM < 100){
_serialPort.Write("00");
} else if ((int)packet.RPM < 1000){
_serialPort.Write("0");
}
_serialPort.Write(((int)packet.RPM).ToString());
Int32 speed_kph = (int)(packet.Speed *3.6);
if (speed_kph < 10)
{
_serialPort.Write("00");
}
else if (speed_kph < 100)
{
_serialPort.Write("0");
}
_serialPort.Write(speed_kph.ToString());
if (packet.Gear == 0){
_serialPort.Write("R");
} else if (packet.Gear == 1){
_serialPort.Write("N");
} else if (packet.Gear > 1){
_serialPort.Write((packet.Gear - 1).ToString());
}
}
class OutGaugePack
{
public TimeSpan Time { get; private set; }
public string Car { get; private set; }
public OutGaugeFlags Flags { get; private set; }
public int Gear { get; private set; }
public int SpareB { get; private set; }
public float Speed { get; private set; }
public float RPM { get; private set; }
public float Turbo { get; private set; }
public float EngTemp { get; private set; }
public float Fuel { get; private set; }
public float OilPressure { get; private set; }
public float OilTemp { get; private set; }
public DashLightFlags DashLights { get; private set; }
public DashLightFlags ShowLights { get; private set; }
public float Throttle { get; private set; }
public float Brake { get; private set; }
public float Clutch { get; private set; }
public string Display1 { get; private set; }
public string Display2 { get; private set; }
public int ID { get; private set; }
public OutGaugePack(byte[] data)
{
Time = TimeSpan.FromMilliseconds(BitConverter.ToUInt32(data, 0));
Car = ASCIIEncoding.ASCII.GetString(data, 4, 4).TrimEnd(char.MinValue);
Flags = (OutGaugeFlags)BitConverter.ToUInt16(data, 8);
Gear = data[10];
SpareB = data[11];
Speed = BitConverter.ToSingle(data, 12);
RPM = BitConverter.ToSingle(data, 16);
Turbo = BitConverter.ToSingle(data, 20);
EngTemp = BitConverter.ToSingle(data, 24);
Fuel = BitConverter.ToSingle(data, 28);
OilPressure = BitConverter.ToSingle(data, 32);
OilTemp = BitConverter.ToSingle(data, 36);
DashLights = (DashLightFlags)BitConverter.ToUInt32(data, 40);
ShowLights = (DashLightFlags)BitConverter.ToUInt32(data, 44);
Throttle = BitConverter.ToSingle(data, 48);
Brake = BitConverter.ToSingle(data, 52);
Clutch = BitConverter.ToSingle(data, 56);
Display1 = ASCIIEncoding.ASCII.GetString(data, 60, 16).TrimEnd(char.MinValue);
Display2 = ASCIIEncoding.ASCII.GetString(data, 76, 16).TrimEnd(char.MinValue);
if (data.Length == 96)
{
ID = BitConverter.ToInt32(data, 92);
}
}
}
[Flags]
enum OutGaugeFlags
{
OG_TURBO = 8192,
OG_KM = 16384,
OG_BAR = 32768,
}
[Flags]
enum DashLightFlags
{
DL_SHIFT = 1,
DL_FULLBEAM = 2,
DL_HANDBRAKE = 4,
DL_PITSPEED = 8,
DL_TC = 16,
DL_SIGNAL_L = 32,
DL_SIGNAL_R = 64,
DL_SIGNAL_ANY = 128,
DL_OILWARN = 256,
DL_BATTERY = 512,
DL_ABS = 1024,
DL_SPARE = 2048,
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include "rs232.h"
int main()
{
OpenComport(3, 9600);
SendByte(3, 'S');
char i;
for(i=0x30;i<0x40;i++){
SendByte(3, i);
}
CloseComport(3);
}
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(288): error C2065: 'port_settings' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(288): warning C4133: 'function' : incompatible types - from 'int *' to 'LPDCB'
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(295): error C2065: 'port_settings' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(295): warning C4133: 'function' : incompatible types - from 'int *' to 'LPDCB'
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(302): error C2275: 'COMMTIMEOUTS' : illegal use of this type as an expression
c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(755) : see declaration of 'COMMTIMEOUTS'
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(302): error C2146: syntax error : missing ';' before identifier 'Cptimeouts'
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(302): error C2065: 'Cptimeouts' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(304): error C2065: 'Cptimeouts' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(304): error C2224: left of '.ReadIntervalTimeout' must have struct/union type
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(305): error C2065: 'Cptimeouts' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(305): error C2224: left of '.ReadTotalTimeoutMultiplier' must have struct/union type
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(306): error C2065: 'Cptimeouts' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(306): error C2224: left of '.ReadTotalTimeoutConstant' must have struct/union type
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(307): error C2065: 'Cptimeouts' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(307): error C2224: left of '.WriteTotalTimeoutMultiplier' must have struct/union type
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(308): error C2065: 'Cptimeouts' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(308): error C2224: left of '.WriteTotalTimeoutConstant' must have struct/union type
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(310): error C2065: 'Cptimeouts' : undeclared identifier
\visual studio 2010\projects\outgauge\outgaugetest\rs232.c(310): warning C4133: 'function' : incompatible types - from 'int *' to 'LPCOMMTIMEOUTS'
#include <iostream>
#include <winsock2.h> // WinSock2 library (may need to add WS2_32.lib to project dependencies).
#define BUFFER_SIZE 512 // Receive buffer size (basically maximum packet size in UDP).
#define HOST "127.0.0.1" // Host to connect to.
#define PORT 35555 // Port to connect to the host through.
// Define types used by InSim.
typedef unsigned char byte;
typedef unsigned short word;
typedef struct
{
int X, Y, Z;
} Vec;
typedef struct
{
float X, Y, Z;
} Vector;
// Include InSim header.
#include "InSim.h"
void OutGaugePacketReceived(const OutGaugePack packet);
int main(int argc, char *argv[])
{
// Initialise WinSock version 2.2.
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
WSACleanup();
std::cerr << "Error: Failed to init WinSock" << std::endl;
return EXIT_FAILURE;
}
// Create UDP socket.
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET)
{
WSACleanup();
std::cerr << "Error: Could not create socket." << std::endl;
return EXIT_FAILURE;
}
// Bind to receive UDP packets.
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr(HOST);
saddr.sin_port = htons(PORT);
if (bind(sock, (sockaddr *)&saddr, sizeof(sockaddr)) == SOCKET_ERROR)
{
closesocket(sock);
WSACleanup();
std::cerr << "Error: Could not connect to LFS" << std::endl;
return EXIT_FAILURE;
}
// Packet receive loop.
char recvbuf[BUFFER_SIZE];
memset(recvbuf, 0, sizeof(recvbuf)); // Set recvbuf to zero.
int bytes = 0;
do
{
bytes = recv(sock, recvbuf, BUFFER_SIZE, 0);
if (bytes > 0)
OutGaugePacketReceived((OutGaugePack &)recvbuf);
else if (bytes == 0)
std::cerr << "Error: Lost connection with LFS" << std::endl;
else
std::cerr << "Error: " << WSAGetLastError() << std::endl;
} while (bytes > 0);
// Cleanup and exit.
closesocket(sock);
WSACleanup();
return EXIT_SUCCESS;
}
void OutGaugePacketReceived(const OutGaugePack packet)
{
unsigned mask = 1 << DL_SHIFT;
if (packet.ShowLights & mask)
{
std::cout << "Shift light on!" << std::endl;
}
std::cout << (int)packet.RPM << std::endl;
}