Re: [beagleboard] Re: Counting events

2014-02-24 Thread Dorian Levy
Thanks a lot Hussam!

I could not get it working using the /sys/class/gpio/gpioxx/edge. Maybe
/sys/class/gpioxx/value would work? But by modifying the sample device tree
overlay from www.hipstercircuits.com and /dev/input/event1. I was able to
get it going using the following code.

#include stdio.h
#include stddef.h
#include time.h
#include iostream
#include fcntl.h
#include unistd.h
#include sys/types.h
#include string.h
#include termios.h
#include signal.h
#include stdlib.h
using namespace std;


volatile int counter = 0;

void IRQHandler(int sig){

counter ++;
cout  counter;

}


int main(void){
struct sigaction saio;
int fd1;
fd1 = open(/dev/input/event1, O_RDWR|O_NONBLOCK);
saio.sa_handler = IRQHandler;
//saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,saio,NULL);
fcntl(fd1, F_SETOWN, getpid());
fcntl(fd1, F_SETFL, FASYNC);
while(1){

}

}




On Sun, Feb 23, 2014 at 8:57 PM, Hussam Hertani halhe...@gmail.com wrote:

 Dorian, here's a little example. First open the file and get a file
 descriptor, then use FCNTL with SETOWN command to send SIGIO to current
 process. Use fcntl to set the FASYNC flag  then populate the signal
 structure. This code was not tested but hopefully should give you an idea
 as to what to do...


 int counter = 0;

 int main(){
 struct sigaction saio;
 int fd ;
 fd = open(/sys/class/blahblah/edge,O_RDWR | O_NONBLOCK); // open file
 descriptor for the edge

 /* install the signal handler before making the device asynchronous */
 saio.sa_handler = signal_handler_IO;
 saio.sa_mask = 0;
 saio.sa_flags = 0;
 saio.sa_restorer = NULL;
  sigaction(SIGIO,saio,NULL);

 /* allow the process to receive SIGIO */
  fcntl(fd, F_SETOWN, getpid());
 /* Make the file descriptor asynchronous (the manual page says only
  O_APPEND and O_NONBLOCK, will work with F_SETFL...) */
 fcntl(fd, F_SETFL, FASYNC);


 }

 void signal_handler_IO (int status)
 {
 counter++;
 }

 Linux purists generally don't like  using signals,,,too many can cause
 many conflicts/race conditions that are hard to debug.
 http://ajaxxx.livejournal.com/62378.html

 most of the above code was taken from this link that has code for SIGIO
 asynchronous serial port access:
 http://www.tldp.org/HOWTO/pdf/Serial-Programming-HOWTO.pdf

 For more on signals in general
 http://beej.us/guide/bgipc/
 http://ph7spot.com/musings/introduction-to-unix-signals-and-system-calls
 http://www.linuxprogrammingblog.com/all-about-linux-signals?page=1

 For more on fcntl:
 http://linux.die.net/man/2/fcntl

 There's also real-time signals. I haven't heard of those before  today.
 But they seem to have less race conditions issues. I'll have to read up on
 them. Unfortunately My Linux Signal Programming fu is very limited. I
 recommend that you get yourself a good text reference on Linux System
 Programming as well. It will help.

 Regards,
 Hussam


 On Sun, Feb 23, 2014 at 7:35 PM, Dorian Levy dorianal...@gmail.comwrote:

 Something like SIGIO is what I was trying to do. I was
 trying signal(SIGINT, IRQHandler), but something is not
 right. How do I attach it, and why do Linux enthusiasts not recommend this?



 On Sun, Feb 23, 2014 at 1:40 PM, halhe...@gmail.com wrote:

 Dorian,

 I haven't tried any of these myself but I see no reason why they
 shouldn't work.

- you could use a fork to create a child process. In this child
process use the poll()/select() calls to detect a change in the edge 
 file.
When this happens a variable could be incremented  and piped back to the
parent process.
- You could use threads...i.e. a thread calls poll()/select() to
detect a change in the edge file and then updates a counts
variables.with threads all threads share the variables so this will 
 be
