]> rtime.felk.cvut.cz Git - pes-rpp/rpp-test-sw.git/blob - rpp-test-sw/commands/cmd_adc.c
Update to the reworked gio and port in the rpp-lib
[pes-rpp/rpp-test-sw.git] / rpp-test-sw / commands / cmd_adc.c
1 /*
2  * Copyright (C) 2012-2015 Czech Technical University in Prague
3  *
4  * Created on: 28.2.2013
5  *
6  * Authors:
7  *     - Michal Horn
8  *
9  * This document contains proprietary information belonging to Czech
10  * Technical University in Prague. Passing on and copying of this
11  * document, and communication of its contents is not permitted
12  * without prior written authorization.
13  *
14  * File : cmd_adc.c
15  *
16  * Abstract:
17  *      This file contains command for reading adc port.
18  *
19  */
20
21 #include "cmd_adc.h"
22
23 #ifndef DOCGEN
24
25 #include "rpp/rpp.h"
26 #include <stdio.h>
27 #include "drv/port.h"
28
29 static double lsb2volts(unsigned lsb)
30 {
31         return ((double)lsb + 0.0)*2.5/4095*2;
32 }
33
34
35 /**
36  * @brief Read values from ADC port
37  *
38  * @param[in]   cmd_io  Pointer to IO stack
39  * @param[in]   des             Pointer to command descriptor
40  * @param[in]   param   Parameters of command
41  * @return 0 when OK or error code lower than 0
42  */
43 int cmd_do_read_adc1_values(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
44 {
45         uint32_t i, min, max;   // Cycle control variable
46
47         rpp_adc_update();
48         if (param[1] == param[0] + 7) { /* Single pin variant */
49                 if (sscanf(param[1], "%d", &min) != 1)
50                         return -CMDERR_BADPAR;
51                 if (min > 15)
52                         return -CMDERR_NODEV;
53                 max = min;
54         }
55         else {              /* All pins */
56                 min = 0;
57                 max = port_desc[PORT_ID_ADC].numchn - 1;
58         }
59         for (i = min; i <= max; i++) {
60                 unsigned d = rpp_adc_get(i+1);
61                 double v = lsb2volts(d);
62                 rpp_sci_printf("ADC%-2d %4d lsb ~ %5.2f V\n", i, d, v);
63         }
64         return 0;
65 }
66
67 int cmd_do_adc_watch(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
68 {
69         int i;
70
71         rpp_sci_printf("ADC Inputs Test [0-15]:\r\n");
72         rpp_sci_printf("===============================================================================================\r\n");
73
74         for (i = 0; i < 16; i++)
75                 rpp_sci_printf("%5d ", i);
76         rpp_sci_printf("\n");
77
78         // Calculate wait time in OS ticks
79         static const portTickType freq_ticks = 100 /* ms */ / portTICK_RATE_MS;
80         portTickType last_wake_time = xTaskGetTickCount();
81
82         while (cmd_io->getc(cmd_io) < 0) {
83         // Update inputs
84         rpp_adc_update();
85
86                 for (i = 0; i < 16; i++)
87                         rpp_sci_printf("%5d ", rpp_adc_get(i+1));
88                 rpp_sci_printf("lsb\n");
89                 for (i = 0; i < 16; i++)
90                         rpp_sci_printf("%5.2f ", lsb2volts(rpp_adc_get(i+1)));
91                 rpp_sci_printf("V\r\033[A"); /* Cursor up */
92
93
94                 vTaskDelayUntil(&last_wake_time, freq_ticks);
95         }
96         rpp_sci_printf("\n\n");
97         return 0;
98 }
99
100
101 #endif  /* DOCGEN */
102
103 /** Descriptor of command for adc port reading */
104 cmd_des_t const cmd_des_read_adc1 = {
105         0, 0,
106         "adcread","Read values from ADC inputs",
107         "### Command syntax ###\n"
108         "\n"
109         "     adcread\n"
110         "\n"
111         "### Description ###\n"
112         "\n"
113         "This command reads values corresponding to analog voltages on ADC\n"
114         "inputs 0-15 and prints them as decimal numbers as well as converted to\n"
115         "Volts.\n"
116         "\n"
117         "### Example ###\n"
118         "\n"
119         "     --> adcread\n"
120         "     ADC0  2332 lsb ~ 11.66 V\n"
121         "     ADC1  2332 lsb ~ 11.66 V\n"
122         "     ADC2   107 lsb ~  0.54 V\n"
123         "     ADC3   108 lsb ~  0.54 V\n"
124         "     ADC4   107 lsb ~  0.54 V\n"
125         "     ADC5   108 lsb ~  0.54 V\n"
126         "     ADC6   111 lsb ~  0.56 V\n"
127         "     ADC7   110 lsb ~  0.55 V\n"
128         "     ADC8   109 lsb ~  0.55 V\n"
129         "     ADC9   107 lsb ~  0.54 V\n"
130         "     ADC10  107 lsb ~  0.54 V\n"
131         "     ADC11  110 lsb ~  0.55 V\n"
132         "     ADC12  108 lsb ~  0.54 V\n"
133         "     ADC13  108 lsb ~  0.54 V\n"
134         "     ADC14  108 lsb ~  0.54 V\n"
135         "     ADC15  108 lsb ~  0.54 V\n",
136         CMD_HANDLER(cmd_do_read_adc1_values), (void *)&cmd_list_adc
137 };
138
139 cmd_des_t const cmd_des_read_adc2 = {
140         0, 0,
141         "adcread*","Read a value from a single ADC input",
142         "### Command syntax ###\n"
143         "\n"
144         "    adcread<PIN>\n"
145         "\n"
146         "where `<PIN>` is a number in range 0 - 15.\n"
147         "\n"
148         "### Description ###\n"
149         "\n"
150         "This command reads the value corresponding to analog voltage on an ADC\n"
151         "input and prints it as decimal numbers as well as converted to Volts.\n"
152         "\n"
153         "### Example ###\n"
154         "\n"
155         "    --> adcread1\n"
156         "    ADC1  2331 lsb ~ 11.66 V\n",
157         CMD_HANDLER(cmd_do_read_adc1_values), (void *)&cmd_list_adc
158 };
159
160 cmd_des_t const cmd_des_adcwatch = {
161         0, 0,
162         "adcwatch","Watch the values from ADC inputs",
163         "### Command syntax ###\n"
164         "\n"
165         "    adcwatch\n"
166         "\n"
167         "### Description ###\n"
168         "\n"
169         "This command reads values corresponding to analog voltages on ADC\n"
170         "inputs 0-15 10 times per second and prints them as decimal numbers (in\n"
171         "lsb units) as well as converted to Volts. The command is ended by any\n"
172         "key.\n"
173         "\n"
174         "### Example ###\n"
175         "\n"
176         "    --> adcwatch\n"
177         "    ADC Inputs Test [0-15]:\n"
178         "    =========================================================================================\n"
179         "        0     2     3     4     5     6     7     8     9    10    11    12    13    14    15\n"
180         "     2331   107   108   106   107   110   110   109   107   107   110   109   109   109   109 lsb\n"
181         "    11.66  0.54  0.54  0.53  0.54  0.55  0.55  0.55  0.54  0.54  0.55  0.55  0.55  0.55  0.55 V\n",
182         CMD_HANDLER(cmd_do_adc_watch), (void *)&cmd_list_adc
183 };
184
185 /** List of commands for adc, defined as external */
186 cmd_des_t const *cmd_list_adc[] = {
187         &cmd_des_read_adc1,
188         &cmd_des_read_adc2,
189         &cmd_des_adcwatch,
190         NULL
191 };