]> rtime.felk.cvut.cz Git - jenkicar/rpp-simulink.git/blob - rpp/blocks/sfunction_gio_out.c
gio blocks: Allow users to select the pin from a list
[jenkicar/rpp-simulink.git] / rpp / blocks / sfunction_gio_out.c
1 /* Copyright (C) 2013, 2014, 2015 Czech Technical University in Prague
2  *
3  * Authors:
4  *     - Carlos Jenkins <carlos@jenkins.co.cr>
5  *
6  * This document contains proprietary information belonging to Czech
7  * Technical University in Prague. Passing on and copying of this
8  * document, and communication of its contents is not permitted
9  * without prior written authorization.
10  *
11  * File : sfunction_gio_out.c
12  * Abstract:
13  *     C-MEX S-function block for writting to RPP GPIO ports.
14  *
15  * References:
16  *     header.c
17  *     trailer.c
18  *
19  * Compile with:
20  *     <matlabroot>/bin/mex sfunction_gio_out.c
21  */
22
23 /*
24 %YAML 1.2
25 ---
26 Name: General Purpose Digital Output
27 Category: IO blocks
28 Header: rpp/gio.h
29 Mnemonic: GIOOUT
30
31 Inputs:
32   - { name: "Digital Output value", type: "bool" }
33 Outputs:
34
35 Parameters:
36   - { name: "Pin", type: "Choice", range: "Target dependent pin names or '---'" }
37   - { name: "Pin name", type: "String", note: "Pin name as defined in gio_def.h. This parameter is only visible if *Pin* is '---'." }
38   - { name: "Initial output value", type: "uint8", range: "[0,1]" }
39   - { name: "Output Type", type: "Choice", range: "Open Drain, Push/Pull" }
40
41 # Description is in Markdown mark-up
42 Description: &desc |
43
44   Sets a GIO pin to a given value. Which pins are supported depends on
45   the target board. Any pin can be configured as open drain or
46   push/pull and initial output value can be specified. The initial
47   value is a value, which will appear on the pin when the GPIO module
48   is initialized and stays there until the first block execution.
49
50   When the pin is used in multiple GIOIN or GIOOUT blocks, an error is
51   signaled.
52
53 Help: *desc
54
55 Status: Stable
56
57 RPP API functions used:
58   - rpp_gio_setup
59   - rpp_gio_set
60
61 Relevant demos:
62   - gio_demo
63 ...
64 */
65
66
67 #define S_FUNCTION_NAME sfunction_gio_out
68 #include "header.c"
69
70 #define PARAM_NAME_PORT_TYPE            "port_type"
71 #define PARAM_NAME_PIN_NUMBER           "pin_number"
72 #define PARAM_NAME_DEFAULT_OUTPUT       "default_output"
73 #define PARAM_NAME_OUTPUT_TYPE          "output_type"
74
75 /** Identifiers of the block parameters */
76 enum params{
77         PARAM_PIN_NAME,
78         PARAM_DEFAULT_OUTPUT,
79         PARAM_OUTPUT_TYPE,
80         PARAMS_COUNT
81 };
82
83 enum inputs{
84         IN_PIN_VALUE,
85         INPUTS_COUNT
86 };
87
88 static void mdlInitializeSizes(SimStruct *S)
89 {
90         if (!rppSetNumParams(S, PARAMS_COUNT)) {
91                 return;
92         }
93
94         /*
95         * Configure output ports: 0
96         */
97         if (!ssSetNumOutputPorts(S, 0)) {
98                 return;
99         }
100
101         /*
102         * Configure input ports: 1
103         */
104         if (!ssSetNumInputPorts(S, INPUTS_COUNT)) {
105                 return;
106         }
107
108         rppAddInputPort(S, IN_PIN_VALUE, SS_BOOLEAN);
109
110         /* Set standard options for this block */
111         rppSetStandardOptions(S);
112 }
113
114
115 #ifdef MATLAB_MEX_FILE
116 #define MDL_CHECK_PARAMETERS
117 static void mdlCheckParameters(SimStruct *S)
118 {
119     if (!mxIsChar(ssGetSFcnParam(S, PARAM_PIN_NAME))) {
120         ssSetErrorStatus(S, "Parameter to S-function must be a string.");
121     }
122         if (!rppValidParamRange(S, PARAM_DEFAULT_OUTPUT, 0, 1)) {
123                 return;
124         }
125 }
126 #endif
127
128 #if defined(MATLAB_MEX_FILE)
129 #define MDL_RTW
130 static void mdlRTW(SimStruct *S)
131 {
132     char_T pin_name[80];
133     int8_T def_out = mxGetPr(ssGetSFcnParam(S, PARAM_DEFAULT_OUTPUT))[0];
134     int8_T out_type = mxGetPr(ssGetSFcnParam(S, PARAM_OUTPUT_TYPE))[0];
135
136     if (mxGetString(ssGetSFcnParam(S, PARAM_PIN_NAME), pin_name, sizeof(pin_name)) != 0) {
137         ssSetErrorStatus(S,"mxGetString error in mdlRTW");
138         return;
139     }
140
141     if (!ssWriteRTWParamSettings(S, 3,
142                                  SSWRITE_VALUE_STR, "PinName", pin_name,
143                                  SSWRITE_VALUE_DTYPE_NUM, "DefOut", &def_out, DTINFO(SS_INT8, COMPLEX_NO),
144                                  SSWRITE_VALUE_DTYPE_NUM, "OutType", &out_type, DTINFO(SS_INT8, COMPLEX_NO))) {
145         ssSetErrorStatus(S, "ssWriteRTWParamSettings failed");
146     }
147 }
148 #endif /* MDL_RTW */
149
150
151
152 #define COMMON_MDLINITIALIZESAMPLETIMES_INHERIT
153 #define UNUSED_MDLOUTPUTS
154 #define UNUSED_MDLTERMINATE
155 #include "trailer.c"