Skip to content
View in the app

A better way to browse. Learn more.

The AVSIM Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

EpicMapper - Thoughts and Evolution

Featured Replies

Team,I wanted to take the opportunity to reply to some comments regarding EpicMapper.Firstly, EpicMapper doesnt contain a fancy GUI. This was done on purpose. Our thinking is that you start EpicMapper and then minimise it in favor of using your screen for more useful things, who looks at the screen whilst flying :-). In fact version 2 wont have an interface at all it will be an NT service. This has several advantages; the main one being no dependency on the great piece of M$ code that is explorer.exe. One problem of using a GUI on an application that is really a service is that if your desktop crachs (explorer.exe) then all applications hooked to this desktop will also fail. By moving to a service we eliminate this threat and again increase stability.The text file configuration (whilst it can be confusing in the beginning) is actually a faster way programatically for handling a configuration. We focused mainly on the internal state machine (which I have to say is far more complex and effective than anything else on the market). This state machine doesnt simply just send and recieve data to and from the EPIC. We have written the code in such a way as to minimise load on the local PC and EPIC. For example, only delta's are processed, we have full state locking preventing either the FS or the user from overriding a variable in progress (this is very important when talking about rotaries).What would be very useful is a few comments on future features people would like. I have a list in mind including auto discovery of nwq's, etc. If you have any ideas please post them here for discussion. I will also be looking for beta testers of EMv2

I have read a lot of posts on EpicMapper and all appear to imply that it only works with the Microsoft Flight Simulator. I use Falcon4 exclusively and I'm building a simulator around it.Does EpicMapper work with Falcon4?If not, that would be an enhancement I'd like to see.

Currently EpicMapper doesnt support falcon 4. However, future versions of FSIS by http://www.sim-instruments.com will

The gui is for the programing not after, so if you don't have a gui how do you program it..now I haven't used epicmapper cause I don't need it or want to pay for it. just my take. I am sure it works well but FS COMM gives me so many options that I will stick with it.

That might be the bottom line. Once a setup works, you stick to it. I have EpicMapper working, all my code is adapted to it, so I will not change it for another program. I can confirm what Marc wrote: Once the programming is done, EpicMapper just sits on your desktop, and you can completely forget about it. I never had any crash related to it. No perceptible hit on the FS framerate either (all settings standard).About GUI or not: I have a shortcut on my desktop to the EpicMapper config.ini file. Whenever I need to change something (or want to do a test), one doubleclick gets me to the ini file, I make the changes and in seconds - without ever closing FS - I can test the changes. Very fast, and very simple. No need for a GUI, everything happens in the trusty old Notepad...Hans

Marc,At present, when I use a rotary to set, let's say, the heading of the Project Magenta MCP, each click of the rotary generates a nqw with a new value. This updates the PM offset. The new offset value triggers execution of the respective PH prodecure, which in turn updates the display. Since the display is also updated inside my epl code (because I want instant updates), I get jumpy displays, going back and forth until they finally settle for the latest value. Of course, the blame for this goes to network latency.I got rid of that problem by using timers, updating the offsets only after the turning of the rotary knob has stopped. But it was quite a challenge to get the timing right. Maybe some kind of solution could be included in V.2.I would not get rid of the EM window alltogether. I used it a lot to monitor the actions of the program and to find errors in my code or settings.Besides that, the only other thing on my whish list would be a better manual. Not for me (anymore), but for those who are new to the program. It should include epl programing examples for each section, to get users going quickly and without frustrating trial and error...All the best,Hans