easier. but could be more convoluted.
- You could try monitoring the edge file with GDK/GTK libs
monitoring I/O calls
https://developer.gnome.org/gtk-tutorial/2.90/x1770.html. Qt has a
QIODevice class that does the same thing.
- You could also attach the SIGIO signal to the file descriptor for
the edge file and write a signal handler that increments a
variable...though Linux purists do not recommend this

 Hussam



 On Saturday, February 22, 2014 1:41:02 PM UTC-5, Dorian Levy wrote:

 I want to use a hall effect motor encoder to determine the number of
 revolutions of a wheel. Using the BB-KEYS I am able to set
 up /dev/inputs/event1 that captures the event and records the number of
 interrupts in /proc/interrupts. I believe setting
 /sys/class/gpio/gpioxx/edge will do pretty much the same. I haven't been
 able to figure out how to count them in a C/C++ code. Is it bes to set up
 an interrupt and count or try to read the /proc/interrupt file? Polling is
 not an option because there are two wheel that need to be counted. I would
 prefer to have and ISR that counts each time it is triggered, but I have
 not been able to figure out how to set it up. Any 

[beagleboard] Re: Counting events

2014-02-23 Thread Carl-Fredrik Sundström
I need to do something similar counting pulses generated by a hall effect 
sensor in a flow meter.
Haven't started looking at it yet, if you solve this please post back to 
the thread.

On Saturday, February 22, 2014 12:41:02 PM UTC-6, Dorian Levy wrote:

 I want to use a hall effect motor encoder to determine the number of 
 revolutions of a wheel. Using the BB-KEYS I am able to set 
 up /dev/inputs/event1 that captures the event and records the number of 
 interrupts in /proc/interrupts. I believe setting 
 /sys/class/gpio/gpioxx/edge will do pretty much the same. I haven't been 
 able to figure out how to count them in a C/C++ code. Is it bes to set up 
 an interrupt and count or try to read the /proc/interrupt file? Polling is 
 not an option because there are two wheel that need to be counted. I would 
 prefer to have and ISR that counts each time it is triggered, but I have 
 not been able to figure out how to set it up. Any help would be greatly 
 appreciated since I have spent the last few days trying to research this 
 without much luck. 

 Thanks,
 Dorian 


-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
BeagleBoard group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Re: [beagleboard] Re: Counting events

2014-02-23 Thread Dorian Levy
Something like SIGIO is what I was trying to do. I was
trying signal(SIGINT, IRQHandler), but something is not
right. How do I attach it, and why do Linux enthusiasts not recommend this?



On Sun, Feb 23, 2014 at 1:40 PM, halhe...@gmail.com wrote:

 Dorian,

 I haven't tried any of these myself but I see no reason why they shouldn't
 work.

- you could use a fork to create a child process. In this child
process use the poll()/select() calls to detect a change in the edge file.
When this happens a variable could be incremented  and piped back to the
parent process.
- You could use threads...i.e. a thread calls poll()/select() to
detect a change in the edge file and then updates a counts
variables.with threads all threads share the variables so this will be
easier. but could be more convoluted.
- You could try monitoring the edge file with GDK/GTK libs monitoring
I/O calls https://developer.gnome.org/gtk-tutorial/2.90/x1770.html. Qt
has a QIODevice class that does the same thing.
- You could also attach the SIGIO signal to the file descriptor for
the edge file and write a signal handler that increments a
variable...though Linux purists do not recommend this

 Hussam



 On Saturday, February 22, 2014 1:41:02 PM UTC-5, Dorian Levy wrote:

 I want to use a hall effect motor encoder to determine the number of
 revolutions of a wheel. Using the BB-KEYS I am able to set
 up /dev/inputs/event1 that captures the event and records the number of
 interrupts in /proc/interrupts. I believe setting
 /sys/class/gpio/gpioxx/edge will do pretty much the same. I haven't been
 able to figure out how to count them in a C/C++ code. Is it bes to set up
 an interrupt and count or try to read the /proc/interrupt file? Polling is
 not an option because there are two wheel that need to be counted. I would
 prefer to have and ISR that counts each time it is triggered, but I have
 not been able to figure out how to set it up. Any help would be greatly
 appreciated since I have spent the last few days trying to research this
 without much luck.

 Thanks,
 Dorian

  --
 For more options, visit http://beagleboard.org/discuss
 ---
 You received this message because you are subscribed to a topic in the
 Google Groups BeagleBoard group.
 To unsubscribe from this topic, visit
 https://groups.google.com/d/topic/beagleboard/RhSCj3GgAj8/unsubscribe.
 To unsubscribe from this group and all its topics, send an email to
 beagleboard+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/groups/opt_out.


-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
BeagleBoard group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Re: [beagleboard] Re: Counting events

2014-02-23 Thread Hussam Hertani
Dorian, here's a little example. First open the file and get a file
descriptor, then use FCNTL with SETOWN command to send SIGIO to current
process. Use fcntl to set the FASYNC flag  then populate the signal
structure. This code was not tested but hopefully should give you an idea
as to what to do...


