1 #include "stdafx.h"
2
3 // --- main ---
DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)4 BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
5 return TRUE;
6 }
7
8 // --- structures ---
9 struct ATS_VEHICLESPEC {
10 int BrakeNotches;
11 int PowerNotches;
12 int AtsNotch;
13 int B67Notch;
14 int Cars;
15 };
16 struct ATS_VEHICLESTATE {
17 double Location;
18 float Speed;
19 int Time;
20 float BcPressure;
21 float MrPressure;
22 float ErPressure;
23 float BpPressure;
24 float SapPressure;
25 float Current;
26 };
27 struct ATS_BEACONDATA {
28 int Type;
29 int Signal;
30 float Distance;
31 int Optional;
32 };
33 struct ATS_HANDLES {
34 int Brake;
35 int Power;
36 int Reverser;
37 int ConstantSpeed;
38 };
39
40 #define ATS_API __declspec(dllimport)
41
42 // --- handles ---
43 HMODULE dllhandle = NULL;
44 typedef ATS_API void (__stdcall *LOAD) (); LOAD load = NULL;
45 typedef ATS_API void (__stdcall *DISPOSE) (); DISPOSE dispose = NULL;
46 typedef ATS_API int (__stdcall *GETPLUGINVERSION) (); GETPLUGINVERSION getpluginversion = NULL;
47 typedef ATS_API void (__stdcall *SETVEHICLESPEC) (ATS_VEHICLESPEC vehicleSpec); SETVEHICLESPEC setvehiclespec = NULL;
48 typedef ATS_API void (__stdcall *INITIALIZE) (int brake); INITIALIZE initialize = NULL;
49 typedef ATS_API ATS_HANDLES (__stdcall *ELAPSE) (ATS_VEHICLESTATE vehicleState, int* panel, int* sound); ELAPSE elapse = NULL;
50 typedef ATS_API void (__stdcall *SETPOWER) (int setpower); SETPOWER setpower = NULL;
51 typedef ATS_API void (__stdcall *SETBRAKE) (int setbrake); SETBRAKE setbrake = NULL;
52 typedef ATS_API void (__stdcall *SETREVERSER) (int setreverser); SETREVERSER setreverser = NULL;
53 typedef ATS_API void (__stdcall *KEYDOWN) (int atsKeyCode); KEYDOWN keydown = NULL;
54 typedef ATS_API void (__stdcall *KEYUP) (int atsKeyCode); KEYUP keyup = NULL;
55 typedef ATS_API void (__stdcall *HORNBLOW) (int hornType); HORNBLOW hornblow = NULL;
56 typedef ATS_API void (__stdcall *DOOROPEN) (); DOOROPEN dooropen = NULL;
57 typedef ATS_API void (__stdcall *DOORCLOSE) (); DOORCLOSE doorclose = NULL;
58 typedef ATS_API void (__stdcall *SETSIGNAL) (int signal); SETSIGNAL setsignal = NULL;
59 typedef ATS_API void (__stdcall *SETBEACONDATA) (ATS_BEACONDATA beaconData); SETBEACONDATA setbeacondata = NULL;
60
61 // --- load the plugin ---
LoadDLL(LPCWSTR fileUnicode,LPCSTR fileAnsi)62 int _stdcall LoadDLL(LPCWSTR fileUnicode, LPCSTR fileAnsi) {
63 try
64 {
65 dllhandle = LoadLibraryW(fileUnicode);
66 }
67 catch (...)
68 {
69 //Blank try / catch in case our library will only load with ANSI & crashes with Unicode
70 //This seems to be the case with some specific versions of OS_ATS1.dll
71 //These were likely compiled on XP with Bloodshed Dev C++ (??)
72 }
73
74 if (dllhandle == NULL) {
75 try
76 {
77 dllhandle = LoadLibraryA(fileAnsi);
78 }
79 catch (...)
80 {
81 //Presumably both Unicode and ANSI crashed
82 return 0;
83 }
84 if (dllhandle == NULL) return 0;
85 }
86 { // --- Load ---
87 FARPROC functionhandle = GetProcAddress(dllhandle, "Load");
88 if (functionhandle != NULL) {
89 load = (LOAD)functionhandle;
90 }
91 }
92 { // --- Dispose ---
93 FARPROC functionhandle = GetProcAddress(dllhandle, "Dispose");
94 if (functionhandle != NULL) {
95 dispose = (DISPOSE)functionhandle;
96 }
97 }
98 { // --- GetPluginVersion ---
99 FARPROC functionhandle = GetProcAddress(dllhandle, "GetPluginVersion");
100 if (functionhandle != NULL) {
101 getpluginversion = (GETPLUGINVERSION)functionhandle;
102 }
103 }
104 { // --- SetVehicleSpec ---
105 FARPROC functionhandle = GetProcAddress(dllhandle, "SetVehicleSpec");
106 if (functionhandle != NULL) {
107 setvehiclespec = (SETVEHICLESPEC)functionhandle;
108 }
109 }
110 { // --- Initialize ---
111 FARPROC functionhandle = GetProcAddress(dllhandle, "Initialize");
112 if (functionhandle != NULL) {
113 initialize = (INITIALIZE)functionhandle;
114 }
115 }
116 { // --- Elapse ---
117 FARPROC functionhandle = GetProcAddress(dllhandle, "Elapse");
118 if (functionhandle != NULL) {
119 elapse = (ELAPSE)functionhandle;
120 }
121 }
122 { // --- SetPower ---
123 FARPROC functionhandle = GetProcAddress(dllhandle, "SetPower");
124 if (functionhandle != NULL) {
125 setpower = (SETPOWER)functionhandle;
126 }
127 }
128 { // --- SetBrake ---
129 FARPROC functionhandle = GetProcAddress(dllhandle, "SetBrake");
130 if (functionhandle != NULL) {
131 setbrake = (SETBRAKE)functionhandle;
132 }
133 }
134 { // --- SetReverser ---
135 FARPROC functionhandle = GetProcAddress(dllhandle, "SetReverser");
136 if (functionhandle != NULL) {
137 setreverser = (SETREVERSER)functionhandle;
138 }
139 }
140 { // --- KeyDown ---
141 FARPROC functionhandle = GetProcAddress(dllhandle, "KeyDown");
142 if (functionhandle != NULL) {
143 keydown = (KEYDOWN)functionhandle;
144 }
145 }
146 { // --- KeyUp ---
147 FARPROC functionhandle = GetProcAddress(dllhandle, "KeyUp");
148 if (functionhandle != NULL) {
149 keyup = (KEYUP)functionhandle;
150 }
151 }
152 { // --- HornBlow ---
153 FARPROC functionhandle = GetProcAddress(dllhandle, "HornBlow");
154 if (functionhandle != NULL) {
155 hornblow = (HORNBLOW)functionhandle;
156 }
157 }
158 { // --- DoorOpen ---
159 FARPROC functionhandle = GetProcAddress(dllhandle, "DoorOpen");
160 if (functionhandle != NULL) {
161 dooropen = (DOOROPEN)functionhandle;
162 }
163 }
164 { // --- DoorClose ---
165 FARPROC functionhandle = GetProcAddress(dllhandle, "DoorClose");
166 if (functionhandle != NULL) {
167 doorclose = (DOORCLOSE)functionhandle;
168 }
169 }
170 { // --- SetSignal ---
171 FARPROC functionhandle = GetProcAddress(dllhandle, "SetSignal");
172 if (functionhandle != NULL) {
173 setsignal = (SETSIGNAL)functionhandle;
174 }
175 }
176 { // --- SetBeaconData ---
177 FARPROC functionhandle = GetProcAddress(dllhandle, "SetBeaconData");
178 if (functionhandle != NULL) {
179 setbeacondata = (SETBEACONDATA)functionhandle;
180 }
181 }
182 return 1;
183 }
184
185 // --- unload the plugin ---
UnloadDLL()186 int _stdcall UnloadDLL () {
187 if (dllhandle != NULL) {
188 load = NULL;
189 dispose = NULL;
190 getpluginversion = NULL;
191 setvehiclespec = NULL;
192 initialize = NULL;
193 elapse = NULL;
194 setpower = NULL;
195 setbrake = NULL;
196 setreverser = NULL;
197 keydown = NULL;
198 keyup = NULL;
199 hornblow = NULL;
200 dooropen = NULL;
201 doorclose = NULL;
202 setsignal = NULL;
203 setbeacondata = NULL;
204 return FreeLibrary(dllhandle);
205 } else {
206 return 1;
207 }
208 }
209
210 // --- Load ---
Load()211 void _stdcall Load () {
212 if (load != NULL) load();
213 }
214
215 // --- Dispose ---
Dispose()216 void _stdcall Dispose () {
217 if (dispose != NULL) dispose();
218 }
219
220 // --- GetPluginVersion ---
GetPluginVersion()221 int _stdcall GetPluginVersion () {
222 if (getpluginversion != NULL) {
223 return getpluginversion();
224 } else {
225 return 0;
226 }
227 }
228
229 // --- SetVehicleSpec ---
SetVehicleSpec(ATS_VEHICLESPEC * vehicleSpec)230 void _stdcall SetVehicleSpec (ATS_VEHICLESPEC* vehicleSpec) {
231 if (setvehiclespec != NULL) setvehiclespec(*vehicleSpec);
232 }
233
234 // --- Initialize ---
Initialize(int brake)235 void _stdcall Initialize (int brake) {
236 if (initialize != NULL) initialize(brake);
237 }
238
239 // --- Elapse ---
Elapse(ATS_HANDLES * atsHandles,ATS_VEHICLESTATE * vehicleState,int * panel,int * sound)240 void _stdcall Elapse (ATS_HANDLES* atsHandles, ATS_VEHICLESTATE* vehicleState, int* panel, int* sound) {
241 if (elapse != NULL) {
242 ATS_HANDLES handles = elapse(*vehicleState, panel, sound);
243 atsHandles->Brake = handles.Brake;
244 atsHandles->Power = handles.Power;
245 atsHandles->Reverser = handles.Reverser;
246 atsHandles->ConstantSpeed = handles.ConstantSpeed;
247 }
248 }
249
250 // --- SetPower ---
SetPower(int notch)251 void _stdcall SetPower(int notch) {
252 if (setpower != NULL) setpower(notch);
253 }
254
255 // --- SetBrake ---
SetBrake(int notch)256 void _stdcall SetBrake(int notch) {
257 if (setbrake != NULL) setbrake(notch);
258 }
259
260 // --- SetReverser ---
SetReverser(int pos)261 void _stdcall SetReverser(int pos) {
262 if (setreverser != NULL) setreverser(pos);
263 }
264
265 // --- KeyDown ---
KeyDown(int atsKeyCode)266 void _stdcall KeyDown(int atsKeyCode) {
267 if (keydown != NULL) keydown(atsKeyCode);
268 }
269
270 // --- KeyUp ---
KeyUp(int atsKeyCode)271 void _stdcall KeyUp(int atsKeyCode) {
272 if (keyup != NULL) keyup(atsKeyCode);
273 }
274
275 // --- HornBlow ---
HornBlow(int hornType)276 void _stdcall HornBlow(int hornType) {
277 if (hornblow != NULL) hornblow(hornType);
278 }
279
280 // --- DoorOpen ---
DoorOpen()281 void _stdcall DoorOpen() {
282 if (dooropen != NULL) dooropen();
283 }
284
285 // --- DoorClose ---
DoorClose()286 void _stdcall DoorClose() {
287 if (doorclose != NULL) doorclose();
288 }
289
290 // --- SetSignal ---
SetSignal(int signal)291 void _stdcall SetSignal(int signal) {
292 if (setsignal != NULL) setsignal(signal);
293 }
294
295 // --- SetBeaconData ---
SetBeaconData(ATS_BEACONDATA * beaconData)296 void _stdcall SetBeaconData(ATS_BEACONDATA* beaconData) {
297 if (setbeacondata != NULL) setbeacondata(*beaconData);
298 }