Skip to content

Commit 6c03cca

Browse files
committed
🚀
0 parents  commit 6c03cca

File tree

13 files changed

+1540
-0
lines changed

13 files changed

+1540
-0
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.env
2+
build-vfrmap-upload.sh
3+
vfrmap.exe
4+
request_data.exe
5+
_vendor

build-vfrmap.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
set -e
3+
4+
go generate github.com/lian/msfs2020-go/simconnect
5+
go generate github.com/lian/msfs2020-go/vfrmap
6+
7+
build_time=$(date -u +'%Y-%m-%d_%T')
8+
set +e
9+
build_version=$(git describe --tags)
10+
set -e
11+
12+
[ -f .env ] && source .env
13+
GOOS=windows GOARCH=amd64 go build -ldflags "-X main.mapApiKeyDefault=$MAP_API_KEY -X main.buildVersion=$build_version -X main.buildTime=$build_time" -v github.com/lian/msfs2020-go/vfrmap

examples/request_data/main.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"github.com/lian/msfs2020-go/simconnect"
8+
)
9+
10+
// ported from: MSFS-SDK/Samples/SimConnectSamples/RequestData/RequestData.cpp
11+
// build: GOOS=windows GOARCH=amd64 go build github.com/lian/msfs2020-go/examples/request_data
12+
13+
type Report struct {
14+
simconnect.RecvSimobjectDataByType
15+
Title [256]byte
16+
Kohlsman float64
17+
Altitude float64
18+
Latitude float64
19+
Longitude float64
20+
}
21+
22+
func main() {
23+
s, err := simconnect.New("Request Data")
24+
if err != nil {
25+
panic(err)
26+
}
27+
fmt.Println("Connected to Flight Simulator!")
28+
29+
defineID := simconnect.DWORD(0)
30+
s.AddToDataDefinition(defineID, "Title", "", simconnect.DATATYPE_STRING256)
31+
s.AddToDataDefinition(defineID, "Kohlsman setting hg", "inHg", simconnect.DATATYPE_FLOAT64)
32+
s.AddToDataDefinition(defineID, "Plane Altitude", "feet", simconnect.DATATYPE_FLOAT64)
33+
s.AddToDataDefinition(defineID, "Plane Latitude", "degrees", simconnect.DATATYPE_FLOAT64)
34+
s.AddToDataDefinition(defineID, "Plane Longitude", "degrees", simconnect.DATATYPE_FLOAT64)
35+
36+
fmt.Println("SubscribeToSystemEvent")
37+
eventSimStartID := simconnect.DWORD(0)
38+
s.SubscribeToSystemEvent(eventSimStartID, "SimStart")
39+
40+
requestID := simconnect.DWORD(0)
41+
s.RequestDataOnSimObjectType(requestID, defineID, 0, simconnect.SIMOBJECT_TYPE_USER)
42+
43+
for {
44+
ppData, r1, err := s.GetNextDispatch()
45+
46+
if r1 < 0 {
47+
if uint32(r1) == simconnect.E_FAIL {
48+
// skip error, means no new messages?
49+
continue
50+
} else {
51+
panic(fmt.Errorf("GetNextDispatch error: %d %s", r1, err))
52+
}
53+
}
54+
55+
recvInfo := *(*simconnect.Recv)(ppData)
56+
//fmt.Println(ppData, pcbData, recvInfo)
57+
58+
switch recvInfo.ID {
59+
case simconnect.RECV_ID_EXCEPTION:
60+
recvErr := *(*simconnect.RecvException)(ppData)
61+
fmt.Printf("SIMCONNECT_RECV_ID_EXCEPTION %#v\n", recvErr)
62+
63+
case simconnect.RECV_ID_OPEN:
64+
recvOpen := *(*simconnect.RecvOpen)(ppData)
65+
fmt.Println("SIMCONNECT_RECV_ID_OPEN", fmt.Sprintf("%s", recvOpen.ApplicationName))
66+
//spew.Dump(recvOpen)
67+
case simconnect.RECV_ID_EVENT:
68+
recvEvent := *(*simconnect.RecvEvent)(ppData)
69+
fmt.Println("SIMCONNECT_RECV_ID_EVENT")
70+
//spew.Dump(recvEvent)
71+
72+
switch recvEvent.EventID {
73+
case eventSimStartID:
74+
fmt.Println("SimStart Event")
75+
default:
76+
fmt.Println("unknown SIMCONNECT_RECV_ID_EVENT", recvEvent.EventID)
77+
}
78+
79+
case simconnect.RECV_ID_SIMOBJECT_DATA_BYTYPE:
80+
recvData := *(*simconnect.RecvSimobjectDataByType)(ppData)
81+
fmt.Println("SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE")
82+
83+
switch recvData.RequestID {
84+
case requestID:
85+
report := *(*Report)(ppData)
86+
fmt.Printf("REPORT: %s: GPS: %.6f,%.6f Altitude: %.0f\n", report.Title, report.Latitude, report.Longitude, report.Altitude)
87+
s.RequestDataOnSimObjectType(requestID, defineID, 0, simconnect.SIMOBJECT_TYPE_USER)
88+
}
89+
90+
default:
91+
fmt.Println("recvInfo.dwID unknown", recvInfo.ID)
92+
}
93+
94+
time.Sleep(500 * time.Millisecond)
95+
}
96+
97+
fmt.Println("close")
98+
99+
if err = s.Close(); err != nil {
100+
panic(err)
101+
}
102+
}

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module github.com/lian/msfs2020-go
2+
3+
go 1.14
4+
5+
require github.com/gorilla/websocket v1.4.2

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
2+
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=

