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 }