I actually have worked on a very similar project to yours (in fact it's pretty much the same... I'm working on a guide, it should be published soon), since you have already managed to pair, connect and map the buttons of the controller when using evtest, you only need to interpret the signals the evtest script sends you and turn them into a blinking led, a moving servo, etc. For this, you will have to understand how evtest works so you can find which variable is the one that contains this information so you can use it on your project. This will depend on the version of evtest that you are using since newer versions of this software are different than earlier ones and if you are using a different version than mine, I may confuse you.
On version 1.23 of evtest you should look for names[ev[i].type][ev[i].code] and ev[i].value, they contain the signal name and the signal value respectively. If you add mraa to the evtest code, you will be able to take this data and turn it into something that can be interpret by the board. For example I made my Edison turn its on board led on when the X signal was pressed and to turn it off when it was released. I hope this information helps.
The guide I mentioned above can be found in http://www.intel.com/content/www/us/en/support/boards-and-kits/intel-edison-boards/000020389.html. Try it and let me know if you run into any issue, I'll gladly help you if that's the case.
I suggest you to create a system service that helps you with that task. I have also written a document on how to create a system service. You can find it in https://communities.intel.com/docs/DOC-111103.
Let me know if this helps you.
In /home/root/ I have the evtest program that I manually compiled with gcc evtestDS4.c -o evtestDS4 –lmraa. If I send the command ./evtest /dev/input/event2 after the ds4 is connected it works, led is on when btn X is pressed.
I created the runevtest.service:
Enabled it with systemctl and after reboot and ds4 connected I get this:
root@Edison:~# systemctl status runevtest -l
● runevtest.service - runevtest
Loaded: loaded (/lib/systemd/system/runevtest.service; enabled)
Active: active (exited) (Result: exit-code) since Fri 2016-08-26 09:14:40 UTC; 2min 23s ago
Process: 258 ExecStart=/home/root/evtest /dev/input/event2 (code=exited, status=1/FAILURE)
Main PID: 258 (code=exited, status=1/FAILURE)
Aug 26 09:14:40 Edison systemd: Started runevtest.
Aug 26 09:14:40 Edison libmraa: libmraa version v1.2.3 initialised by user 'root' with EUID 0
Aug 26 09:14:40 Edison libmraa: edison: Arduino board detected
Aug 26 09:14:40 Edison libmraa: libmraa initialised for platform 'Intel Edison' of type 2
Aug 26 09:14:40 Edison evtest: evtest: No such file or directory
Aug 26 09:14:40 Edison systemd: runevtest.service: main process exited, code=exited, status=1/FAILURE
Any idea where is the problem?
I believe the reason why this is happening is because you are setting evtest to start to run on boot but at that time event2 doesn't exist as the DS4 hasn't been connected yet, therefore it will not be able to run evtest correctly. You should add to your service a part where it waits until the DS4 is connected.
Also, I can see that you are starting evtest directly from the service but you could use it to start a shell script that includes both the part where Edison waits for the DS4 and the part where it starts evtest.
I hope this information helps.
I am aware that evtest is not starting because event2 doesn't exist until connection with ds4 but I assumed that the service will start all over again until connection.
"You should add to your service a part where it waits until the DS4 is connected." - I really don't know how to do this, I know that is the key - wait for connection and start the evtest after- but I don't know how to put that in a script. I searched internet but all I found is how to connect and now Edison is doing this automatically.
Can you please help with the "waiting for connection" part?
I suggest you to use a script similar to the following in order to wait until /event2/ is created:
#!/bin/bash x=0 a=$(find /dev/input/ -maxdepth 1 -type d -print| wc -l) while [ $x = 0] do if [ "$a" = "3" ] then echo "done" #do bluetooth stuff x=$(( $x + 1 )) else echo "sleep" sleep 5 a=$(find /dev/input/ -maxdepth 1 -type d -print| wc -l) fi done
I hope this helps you.
I'm still trying to understand all those commands so I can make the script, as I said I'm a newbie in programming and I try to understand everything with logic; meanwhile my job is taking a lot of my time so the advance is slow... there are a lot of commands and a lot to read about them so it will take a while.
Anyway thanks for help and when I'll have the script I'll post it and we'll see if it will do the job or if it will need modifications.