]> rtime.felk.cvut.cz Git - pes-rpp/rpp-simulink.git/blob - rpp/blocks/sfunction_gio_out.c
07fab314f3c7dcb1f5586fcf5eef9121dab5eded
[pes-rpp/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   - board_init_hydctr
64 ...
65 */
66
67
68 #define S_FUNCTION_NAME sfunction_gio_out
69 #include "header.c"
70
71 #define PARAM_NAME_PORT_TYPE            "port_type"
72 #define PARAM_NAME_PIN_NUMBER           "pin_number"
73 #define PARAM_NAME_DEFAULT_OUTPUT       "default_output"
74 #define PARAM_NAME_OUTPUT_TYPE          "output_type"
75
76 /** Identifiers of the block parameters */
77 enum params{
78         PARAM_PIN_NAME,
79         PARAM_DEFAULT_OUTPUT,
80         PARAM_OUTPUT_TYPE,
81         PARAMS_COUNT
82 };
83
84 enum inputs{
85         IN_PIN_VALUE,
86         INPUTS_COUNT
87 };
88
89 static void mdlInitializeSizes(SimStruct *S)
90 {
91         if (!rppSetNumParams(S, PARAMS_COUNT)) {
92                 return;
93         }
94
95         /*
96         * Configure output ports: 0
97         */
98         if (!ssSetNumOutputPorts(S, 0)) {
99                 return;
100         }
101
102         /*
103         * Configure input ports: 1
104         */
105         if (!ssSetNumInputPorts(S, INPUTS_COUNT)) {
106                 return;
107         }
108
109         rppAddInputPort(S, IN_PIN_VALUE, SS_BOOLEAN);
110
111         /* Set standard options for this block */
112         rppSetStandardOptions(S);
113 }
114
115
116 #ifdef MATLAB_MEX_FILE
117 #define MDL_CHECK_PARAMETERS
118 static void mdlCheckParameters(SimStruct *S)
119 {
120     if (!mxIsChar(ssGetSFcnParam(S, PARAM_PIN_NAME))) {
121         ssSetErrorStatus(S, "Parameter to S-function must be a string.");
122     }
123         if (!rppValidParamRange(S, PARAM_DEFAULT_OUTPUT, 0, 1)) {
124                 return;
125         }
126 }
127 #endif
128
129 #if defined(MATLAB_MEX_FILE)
130 #define MDL_RTW
131 static void mdlRTW(SimStruct *S)
132 {
133     char_T pin_name[80];
134     int8_T def_out = mxGetPr(ssGetSFcnParam(S, PARAM_DEFAULT_OUTPUT))[0];
135     int8_T out_type = mxGetPr(ssGetSFcnParam(S, PARAM_OUTPUT_TYPE))[0];
136
137     if (mxGetString(ssGetSFcnParam(S, PARAM_PIN_NAME), pin_name, sizeof(pin_name)) != 0) {
138         ssSetErrorStatus(S,"mxGetString error in mdlRTW");
139         return;
140     }
141
142     if (!ssWriteRTWParamSettings(S, 3,
143                                  SSWRITE_VALUE_STR, "PinName", pin_name,
144                                  SSWRITE_VALUE_DTYPE_NUM, "DefOut", &def_out, DTINFO(SS_INT8, COMPLEX_NO),
145                                  SSWRITE_VALUE_DTYPE_NUM, "OutType", &out_type, DTINFO(SS_INT8, COMPLEX_NO))) {
146         ssSetErrorStatus(S, "ssWriteRTWParamSettings failed");
147     }
148 }
149 #endif /* MDL_RTW */
150
151
152
153 #define COMMON_MDLINITIALIZESAMPLETIMES_INHERIT
154 #define UNUSED_MDLOUTPUTS
155 #define UNUSED_MDLTERMINATE
156 #include "trailer.c"