]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/blob - rpp/src/rpp/hbr.c
deb8a6a471f9ba8e80f01e4e7993d2908c416a35
[pes-rpp/rpp-lib.git] / rpp / src / rpp / hbr.c
1 /* Copyright (C) 2013 Czech Technical University in Prague
2  *
3  * Authors:
4  *     - Carlos Jenkins <carlos@jenkins.co.cr>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  * File : hbr.c
20  * Abstract:
21  *     H-Bridge Output RPP API implementation file.
22  *
23  * References:
24  *     hbr.h
25  *     RPP API documentation.
26  */
27
28
29 #include "rpp/rpp.h"
30
31 #if rppCONFIG_INCLUDE_HBR == 1
32
33 #if rppCONFIG_DRV == 1
34 #include "drv/hbridge.h"
35 #endif
36
37 static boolean_t initialized = FALSE;
38
39 int8_t rpp_hbr_init()
40 {
41     if(initialized) {
42         return FAILURE;
43     }
44     initialized = TRUE;
45
46     return SUCCESS;
47 }
48
49
50 // Private function to set the H-Bridge to default OFF settings
51 static void rpp_hdr_reset()
52 {
53     #if rppCONFIG_DRV == 1
54     hbr_set_en(LOW);
55     hbr_pwm_set_duty(0);
56     hbr_pwm_stop();
57     hbr_set_dir(LOW);
58     #endif
59 }
60
61
62 static boolean_t enabled = FALSE;
63
64 int8_t rpp_hbr_enable(int32_t period)
65 {
66     if(enabled) {
67         return FAILURE;
68     }
69
70     if(period < 1) {
71         period = 55; // ~18kHz (18181.818181818 Hz to be precise)
72     }
73
74     #if rppCONFIG_DRV == 1
75     hbr_pwm_set_signal(period, 0);
76     rpp_hdr_reset();
77     // FIXME enable watchdog task
78     #endif
79
80     enabled = TRUE;
81
82     return SUCCESS;
83 }
84
85
86 int8_t rpp_hbr_control(double cmd)
87 {
88     if(!enabled) {
89         return -1;
90     }
91
92     // Check range of the command
93     if((cmd < -1.0) || (cmd > 1.0)) {
94         return -2;
95     }
96
97     #if rppCONFIG_DRV == 1
98     // Great, now scale and return to sanity world of ints :D
99     int32_t scaled = (int32_t)(cmd * 100.0);
100
101     // Shutdown if required
102     if(scaled == 0) {
103         rpp_hdr_reset();
104         return SUCCESS;
105     }
106
107     /// Enabled, configure
108     // Set direction
109     if(scaled < 0) {
110         hbr_set_dir(LOW);
111     } else {
112         hbr_set_dir(HIGH);
113     }
114
115     // Set PWM duty cycle
116     hbr_pwm_set_duty(abs(scaled));
117     hbr_pwm_start();
118
119     // Enable H-Bridge
120     hbr_set_en(HIGH);
121     #endif
122
123     return SUCCESS;
124 }
125
126
127 int8_t rpp_hbr_disable()
128 {
129     if(!enabled) {
130         return FAILURE;
131     }
132
133     rpp_hdr_reset();
134     enabled = FALSE;
135
136     return SUCCESS;
137 }
138
139
140
141 #endif /* rppCONFIG_INCLUDE_HBR */
142