David Cox Posted April 30, 2006 Report Posted April 30, 2006 Pete, Up until now I have been using ADvDisplay to send messages to Showtext on another PC to display the status of my joystick Shift keys (the text is generated using offsets in the [buttons] section of my FSUIPC.INI file and displays R for right shift, L for left shift and L+R for both). I have now removed AdvDisplay and ShowText no longer displays these characters - I notice the User Guide says "ShowText will now work with FSUIPC alone, for multiline messages only". Am I right in assuming that the text I am generating (R, L, L+R) is not classed as a multi-line message and that is why it does not appear. If this is the case then I presume I will still need to use AdvDisplay Thanks
Pete Dowson Posted April 30, 2006 Report Posted April 30, 2006 If this is the case then I presume I will still need to use AdvDisplay Yes, the FSUIPC facilities are specifically for multiline messages. You can make yours appear to be multiline by including a line feed or return character in them, at the end for instance. LF = hex 0A (decimal 10), CR= hex 0D (decimal 13). Pete
gr8guitar Posted February 5, 2014 Report Posted February 5, 2014 Hello Pete, can you direct me as to where i might either find a gauge (to get an idea) or maybe how to use AdvDisplay to show a text message based on the offset. To be clearer, I already have 66C0 (don''t know if this offset number is correct as I'm on a different computer) being shown. In this case, I am using the FS Title Bar option instead of the AdvDisplay option to show 66C0. What I have set up is, I use a rotary switch to increment/decrement through 66C0, and then I use a pushbutton to select which panel to toggle. I use it because I have more than 9 panels so I must use the panel ID toggle option as well. Besides seeing the actual number that the offset 66C0 gives, I would like to display the text of the actual panel name. I.E., when 66C0 shows "12," I then can see text showing it to be "HUD." Thanks.
Pete Dowson Posted February 5, 2014 Report Posted February 5, 2014 Hello Pete, can you direct me as to where i might either find a gauge (to get an idea) or maybe how to use AdvDisplay to show a text message based on the offset. To be clearer, I already have 66C0 (don''t know if this offset number is correct as I'm on a different computer) being shown. In this case, I am using the FS Title Bar option instead of the AdvDisplay option to show 66C0. What I have set up is, I use a rotary switch to increment/decrement through 66C0, and then I use a pushbutton to select which panel to toggle. I use it because I have more than 9 panels so I must use the panel ID toggle option as well. Besides seeing the actual number that the offset 66C0 gives, I would like to display the text of the actual panel name. I.E., when 66C0 shows "12," I then can see text showing it to be "HUD." Thanks. You need to write code to do that -- eg a Lua plug-in. You need to refer to the Offsets list (a document installed in your FSUIPC Documents folder) to find out how to send stuff for display -- look at offserts 3380 and 32FA. Pete
gr8guitar Posted February 6, 2014 Report Posted February 6, 2014 Okay, haven't delved into LUA but it looks like I'll have to do that. Thanks for your time and information.
gr8guitar Posted February 7, 2014 Report Posted February 7, 2014 Okay, geting there but must admit, a bit confused. Below is the code I tried to modify, in red is the stuff that did not work and the FSUIPC log info. Why did the modified part not work? Code: -- "Display Vals" example LUA plug-in, by Pete Dowson, September 2008 -- Get all of the data we want to display-- gs = 02B4 and tas(02B8) and ias(02BC) offsets follow, thus 3UD gs, tas, ias = ipc.readStruct(0x02B4, "3UD")lat, lon, alt, pitch, bank, hdgT = ipc.readStruct(0x0560,"3DD", "2SD", "1UD")mach = ipc.readUW(0x11C6)vs = ipc.readSW(0x842) -- and convert it from FS units to units we like lat = lat * 90 / (10001750 * 65536 * 65536)lon = lon * 360 / (65536 * 65536 * 65536 * 65536)alt = alt * 3.28084 / (65536 * 65536)pitch = pitch * 360 / (65536 * 65536)bank = bank * 360 / (65536 * 65536)hdgM = hdgT - (ipc.readSW(0x02A0) * 65536)hdgM = hdgM * 360 / (65536 * 65536)hdgT = hdgT * 360 / (65536 * 65536)vs = vs * -3.28084ias = ias / 128tas = tas / 128gs = (gs * 3600) / (65536 * 1852)mach = mach / 20480 -- getting CC60panelid = ipc.readSW(0x66C0) if panelid = 3 thenpanelsel = 'HUD'end -- display it all in an FS window-- (note, there is a limit of 1023 characters in this, but we fit okay) -- added panelidipc.display("lat="..lat.."\nlon="..lon.."\nalt="..alt.."\npitch="..pitch.."\bank="..bank.."\nhdgT="..hdgT.."\nhdgM="..hdgM.."\vs="..vs.."\nias="..ias.."\ntas="..tas.."\ngs="..gs.."\nmach="..mach.."\nPanelID="..panelsel) -- if I use panelid instead of panelsel, then it works to show 66C0's value. -- Note the use of the \ escape to allow us to use multiple lines in a single string-- sleep for 1.5 sec.ipc.sleep(1500) --- Delay for a number of seconds.-- @param delay Number of secondsfunction delay_s(delay) delay = delay or 5 local time_to = os.time() + delay while os.time() < time_to do endend FSUIPC log: 447562 *** LUA Error: ...am Files\Microsoft Games\Flight Simulator 9\MODULES\display vals pan.lua:30: 'then' expected near '=' I even changed from 'HUD' to "HUD" and no change. If I read the panelid then it works but not when I try to use panelsel as a string. By the way, near the end seems convoluted but it works to only display for 1.5 sec. I tried assigning a different key to kill the lua but then FS would lock up. And finally, I assigned the W key to write to ipc but that did not work, the code was simply ipc.writeSW(0x66C0, 3). FSUIPC.log didn't show any errors.
Pete Dowson Posted February 7, 2014 Report Posted February 7, 2014 if panelid = 3 then That needs to be if panelid == 3 then To compare you have == for equals, ~= for not equals, and the usual >= and <= and < and >. "panelid = 3" as an assignment. The error in in line 30. Which is line 30? Note than "panelset" isn't set to anything (so will be 'nil') if panelid isn't 3. You should define a defalut value for it earlier. It needs to be a string or number to avoid a failure later. Pete
gr8guitar Posted February 7, 2014 Report Posted February 7, 2014 Thanks for your time and information. I do not know what line 30 is either. I'm not sure how it (lua) counts the lines. I downloaded lua 5.2.3 (for Windows) but it's like a DOS program so I didn't find it useful. I also downloaded Linda 1.1.3 and I didn't find it useful so I use Notepad.exe to edit. When you say: "You should define a defalut value...", do you mean assign it a variable type. I.E., in Excel: Dim panelsel as String? Also, why didn't just ipc.writeSW(0x66C0, 3) work to write the value of 3 to 66C0?
Pete Dowson Posted February 7, 2014 Report Posted February 7, 2014 Thanks for your time and information. I do not know what line 30 is either. I'm not sure how it (lua) counts the lines. My editor (Ultraedit) has line numbers on the left. Line counting is easy if you have the file. Line 1 is the first, line 2 is the second, and so on. every line counts, and the line numbers increase numerically, one by one. So, if your editor doesn't give line numbers, just count them. I know 30 is a rather big number but it isn't that hard, and that's really the best way to locate the place it thinks is wrong. I downloaded lua 5.2.3 (for Windows) but it's like a DOS program so I didn't find it useful Why are you downloading Lua versions? FSUIPC has Lua built in, as you must surely know, you don't need other parts unless you are being very ambitious. If you simply want to learn more about the syntax and rules of Lua there's the on-line reference (though if you want to do a lot of Lua work buying the book is much better. Actually there are several). The reference guide is at the link I provide in the FSUIPC Lua package documentation, or just Google "Lua". It'll take you to www.lua.org, and all the documentation you might wish for is selectable by clicking "documentation". When you say: "You should define a defalut value...", do you mean assign it a variable type. I.E., in Excel: Dim panelsel as String? No, I meant, as I definitely said, that if you don't actually assign a value to panelset it will have no value (i.e. 'nil') -- if it has no value your instruction: ipc.display("lat="..lat.."\nlon="..lon.."\nalt="..alt.."\npitch="..pitch.."\ bank="..bank.."\nhdgT="..hdgT.."\nhdgM="..hdgM.."\ vs="..vs.."\nias="..ias.."\ntas="..tas.."\ngs="..gs.."\nmach="..mach.."\nPanelID="..panelsel) will fail because you cannot concatenate a nil value! As your program currently stands, if you did the "if" statement correctly, the only time panelset will have a value is when panelid == 3. When it isn't 3 your line displaying things will fail. A "default value" means a value used when none other is assigned. (This is a very common use of the owrd "default"). You could use a blank string: panelset = "" or something explicit panelset = "don't know what panel it is" but you really need to assign something to it till fill in the case when the panelid isn't one you expected. Also, why didn't just ipc.writeSW(0x66C0, 3) work to write the value of 3 to 66C0? There isn't such an instruction in the program you posted therefore it can't do it. Regards Pete
gr8guitar Posted February 7, 2014 Report Posted February 7, 2014 Okay, well I got a lot working thanks to you. I can now dial and display the panel. I went back to using your loop example as I find that easier to watch the panel selection being shown, but again, when I assign a key (or button) to luakill, it locks up FS which is why I tried the 1500 msec option. I also chose that option because if I hit the same key before the timeout of 1500 msec (or whatever I have selected, it too locks up FS. I must admit, I'm still confused as to the writing to an offset. If ipc.readSW(0x66C0) works, why doesn't ipc.writeSW(0x66C0, 3)? Again, thanks so very much. I got those LUA programs thinking they were a line editor. I too realize I could just count but I wasn't sure how lua (using Notepad.exe) counted the spaces (empty lines). I will now search for UltraEdit.
Pete Dowson Posted February 7, 2014 Report Posted February 7, 2014 Okay, well I got a lot working thanks to you. I can now dial and display the panel. I went back to using your loop example as I find that easier to watch the panel selection being shown, but again, when I assign a key (or button) to luakill, it locks up FS which is why I tried the 1500 msec option. I also chose that option because if I hit the same key before the timeout of 1500 msec (or whatever I have selected, it too locks up FS. What specific version of FSUIPC are you using? Lockups caused by Lua programs should be a very very rare occurrence in any recent version. Perhpas you'd better show me your finished program and tell me how to make it lock up FS so I can see why! I must admit, I'm still confused as to the writing to an offset. If ipc.readSW(0x66C0) works, why doesn't ipc.writeSW(0x66C0, 3)? You don't have any "ipc.write" in your program, or at least the part you showed me. That's why it doesn't work! I told you this already! Functions will only do things if you use them!!!!! Pete
gr8guitar Posted February 7, 2014 Report Posted February 7, 2014 Actually I do, perhaps I didn't make it clear, or I still don't understand. In the WriteOffset.lua, I have the code: ipcwriteSW(0x66C0, 3). Also, how come the luakill ****** locks up FS? To give you an idea of what I do understand, below is the code I have that I can actually use. It's nice because of the different aircraft I fly, I don't have to remember panel order, etc. I noticed that ipc.display(etc.) doesn't require anything else, so that is why I am thinking ipcWriteSW(etc.) shouldn't require extra code since they are "outputting". -- Loop forever: to stop this you'll have to use the LuaKill control on it.while 1 do -- getting CC60panelid = ipc.readSW(0x66C0) if panelid == 0 thenpanelsel = "No Panel"elseif panelid == 1 thenpanelsel = "Main G1000"elseif panelid == 2 thenpanelsel = "Radio"elseif panelid == 3 thenpanelsel = "PFD"elseif panelid == 4 thenpanelsel = "MFD"elseif panelid == 5 thenpanelsel = "GNS430"elseif panelid == 6 thenpanelsel = "GNS530"elseif panelid == 7 thenpanelsel = "Pushback" end ipc.display("Panel: "..panelsel) -- Sleep for 250 mSecs so the update gets done roughly 4 times per secondipc.sleep(250) end Also, I looked into the Lua Library.pdf and I really did not and do not understand the syntax of lua. Where do I find info for that? For example, you have in the display vals.lua : ipc.display("lat="..lat.."\nlon="..lon.."\nalt="..alt.."\npitch="..pitch.."\bank="..bank.."\nhdgT="..hdgT.."\nhdgM="..hdgM.."\vs="..vs.."\nias="..ias.."\ntas="..tas.."\ngs="..gs.."\nmach="..mach) -- Note the use of the \ escape to allow us to use multiple lines in a single string-- The \n and the \ followed by a real new line both get included as new lines in the result I hate to admit, I didn't see the logic. What are the .. for, and how come ..mach didn't have an ending ..? I noticed that the line starting with bank= and vs= didn't need an "n". I tried to separate the info between the " " to understand but then again, why didn't mach have mach.."? It seems logical to me that the quotes should be like the first parameter of "lat="..lat.. but then the next is: "\nlon=" but to me, seems like it should be n\"lon=".The \n control is combined with the text of lon=". The reason this came up was because I tried to add 66C1 (the logic works fine in FSUIPC.ini) and display both panelsel and gaugesel and now only the gaugesel shows info. correctly. Iin my lua: ipc.display("Panel: "..panelsel.."\nGauge: "..gaugesel). The panelsel only shows when 66C0 = 0 or 4. I will hestitantly admit, most of my frustrations is getting the syntax correct <sigh>...
Pete Dowson Posted February 8, 2014 Report Posted February 8, 2014 Actually I do, perhaps I didn't make it clear, or I still don't understand. In the WriteOffset.lua, I have the code: ipcwriteSW(0x66C0, 3). You've not shown me any "WriteOffset.lua, so I cannot comment, can I? And the code ipcwriteSW(0x66C0, 3) will fail because there's no library called "ipcwriteSW", you've missed the . out. I'm sorry, I know you are feeling your way, but it's no use asking me why something I've not seen or known about doesn't work. If you want help you have to be more helpful, and read what I say when I said your code, the code you showed me, doesn't contain that instruction. Also, how come the luakill ****** locks up FS? To give you an idea of what I do understand, below is the code I have that I can actually use. Because it is a last resort. Basically it tells Windows to forcibly terminate the thread, no matter what it is doing nor what the consequences. Unfortunately, this can cause what is known as a "deadly embrace", which is where two inter-dependent threads are running and one gets killed whilst the other is still waiting for something. I spent a lot of time over the last few years gradually nailing down and fixing these, but it isn't perfect and probably never will be. I'd like to find out why you can lock it up so readily as it normally is very rare these days. That's why I asked you, a few messages ago, for the code which does it, and what you do to lock it. I also asked you specifically for the exact version of FSUIPC, which also matters. You've totlally ignored both these requests and instead just ask me again why it locks up. Don't you think this is unreasonable? Why don't you want to help me help you? There is a MUCH better way to run a program like yours, and that's to use a timer event, not an infinite loop which can only exit by usding Kill. When we've sorted your other things out we'll discuss tat if you like, but you'll find examples of events being used among those provided. I noticed that ipc.display(etc.) doesn't require anything else, so that is why I am thinking ipcWriteSW(etc.) shouldn't require extra code since they are "outputting". Apart from getting that ipcWriteSW wrong yet again, I have no idea what this sentence is there for. What is it supposed to mean? Also, I looked into the Lua Library.pdf and I really did not and do not understand the syntax of lua. Where do I find info for that? Oh dear. Do you not read any of my replies here? I am evidently wasting my time. I told you where to get that information in message #10. Go look. I'm not going to keep repeating myself. It gets irksome! :sad: What are the .. for That's the Lua symbol for concatenation, to join things together to make one string of characters. and how come ..mach didn't have an ending ..? Because there's nothing following it to be concatenated. If you add 1 and 2 you don't write 1 + 2 + do you? I noticed that the line starting with bank= and vs= didn't need an "n". Because the real line before ends in \ which makes the real new line code a part of the string. And it isn't just an 'n', it's \n which means 'new line'. The rest of your confusion follows on from this. I suggest you either forget Lua programming altogether or refer to the sources I pointed you to. Pete
gr8guitar Posted February 8, 2014 Report Posted February 8, 2014 Well,I will try to be clearer. I am using FSUIPC 3.999z8. I had downloaded 3.999z9 but it shows it to be 3.999z8. In the WriteOffset.lua, I have the code: ipcwriteSW(0x66C0, 3). In other words, in the code saved as WriteOffset.lua, I have one line of code: ipcwriteSW(0x66C0,3). My goal is to send 3 to offset 66C0 as a test. SInce ipc.readSW(0x66C0) works in retrieving the wanted information, I think it's logical to assume to use ipc.writeSW(0x66C0, 3) to send 3 to 66C0. In the code saved as 172G1000.lua, that works, in part I have: -- sleep for 1.5 sec.ipc.sleep(1500) --- Delay for a number of seconds.-- @param delay Number of secondsfunction delay_s(delay) delay = delay or 5 local time_to = os.time() + delay while os.time() < time_to do end I mentioned it was convoluted but it works well to display for a set time, I am happy with this but I also did come to like the endless loop as I prefer to keep the window open as I cycle through offset 66C0, and trying to add 66C1. The reason I want to add 66C1 is now I want to be able to cycle the PA, Attitude bar and Kohlsman in the aux panel. It works just fine in FSUIPC.ini. The goal is now to display in Lua. As far as the lockup, it occurs anytime I assign a key to luakill on any of the lua scripts. But again, it is now a non-issue because I can either use the time delay, which works and I like the endless loop while FS is running. Now back to the ... I appreciate the explanation. I did miss the lua.org reference so I will delve into that (http://lua-users.org/wiki/StringsTutorial).
Pete Dowson Posted February 8, 2014 Report Posted February 8, 2014 Well,I will try to be clearer. I am using FSUIPC 3.999z8. Ah, you are using FS9? Phew. I would recommend avoiding using Lua Kill. If you want to be able to stop your Lua program just have it test a button or something to see if it should terminate - maybe LuaValue and check in your loop for the parameter. I really can't do anything more with FSUIPC3, it is frozen. After continuous changes for the last 11 years just for FS9 I've had to stop messing with it. I'd hoped FS9 would be long dead by now! I have the code: ipcwriteSW(0x66C0, 3). In other words, in the code saved as WriteOffset.lua, I have one line of code: ipcwriteSW(0x66C0,3). My goal is to send 3 to offset 66C0 as a test. SInce ipc.readSW(0x66C0) works in retrieving the wanted information, I think it's logical to assume to use ipc.writeSW(0x66C0, 3) to send 3 to 66C0. Correct, except you keep telling me the code is "ipcwriteSW(0x66C0,3)" which is an error, as I've already told you! I shouldn't need to keep repeating myself. And you've NEVER shown me this "WriteOffset.lua" nor told me how it is executed, so I've absolutely no information whatsoever! As I keep tel;ling you, you need to help me help you, and you are not doing so, at all. The ipc.write when written correctly will work, but you keep writing it incorrectly. -- sleep for 1.5 sec. ipc.sleep(1500) --- Delay for a number of seconds. -- @param delay Number of seconds function delay_s(delay) delay = delay or 5 local time_to = os.time() + delay while os.time() < time_to do end What is that piece of code for? Why is it suddenly inserted without any explanation into your message? What calls function 'delay_s"? It is a VERY BAD idea to do a tight loop like that waiting for something to change without including a "sleep", because you are hofgging the processor and allowing nothing else to run! NEVER have a potentially long loop without some release like "ipc.sleep". If you just want a delay, just use sleep so that other things can be running. I also did come to like the endless loop as I prefer to keep the window open Use event.timer to run your code at your 4 times a second or whatever you need (though that seems rather excessive to me).. It will be MUCH MUCH better than doing an endless while loop, and you need no included "sleep" then. The program still owns the window whilst it is suspended awaiting an event, so you need not worry about the window flickering or something. The examples in the Lua package still using while loops without end need rewriting really -- they all date from a time long before the event library was added. Always use events instead. I'll get around to updating the examples one day. Pete
gr8guitar Posted February 8, 2014 Report Posted February 8, 2014 ugh, and lol. I tried to tell you several times, the only code in WriteOffset.lua is: ipc.WriteSW(0x66C0, 3), that's it. When I hit the [w] key (assigned to WriteOffset.lua), I wanted to send "3" to offset 66C0. Anyway, It doesn't matter now until I figure how to do it correctly. Yeah, I know FS9 is dead for most but I use it due to monetary, thus processor limitations. I have FSX but it's not efficient for my computer. Also, I've spent some money and a lot of time with hardware, aircraft and gauges for FS9. It has become ad hoc through the years as I've added "stuff." Just changing computers has been so time-consuming. If yo're not going to support FSUIPC 3, then just let me know and I'll go forward. My new issue is, all of a sudden, when the 172G1000.lua was working, now it'll only display when 66C0 is "0" or "4" and not the in-between values - even after re-booting - ugh! I'll be delving into the lua. So far what I've seen, i see no references to ipc with lua (other than docs supplied with FSUIPC). Where would I go for that? Thanks for your time and information. It is appreciated.
Pete Dowson Posted February 8, 2014 Report Posted February 8, 2014 ugh, and lol. I tried to tell you several times, the only code in WriteOffset.lua is: ipc.WriteSW(0x66C0, 3), that's it. When I hit the [w] key (assigned to WriteOffset.lua), No, you kept saying, over and over, the code is ipcWriteSW(0x66C0,3), which is an error. Can you not see the difference? I have pointed it out several times! And in fact ipc.WriteSW(0x66C0,3) is also an error. Just check the log, it shows the errors. The correct syntax is ipc.writeSW(0x66C0,3) I understand you are not a programmer, so you need to start learning one crucial thing. Computers are stupid. they do not interpret what you tell them in the way you would, they need absolutely everything, every little character, to be completely correct. Check EVERY character! Just enable Lua logging and Button logging in FSUIPC to see what is happening. Show me the log if you don't understand it. If you're not going to support FSUIPC 3, then just let me know and I'll go forward. i ddn't say that. I said I'm not doing any more changes to FSUIPC3. This was in relation to improving it's resilience to "Lua Kill", which I recommended in any case you do not use. I also recommended that you change to using event.timer. If I wasn't supporting FSUIPC I wouldn't be talking to you by now! My new issue is, all of a sudden, when the 172G1000.lua was working, now it'll only display when 66C0 is "0" or "4" and not the in-between values - even after re-booting - ugh! Use Lua logging/tracing to see what is going on -- see the Logging tab. You seem not to be using the facilities made available to you for debugging things! Please do more to look after yoursdelf! I seem to have to nurse you through every silly little thing. It isn't as if I've got nothing else to do with my time! So far what I've seen, i see no references to ipc with lua. Where would I go for that? Sorry, I don't understand that question. If you mean "why isn't the FSUIPC library "ipc" documented by the Lua folks" -- why would they document private libraries such as all those provided in FSUIPC? There must be thousands of applications using Lua, with perhaps millions of private libraries. The FSUIPC added libraries are documented in the Lua documents I provide. It seems you've never even bothered to read them? There's only two, for Pete's sake and they aren't that long! :sad: Pete
gr8guitar Posted February 10, 2014 Report Posted February 10, 2014 I realize I could be dubugging but no changes were made and then it stopped working correctly. I'll either delve into it or not and just move on. This will be the last time I deal with you. You get angry when you shouldn't. I know you don't want to spoon feed as you would probably being doing that for everyone but once in awhile you could and should show someone the actual code to get them jumpstarted. I obviously have read the material but it wasn't clear (at least to me) and I have tried many of the lua examples, and they don't all work!!! ie, mrudder.lua. In addition, you've either written the lua and FSUIPC so what may seem obvious to you, that's why you charge (FSUIPC, and should), but it may not be obvious to the rest of us, thus it's why we ask for help!!! Think about it. Why have the forum at all if there were'nt problems to be solved? And since you're not going to support FSUIPC for FS9, then I too have no further use for you. Have a nice day.
Pete Dowson Posted February 10, 2014 Report Posted February 10, 2014 I realize I could be dubugging but no changes were made and then it stopped working correctly. I'll either delve into it or not and just move on. This will be the last time I deal with you. You get angry when you shouldn't. It isn't anger, but frustration. If you read through it all you see I do everything I can to help, but so often you simply do not read what I write. You'd get frustrated I'm sure if I didn't read what you write. Think about it. once in awhile you could and should show someone the actual code to get them jumpstarted I have done this, or at least examples related to the person's intentions, numerous times. but you never asked and never seemed like getting stuck. I also never understood what the **** you were trying to do, nor any reason for it. One of the frustrations was that it took a lost of exchanges to get you even to show me what you'd done or to explain where your erroneous "ipcwriteSW" was being executed. As I kept saying, you have to help me help you! And since you're not going to support FSUIPC for FS9, There again, you so obviously don't read what I write! Please refer back and see that just is NOT true! And you wonder why I get so frustrated? Good bye. Pete
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now