simconnect/bindata.go

Lines changed: 241 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

simconnect/defs.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package simconnect
2+
3+
// MSFS-SDK/SimConnect\ SDK/include/SimConnect.h
4+
5+
const E_FAIL uint32 = 0x80004005
6+
7+
type DWORD uint32
8+
9+
const UNUSED DWORD = 0xffffffff // special value to indicate unused event, ID
10+
11+
const (
12+
DATATYPE_INVALID DWORD = iota // invalid data type
13+
DATATYPE_INT32 // 32-bit integer number
14+
DATATYPE_INT64 // 64-bit integer number
15+
DATATYPE_FLOAT32 // 32-bit floating-point number (float)
16+
DATATYPE_FLOAT64 // 64-bit floating-point number (double)
17+
DATATYPE_STRING8 // 8-byte string
18+
DATATYPE_STRING32 // 32-byte string
19+
DATATYPE_STRING64 // 64-byte string
20+
DATATYPE_STRING128 // 128-byte string
21+
DATATYPE_STRING256 // 256-byte string
22+
DATATYPE_STRING260 // 260-byte string
23+
DATATYPE_STRINGV // variable-length string
24+
DATATYPE_INITPOSITION // see SIMCONNECT_DATA_INITPOSITION
25+
DATATYPE_MARKERSTATE // see SIMCONNECT_DATA_MARKERSTATE
26+
DATATYPE_WAYPOINT // see SIMCONNECT_DATA_WAYPOINT
27+
DATATYPE_LATLONALT // see SIMCONNECT_DATA_LATLONALT
28+
DATATYPE_XYZ // see SIMCONNECT_DATA_XYZ
29+
30+
DATATYPE_MAX // enum limit
31+
)
32+
33+
const (
34+
RECV_ID_NULL DWORD = iota
35+
RECV_ID_EXCEPTION
36+
RECV_ID_OPEN
37+
RECV_ID_QUIT
38+
RECV_ID_EVENT
39+
RECV_ID_EVENT_OBJECT_ADDREMOVE
40+
RECV_ID_EVENT_FILENAME
41+
RECV_ID_EVENT_FRAME
42+
RECV_ID_SIMOBJECT_DATA
43+
RECV_ID_SIMOBJECT_DATA_BYTYPE
44+
RECV_ID_WEATHER_OBSERVATION
45+
RECV_ID_CLOUD_STATE
46+
RECV_ID_ASSIGNED_OBJECT_ID
47+
RECV_ID_RESERVED_KEY
48+
RECV_ID_CUSTOM_ACTION
49+
RECV_ID_SYSTEM_STATE
50+
RECV_ID_CLIENT_DATA
51+
RECV_ID_EVENT_WEATHER_MODE
52+
RECV_ID_AIRPORT_LIST
53+
RECV_ID_VOR_LIST
54+
RECV_ID_NDB_LIST
55+
RECV_ID_WAYPOINT_LIST
56+
RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED
57+
RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED
58+
RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED
59+
RECV_ID_EVENT_RACE_END
60+
RECV_ID_EVENT_RACE_LAP
61+
62+
RECV_ID_PICK
63+
)
64+
65+
const (
66+
SIMOBJECT_TYPE_USER DWORD = iota
67+
SIMOBJECT_TYPE_ALL
68+
SIMOBJECT_TYPE_AIRCRAFT
69+
SIMOBJECT_TYPE_HELICOPTER
70+
SIMOBJECT_TYPE_BOAT
71+
SIMOBJECT_TYPE_GROUND
72+
)
73+
74+
type Recv struct {
75+
Size DWORD
76+
Version DWORD
77+
ID DWORD
78+
}
79+
80+
type RecvOpen struct {
81+
Recv
82+
ApplicationName [256]byte
83+
ApplicationVersionMajor DWORD
84+
ApplicationVersionMinor DWORD
85+
ApplicationBuildMajor DWORD
86+
ApplicationBuildMinor DWORD
87+
SimConnectVersionMajor DWORD
88+
SimConnectVersionMinor DWORD
89+
SimConnectBuildMajor DWORD
90+
SimConnectBuildMinor DWORD
91+
Reserved1 DWORD
92+
Reserved2 DWORD
93+
}
94+
95+
type RecvEvent struct {
96+
Recv
97+
//static const DWORD UNKNOWN_GROUP = DWORD_MAX;
98+
GroupID DWORD
99+
EventID DWORD
100+
Data DWORD // uEventID-dependent context
101+
}
102+
103+
type RecvSimobjectData struct {
104+
Recv
105+
RequestID DWORD
106+
ObjectID DWORD
107+
DefineID DWORD
108+
Flags DWORD // SIMCONNECT_DATA_REQUEST_FLAG
109+
entrynumber DWORD // if multiple objects returned, this is number <entrynumber> out of <outof>.
110+
outof DWORD // note: starts with 1, not 0.
111+
DefineCount DWORD // data count (number of datums, *not* byte count)
112+
//SIMCONNECT_DATAV( dwData, dwDefineID, ); // data begins here, dwDefineCount data items
113+
}
114+
115+
type RecvSimobjectDataByType struct {
116+
RecvSimobjectData
117+
}
118+
119+
type RecvException struct {
120+
Recv
121+
Exception DWORD // see SIMCONNECT_EXCEPTION
122+
//static const DWORD UNKNOWN_SENDID = 0;
123+
SendID DWORD // see SimConnect_GetLastSentPacketID
124+
//static const DWORD UNKNOWN_INDEX = DWORD_MAX;
125+
Index DWORD // index of parameter that was source of error
126+
}

0 commit comments

Comments
 (0)