crashdog Posted July 30, 2010 Report Posted July 30, 2010 Hi, I am trying to under stand the n = ipc.buttons methode. I understand that n contains a U32 bit mask but how do I compare the bits with the logic methodes ? What I don't understand is for example in logic.And(y,z) what's y and what's z. Ok they are U32 bit's but how are they represented in the methode as binary or a value ? I tried this which doesn't work (joystick is #4) -- "push_rot.lua" by Gerhard Gubler July, 2010 while 1 do n = ipc.buttons(4) if logic.And(00000000000000000000000000000001,n) then ipc.macro("Aaamad: Heading-push") dis = "pushed 0" ipc.display(dis) end if logic.And(00000000000000000000000000000100,n) then ipc.macro("Aaamad: Auto-head-min") dis = "pushed 2" ipc.display(dis) end if logic.And(00000000000000000000000000001000,n) then ipc.macro("Aaamad: Auto-head-plus") dis = "pushed 3" ipc.display(dis) end ipc.sleep(100) end any help appreciated. Gery
Pete Dowson Posted July 31, 2010 Report Posted July 31, 2010 I am trying to under stand the n = ipc.buttons methode. I understand that n contains a U32 bit mask but how do I compare the bits with the logic methodes ? What I don't understand is for example in logic.And(y,z) what's y and what's z. If you don't understand the concept of "bits" in computers, why not just stick to using the ipc.testbutton function? y and z are two values -- numbers or variables containing numbers. "And" is a logical operation which gives a 1 bit in the result where both numbers have 1's, and a 0 otherwise. Please use Wiki to find out more about computers, bits and logic. Or refer to my article "About bits, numbers and hexadecimal " in the Announcements in this Forum. Or, if all that fails, stick to using the easier functions. (But you really do need to learn a little about computers if you are going to try programming, so it would be worth an effort). if logic.And(00000000000000000000000000000001,n) then The decimal number 00000000000000000000000000000001 is exactly the same as the number 1. Why bother with all those leading zeroes? Page 1 of a book is easier known as page 1 than page 00000000000000000000000000000001, isn't it? The value 1 will represent Button 0, because 2^0 = 1 (i.e 2 to the power 0 = 1). if logic.And(00000000000000000000000000000100,n) then The decimal number 00000000000000000000000000000100 is the same as 100 (one hundred). In hexadecimal that is 0x64, which has 3 bits set, bit 2 (worth 4 = 2 squared), bit 5 (worth 32 = 2^5) and bit 6 (worth 64 = 2^6). Notice that 64 + 32 + 4 = 100. So here you are testing for buttons 2, 5 and 6 all together. if logic.And(00000000000000000000000000001000,n) then I'll let you figure that one. Suffice to say you are testing for 6 buttons there! ;-) Pete
crashdog Posted July 31, 2010 Author Report Posted July 31, 2010 If you don't understand the concept of "bits" in computers, why not just stick to using the ipc.testbutton function? You might not want to belive me now or at least think shame on you, but I am actually an software engineer. I even programm assembly for PIC's etc. I'm rather new to lua programming though and like most hight level languages it must first be lerned. I assumed the parameters in logic.And() to be a bitfield. But I guess you understand that. Offcourse using ipc.testbutton is an alternative. But one thing I don't understand with that function. As in the description it must have assigned any macro or lua function in order for fsuipc to watch it. Why ? if I want an allready running lua script to take care of the button handling it means I have to assing a dummy function doing nothing to the button in order to use the ipc.testbutton function ? That's why using ipc.buttons seamed to have less overhead. anyway i'll give it a try and thanx for the lesson. Gery
Pete Dowson Posted July 31, 2010 Report Posted July 31, 2010 I assumed the parameters in logic.And() to be a bitfield. But I guess you understand that. I don't think Lua supports Binary notation (like 0B00100...), you could check in the Lua reference manual available on the Lua website, as referenced in my Lua packaages. Even if it did it wouldn't need leading zeroes. It certainly supports decimal (no prefix) and hexadecimal (prefix 0x). The initial 0 is needed in languages to distinguish a number from a name -- names start with an alpha. Offcourse using ipc.testbutton is an alternative. But one thing I don't understand with that function. As in the description it must have assigned any macro or lua function in order for fsuipc to watch it. Why ? Sorry, I don't understand the question. What do you mean " it must have assigned any macro or lua function in order for fsuipc to watch it"? if I want an allready running lua script to take care of the button handling it means I have to assing a dummy function doing nothing to the button in order to use the ipc.testbutton function ?That's why using ipc.buttons seamed to have less overhead. Sorry, I've no idea where you are coming from with that. The only difference between testbutton() and buttons() is that testbutton reads the 32 bit button state, makes the 32 bit mask with the bit you specify, and does the AND for you. It is MORE efficient for testing a single button, not less, because all of that is done in high-speed compact compiled C whereas you doing it separately in Lua is a series of interpretations. The buttons() function is provided for those dealing with multiple button states, such as those encountered with multiway switches. Regards Pete
crashdog Posted August 1, 2010 Author Report Posted August 1, 2010 Sorry, I don't understand the question. What do you mean " it must have assigned any macro or lua function in order for fsuipc to watch it"? Tests a scanned button. ―joynum‖ is a joystick number, the same as shown in FSUIPC‘s Button assignments tab. Provided the joystick is one being scanned by FSUIPC (i.e. it has a button assignment), this function returns the state of the specified button number (0–31) as TRUE or FALSE. I unserstud this section in the lua library documentation for ipc.testbutton, that a button had to have any function assigned in order for fsuipc to scann (not watch) the buttons state. That's why I made a empty lua script and assigned it to the buttons i wanted to scann the state of. But apparently it's not really needed as I have tested in between. Basically my testbutton script works now. The only problem (not fsuipc related) is that the button on the rotary encoders I use only work on every second detent. -- "push_rot.lua" by Gerhard Gubler July, 2010 -- free to use, change and distribute at own risk. while 1 do was_pushed = 0 rotated = 0 while ipc.testbutton(4,28) do was_pushed = 1 if ipc.testbutton(4,2) and ipc.testbutton(4,28) then ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") ipc.macro("Aaamad: Auto-head-min") dis = "pushed 2 and 28" ipc.display(dis) rotated = 1 end if ipc.testbutton(4,3) and ipc.testbutton(4,28) then ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") ipc.macro("Aaamad: Auto-head-plus") dis = "pushed 3 and 28" ipc.display(dis) rotated = 1 end end if was_pushed == 1 and rotated == 0 then ipc.macro("Aaamad: Heading-push") dis = "pushed 28" ipc.display(dis) end if ipc.testbutton(4,2) then ipc.macro("Aaamad: Auto-head-min") dis = "pushed 2" ipc.display(dis) end if ipc.testbutton(4,3) then ipc.macro("Aaamad: Auto-head-plus") dis = "pushed 3" ipc.display(dis) end ipc.sleep(10) end Still needs optimisation but is generally working. The idea of this is to make buttons for the MCP where a push means activate an autopilot function and push+rotate means increas/decreas values *10. Gery
Pete Dowson Posted August 1, 2010 Report Posted August 1, 2010 I unserstud this section in the lua library documentation for ipc.testbutton, that a button had to have any function assigned in order for fsuipc to scann (not watch) the buttons state. FSUIPC only scans joysticks which it needs to scan because there are assignments made to them. The word "function" here is not a programming term, it is an FS function, something you are using the joystick for in FS. If FSUIPC is not scanning the joystick it cannot supply you with button states. And in any case the same wording is used in both the descriptions of "testbutton" and "buttons" functions, so I don't understand why you'd think one was different to the other in this regard. Basically my testbutton script works now. The only problem (not fsuipc related) is that the button on the encoders I use only work on every second detent. The encoder is using a pulse -- each 'click" either makes or breaks the contact, alternately. You will therefore see the button turning on and off alternately. If you want to act on every 'click' you need to remember the previous state and act only on a change. If you act every time you see it "pressed" (set) then if you leave the dial in an "on" position it will repetitively tell you it is set forever. You cannot treat a rotary as a momentary button like most joystick buttons. The idea of this is to make buttons for the MCP where a push means activate an autopilot function and push+rotate means increas/decreas values *10. You can of course do such things via a Lua plug-in, and it makes a good educational exercise, but I'm pretty sure it would in fact be easier and quicker to do it via normal FSUIPC assignments, even if it also meant a little bit of INI file editing for conditionals. Regards Pete
crashdog Posted August 8, 2010 Author Report Posted August 8, 2010 FSUIPC only scans joysticks which it needs to scan because there are assignments made to them It appeares to me that fsuipc also scans joysticks that had an assignment to them if removed it's still scanned. The encoder is using a pulse -- each 'click" either makes or breaks the contact, alternately. You will therefore see the button turning on and off alternately. I organized a different rotary encoder Elma E37, sold at Leo Bodmars web shop. With this model the button stays on even when rotated hench works perfectly with the lua script. You can of course do such things via a Lua plug-in, and it makes a good educational exercise, but I'm pretty sure it would in fact be easier and quicker to do it via normal FSUIPC assignments, even if it also meant a little bit of INI file editing for conditionals. Do you mean the fsuipc.ini file ? Do I find information about that in the documentation or can you give me a hint how ? so I don't understand why you'd think one was different to the other in this regard. Yes, my mistake. I undertand it now. Cheers, Gery
Pete Dowson Posted August 8, 2010 Report Posted August 8, 2010 Do you mean the fsuipc.ini file ? Do I find information about that in the documentation or can you give me a hint how ? The format of button assignments in the INI file, and ways of making them conditional (on other buttons, or on offsets) is all covered in the FSUIPC Advanced User's document, in the section on button programming. Regards 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