freq_count_1.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 #include <unistd.h>
5 
6 #include <pigpio.h>
7 
8 /*
9 2014-08-20
10 
11 gcc -o freq_count_1 freq_count_1.c -lpigpio -lpthread
12 $ sudo ./freq_count_1 4 7 8
13 
14 This program uses the gpioSetAlertFunc function to request
15 a callback (the same one) for each gpio to be monitored.
16 
17 EXAMPLES
18 
19 Monitor gpio 4 (default settings)
20 sudo ./freq_count_1 4
21 
22 Monitor gpios 4 and 8 (default settings)
23 sudo ./freq_count_1 4 8
24 
25 Monitor gpios 4 and 8, sample rate 2 microseconds
26 sudo ./freq_count_1 4 8 -s2
27 
28 Monitor gpios 7 and 8, sample rate 4 microseconds, report every second
29 sudo ./freq_count_1 7 8 -s4 -r10
30 
31 Monitor gpios 4,7, 8, 9, 10, 23 24, report five times a second
32 sudo ./freq_count_1 4 7 8 9 10 23 24 -r2
33 
34 Monitor gpios 4, 7, 8, and 9, report once a second, sample rate 1us,
35 generate 2us edges (4us square wave, 250000 highs per second).
36 sudo ./freq_count_1 4 7 8 9 -r 10 -s 1 -p 2
37 */
38 
39 #define MAX_GPIOS 32
40 
41 #define OPT_P_MIN 1
42 #define OPT_P_MAX 1000
43 #define OPT_P_DEF 20
44 
45 #define OPT_R_MIN 1
46 #define OPT_R_MAX 10
47 #define OPT_R_DEF 5
48 
49 #define OPT_S_MIN 1
50 #define OPT_S_MAX 10
51 #define OPT_S_DEF 5
52 
53 static volatile int g_pulse_count[MAX_GPIOS];
54 static volatile int g_reset_counts;
55 static uint32_t g_mask;
56 
57 static int g_num_gpios;
58 static int g_gpio[MAX_GPIOS];
59 
60 static int g_opt_p = OPT_P_DEF;
61 static int g_opt_r = OPT_R_DEF;
62 static int g_opt_s = OPT_S_DEF;
63 static int g_opt_t = 0;
64 
65 void usage()
66 {
67  fprintf
68  (stderr,
69  "\n" \
70  "Usage: sudo ./freq_count_1 gpio ... [OPTION] ...\n" \
71  " -p value, sets pulses every p micros, %d-%d, TESTING only\n" \
72  " -r value, sets refresh period in deciseconds, %d-%d, default %d\n" \
73  " -s value, sets sampling rate in micros, %d-%d, default %d\n" \
74  "\nEXAMPLE\n" \
75  "sudo ./freq_count_1 4 7 -r2 -s2\n" \
76  "Monitor gpios 4 and 7. Refresh every 0.2 seconds. Sample rate 2 micros.\n" \
77  "\n",
81  );
82 }
83 
84 void fatal(int show_usage, char *fmt, ...)
85 {
86  char buf[128];
87  va_list ap;
88 
89  va_start(ap, fmt);
90  vsnprintf(buf, sizeof(buf), fmt, ap);
91  va_end(ap);
92 
93  fprintf(stderr, "%s\n", buf);
94 
95  if (show_usage) usage();
96 
97  fflush(stderr);
98 
99  exit(EXIT_FAILURE);
100 }
101 
102 static int initOpts(int argc, char *argv[])
103 {
104  int i, opt;
105 
106  while ((opt = getopt(argc, argv, "p:r:s:")) != -1)
107  {
108  i = -1;
109 
110  switch (opt)
111  {
112  case 'p':
113  i = atoi(optarg);
114  if ((i >= OPT_P_MIN) && (i <= OPT_P_MAX))
115  g_opt_p = i;
116  else fatal(1, "invalid -p option (%d)", i);
117  g_opt_t = 1;
118  break;
119 
120  case 'r':
121  i = atoi(optarg);
122  if ((i >= OPT_R_MIN) && (i <= OPT_R_MAX))
123  g_opt_r = i;
124  else fatal(1, "invalid -r option (%d)", i);
125  break;
126 
127  case 's':
128  i = atoi(optarg);
129  if ((i >= OPT_S_MIN) && (i <= OPT_S_MAX))
130  g_opt_s = i;
131  else fatal(1, "invalid -s option (%d)", i);
132  break;
133 
134  default: /* '?' */
135  usage();
136  exit(-1);
137  }
138  }
139  return optind;
140 }
141 
142 void edges(int gpio, int level, uint32_t tick)
143 {
144  int g;
145 
146  if (g_reset_counts)
147  {
148  g_reset_counts = 0;
149  for (g=0; g<MAX_GPIOS; g++) g_pulse_count[g] = 0;
150  }
151 
152  /* only record low to high edges */
153  if (level == 1) g_pulse_count[gpio]++;
154 }
155 
156 int main(int argc, char *argv[])
157 {
158  int i, rest, g, wave_id, mode;
159  gpioPulse_t pulse[2];
160  int count[MAX_GPIOS];
161 
162  /* command line parameters */
163 
164  rest = initOpts(argc, argv);
165 
166  /* get the gpios to monitor */
167 
168  g_num_gpios = 0;
169 
170  for (i=rest; i<argc; i++)
171  {
172  g = atoi(argv[i]);
173  if ((g>=0) && (g<32))
174  {
175  g_gpio[g_num_gpios++] = g;
176  g_mask |= (1<<g);
177  }
178  else fatal(1, "%d is not a valid g_gpio number\n", g);
179  }
180 
181  if (!g_num_gpios) fatal(1, "At least one gpio must be specified");
182 
183  printf("Monitoring gpios");
184  for (i=0; i<g_num_gpios; i++) printf(" %d", g_gpio[i]);
185  printf("\nSample rate %d micros, refresh rate %d deciseconds\n",
186  g_opt_s, g_opt_r);
187 
188  gpioCfgClock(g_opt_s, 1, 1);
189 
190  if (gpioInitialise()<0) return 1;
191 
192  gpioWaveClear();
193 
194  pulse[0].gpioOn = g_mask;
195  pulse[0].gpioOff = 0;
196  pulse[0].usDelay = g_opt_p;
197 
198  pulse[1].gpioOn = 0;
199  pulse[1].gpioOff = g_mask;
200  pulse[1].usDelay = g_opt_p;
201 
202  gpioWaveAddGeneric(2, pulse);
203 
204  wave_id = gpioWaveCreate();
205 
206  /* monitor g_gpio level changes */
207 
208  for (i=0; i<g_num_gpios; i++) gpioSetAlertFunc(g_gpio[i], edges);
209 
210  mode = PI_INPUT;
211 
212  if (g_opt_t)
213  {
215  mode = PI_OUTPUT;
216  }
217 
218  for (i=0; i<g_num_gpios; i++) gpioSetMode(g_gpio[i], mode);
219 
220  while (1)
221  {
222  for (i=0; i<g_num_gpios; i++) count[i] = g_pulse_count[g_gpio[i]];
223 
224  g_reset_counts = 1;
225 
226  for (i=0; i<g_num_gpios; i++)
227  {
228  printf(" %d=%d", g_gpio[i], count[i]);
229  }
230 
231  printf("\n");
232 
233  gpioDelay(g_opt_r * 100000);
234  }
235 
236  gpioTerminate();
237 }
238 
static int g_num_gpios
Definition: freq_count_1.c:57
static int g_opt_r
Definition: freq_count_1.c:61
void fatal(int show_usage, char *fmt,...)
Definition: freq_count_1.c:84
int gpioInitialise(void)
Definition: pigpio.c:8459
int gpioSetAlertFunc(unsigned gpio, gpioAlertFunc_t f)
Definition: pigpio.c:11303
static volatile int g_pulse_count[MAX_GPIOS]
Definition: freq_count_1.c:53
#define OPT_P_MAX
Definition: freq_count_1.c:42
#define PI_WAVE_MODE_REPEAT
Definition: pigpio.h:669
#define OPT_S_MIN
Definition: freq_count_1.c:49
int main(int argc, char *argv[])
Definition: freq_count_1.c:156
int gpioSetMode(unsigned gpio, unsigned mode)
Definition: pigpio.c:8607
#define OPT_P_MIN
Definition: freq_count_1.c:41
#define OPT_S_MAX
Definition: freq_count_1.c:50
#define OPT_R_DEF
Definition: freq_count_1.c:47
#define OPT_R_MIN
Definition: freq_count_1.c:45
static uint32_t g_mask
Definition: freq_count_1.c:55
uint32_t gpioDelay(uint32_t micros)
Definition: pigpio.c:13196
#define PI_INPUT
Definition: pigpio.h:581
static volatile int g_reset_counts
Definition: freq_count_1.c:54
void edges(int gpio, int level, uint32_t tick)
Definition: freq_count_1.c:142
int gpioCfgClock(unsigned micros, unsigned peripheral, unsigned source)
Definition: pigpio.c:13342
void gpioTerminate(void)
Definition: pigpio.c:8495
#define OPT_P_DEF
Definition: freq_count_1.c:43
#define PI_OUTPUT
Definition: pigpio.h:582
static int g_opt_p
Definition: freq_count_1.c:60
uint32_t gpioOn
Definition: pigpio.h:424
int gpioWaveTxSend(unsigned wave_id, unsigned wave_mode)
Definition: pigpio.c:9524
static int g_opt_t
Definition: freq_count_1.c:63
#define MAX_GPIOS
Definition: freq_count_1.c:39
void usage()
Definition: freq_count_1.c:65
static int g_gpio[MAX_GPIOS]
Definition: freq_count_1.c:58
uint32_t gpioOff
Definition: pigpio.h:425
#define OPT_R_MAX
Definition: freq_count_1.c:46
uint32_t usDelay
Definition: pigpio.h:426
int gpioWaveClear(void)
Definition: pigpio.c:9034
static int initOpts(int argc, char *argv[])
Definition: freq_count_1.c:102
#define OPT_S_DEF
Definition: freq_count_1.c:51
int gpioWaveAddGeneric(unsigned numPulses, gpioPulse_t *pulses)
Definition: pigpio.c:9084
static int g_opt_s
Definition: freq_count_1.c:62
int gpioWaveCreate(void)
Definition: pigpio.c:9388


cob_hand_bridge
Author(s): Mathias Lüdtke
autogenerated on Tue Oct 20 2020 03:35:57