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


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