Hiya Hans,This infact is not a network problem. There are some tricks to making the rotaries more stable.What you want to do is use a count down timer that tracks if the user has finished turning the knob and then send the nqw. However, the trick is to ensure that the local display keeps updating prior to sending the nqw. I have included an example belowIf you need me to email you a .zip file let me knowShhh....dont tell anyone....this code is red hot...its the absoutely best thing to solve your problem...just between you and I ;-)void INIT (void){ clearpoint (AP_ALL_LED); RADIO.comm_one_std_hun=23; RADIO.comm_one_std_dec=45; RADIO.comm_one_std_fixed=1; MCP.alt=10000; MCP.heading = 180; MCP.spd = 250; MCP.vs =9999; jump(MainLoop); // Once finished jump to the main timing loop}void CheckSpeedtimers (void){ // This is called every ND_TIME seconds. // Defined in the epic.inc file // It check to see if the hold down timers on a per switch basis // have expired. if they have expired then call the routine to set // the values. This means the used has stopped turning the switch. // if the knob is still tuning (ndTime is value) then we simply // reduce the timer and keep going // Check the Captains navigation dislpay range switch if (hdgtiming) { hdgtime--; if (!hdgtime) { hdgtiming=false; nqw(0x36,wrd_HDG); } }}void MainLoop (void){ call(CheckSpeedtimers); // check to see if switch timers have // expired. If so handle them // flashers and other code in here tick++; if (tick > 49) { tick = 0; } delay(1); // wait 20msec jump(MainLoop); // restart the MainLoop}void HDG_DWN (void) { if (hdgtiming) { wrd_HDG -= HDG_FAST_INC; } else { wrd_HDG=wrd_HDG-1; } hdgtime = HDG_FAST; hdgtiming=true; if (wrd_HDG &NEG_SIGN_BIT_MASK ) { wrd_HDG = 359; } MCP.heading=wrd_HDG; }void HDG_UP (void) { if (hdgtiming) { wrd_HDG += HDG_FAST_INC; } else { wrd_HDG=wrd_HDG+1; } hdgtime = HDG_FAST; hdgtiming=true; if (wrd_HDG > 359) { wrd_HDG=0;} MCP.heading=wrd_HDG;}ph ph_HDG(6) { byte byte0; byte byte1; word word1; byt_ph_Byte0 = ph_HDG.byte0; wrd_ph_Word1 = ph_HDG.word1; call(check_if_valid_ph_value); if(f_PHValueIsValid) { wrd_HDG = ph_HDG.word1; MCP.heading = wrd_HDG; } else { MCP.heading = dash;}};

Hans,On the manual side of things have you been through the epicmapper support site ?There are over 40 pages of documents there...Of major interesthttp://www.epicmapper.com/SupportPages/en/...picTutorial.htmhttp://www.epicmapper.com/Pages/en/support.htmhttp://www.epicmapper.com/SupportPages/en/...Configuring.htm(at this URL clicking on the CONFIG, BUTTONS etc will show more information)http://www.epicmapper.com/SupportPages/en/...Ref/CmdRef1.htm

Marc,yes, I know the support pages, even had most of them printed out to have documentation handy while working.But I think my claim still stands: Some hands-on explanations about how to use the program would greatly benefit newcomers. More than anything else examples what the corresponding code in the epl should look like.Hans

Marc,thanks for the example code. Made my day, because it is very similar to the solution I came up with (sorry for the format).Hansvoid ROTARY_HDG_inc (void) { if (f_HDG_STEP) // Test for status of f_HDG_STEP flag { rvar_HDG += 10; // large decrease (by 10) of value, if f_HDG_STEP flag is on byt_HDG_STEP_DECAY = 50; // 1 sec. before large step (of 10 degs per click) is cancelled } else {rvar_HDG += 1;} // small decrease (by 1) of value, if f_HDG_STEP flag is off Display.DISP_AP_HDG = rvar_HDG; // display is updated immediately with new value jump (HDG_TIMER_TEST); } void ROTARY_HDG_dec (void) { if (f_HDG_STEP) // Test for status of f_HDG_STEP flag { rvar_HDG -= 10; // large decrease (by 10) of value, if f_HDG_STEP flag is on byt_HDG_STEP_DECAY = 50; // 1 sec. before large step (of 10 degs per click) is cancelled } else {rvar_HDG -= 1;} // small decrease (by 1) of value, if f_HDG_STEP flag is off Display.DISP_AP_HDG = rvar_HDG; // display is updated immediately with new value jump (HDG_TIMER_TEST); } void HDG_TIMER_TEST (void) // this routine prevents multiple open threads of HDG_TIMER { byt_HDG_TIMER = 7; // set HDG_TIMER to 7, which translates into 140ms if (!f_HDG_TIMER_ON) // if HDG_TIMER routine does not run already,.. { f_HDG_TIMER_ON = true; // ..set HDG_TIMER_ON flag and.. jump (HDG_TIMER); } // else (Timer is active, i.e. timing), do nothing (no nqw update of MCP) }void HDG_TIMER (void) // The function of the timer is to sense when the turning of the knob has stopped. 100ms later the value // stored in rvar sent to the MCP via EpicMapper. If values were sent to EpicMapper with each change of // rvar during fast turning of the knob, jerky (jumpy) updates of the display would result. Using the timer // gives fast and reliable display updates and only one MCP update 100 ms (5 x delay of (1)) after turning // of the knob has stopped. { byt_HDG_TIMER --; // counts timer down by 1 if (byt_HDG_TIMER == 0) // if timer is down to 0... { f_HDG_TIMER_ON = false; nqw (0x36, rvar_HDG); // send value stored in rvar to EpicMapper --> FS } else { delay (2); // if not down to o yet jump (HDG_TIMER); // start timer procedure again } }// =================================================================================================================// Pigeon Hole No. 15 - Heading Display Update// =================================================================================================================// no checking of validity of PH values, because values are always present. The HDG display is never off, i.e. a // HDG is always displayed (and can be set), even if the AP itself is turned off.ph ph_HDG (15) { byte byte0; // pigeon hole elements byte byte1; word word1; wrd_ph_HDG_Word1 = ph_HDG.word1; if (!f_HDG_TIMER_ON) // only if timer is off (turning of knob has stopped)... { if (wrd_ph_HDG_Word1 == rvar_HDG) jump RETURN; rvar_HDG = wrd_ph_HDG_Word1; Display.DISP_AP_HDG = rvar_HDG; // ..set the display with the latest data from the PH } };

Hans,There are many ways to skin a cat...but only one or two *good* ways.Just be cautious using delay as it delays *all* processing on the EPIC effectively stalling the interface until after the delay...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.