int counter = 0;

int main(){
struct sigaction saio;
int fd ;
fd = open(/sys/class/blahblah/edge,O_RDWR | O_NONBLOCK); // open file
descriptor for the edge

/* install the signal handler before making the device asynchronous */
saio.sa_handler = signal_handler_IO;
saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,saio,NULL);

/* allow the process to receive SIGIO */
fcntl(fd, F_SETOWN, getpid());
/* Make the file descriptor asynchronous (the manual page says only
O_APPEND and O_NONBLOCK, will work with F_SETFL...) */
fcntl(fd, F_SETFL, FASYNC);


}

void signal_handler_IO (int status)
{
counter++;
}

Linux purists generally don't like  using signals,,,too many can cause many
conflicts/race conditions that are hard to debug.
http://ajaxxx.livejournal.com/62378.html

most of the above code was taken from this link that has code for SIGIO
asynchronous serial port access:
http://www.tldp.org/HOWTO/pdf/Serial-Programming-HOWTO.pdf

For more on signals in general
http://beej.us/guide/bgipc/
http://ph7spot.com/musings/introduction-to-unix-signals-and-system-calls
http://www.linuxprogrammingblog.com/all-about-linux-signals?page=1

For more on fcntl:
http://linux.die.net/man/2/fcntl

There's also real-time signals. I haven't heard of those before  today. But
they seem to have less race conditions issues. I'll have to read up on
them. Unfortunately My Linux Signal Programming fu is very limited. I
recommend that you get yourself a good text reference on Linux System
Programming as well. It will help.

Regards,
Hussam


On Sun, Feb 23, 2014 at 7:35 PM, Dorian Levy dorianal...@gmail.com wrote:

 Something like SIGIO is what I was trying to do. I was
 trying signal(SIGINT, IRQHandler), but something is not
 right. How do I attach it, and why do Linux enthusiasts not recommend this?



 On Sun, Feb 23, 2014 at 1:40 PM, halhe...@gmail.com wrote:

 Dorian,

 I haven't tried any of these myself but I see no reason why they
 shouldn't work.

- you could use a fork to create a child process. In this child
process use the poll()/select() calls to detect a change in the edge file.
When this happens a variable could be incremented  and piped back to the
parent process.
- You could use threads...i.e. a thread calls poll()/select() to
detect a change in the edge file and then updates a counts
variables.with threads all threads share the variables so this will be
easier. but could be more convoluted.
- You could try monitoring the edge file with GDK/GTK libs monitoring
I/O calls https://developer.gnome.org/gtk-tutorial/2.90/x1770.html.
Qt has a QIODevice class that does the same thing.
- You could also attach the SIGIO signal to the file descriptor for
the edge file and write a signal handler that increments a
variable...though Linux purists do not recommend this

 Hussam



 On Saturday, February 22, 2014 1:41:02 PM UTC-5, Dorian Levy wrote:

 I want to use a hall effect motor encoder to determine the number of
 revolutions of a wheel. Using the BB-KEYS I am able to set
 up /dev/inputs/event1 that captures the event and records the number of
 interrupts in /proc/interrupts. I believe setting
 /sys/class/gpio/gpioxx/edge will do pretty much the same. I haven't been
 able to figure out how to count them in a C/C++ code. Is it bes to set up
 an interrupt and count or try to read the /proc/interrupt file? Polling is
 not an option because there are two wheel that need to be counted. I would
 prefer to have and ISR that counts each time it is triggered, but I have
 not been able to figure out how to set it up. Any help would be greatly
 appreciated since I have spent the last few days trying to research this
 without much luck.

 Thanks,
 Dorian

  --
 For more options, visit http://beagleboard.org/discuss
 ---
 You received this message because you are subscribed to a topic in the
 Google Groups BeagleBoard group.
 To unsubscribe from this topic, visit
 https://groups.google.com/d/topic/beagleboard/RhSCj3GgAj8/unsubscribe.
 To unsubscribe from this group and all its topics, send an email to
 beagleboard+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/groups/opt_out.


  --
 For more options, visit http://beagleboard.org/discuss
 ---
 You received this message because you are subscribed to a topic in the
 Google Groups BeagleBoard group.
 To unsubscribe from this topic, visit
 https://groups.google.com/d/topic/beagleboard/RhSCj3GgAj8/unsubscribe.
 To unsubscribe from this group and all its topics, send an email to
 beagleboard+unsubscr...@googlegroups.com.
 For more options, visit