Staging: epl: run Lindent on *.c files
[linux-2.6] / drivers / staging / epl / EplStatusu.c
1 /****************************************************************************
2
3   (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
4       www.systec-electronic.com
5
6   Project:      openPOWERLINK
7
8   Description:  source file for Statusu-Module
9
10   License:
11
12     Redistribution and use in source and binary forms, with or without
13     modification, are permitted provided that the following conditions
14     are met:
15
16     1. Redistributions of source code must retain the above copyright
17        notice, this list of conditions and the following disclaimer.
18
19     2. Redistributions in binary form must reproduce the above copyright
20        notice, this list of conditions and the following disclaimer in the
21        documentation and/or other materials provided with the distribution.
22
23     3. Neither the name of SYSTEC electronic GmbH nor the names of its
24        contributors may be used to endorse or promote products derived
25        from this software without prior written permission. For written
26        permission, please contact info@systec-electronic.com.
27
28     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32     COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
33     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
35     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
36     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
38     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39     POSSIBILITY OF SUCH DAMAGE.
40
41     Severability Clause:
42
43         If a provision of this License is or becomes illegal, invalid or
44         unenforceable in any jurisdiction, that shall not affect:
45         1. the validity or enforceability in that jurisdiction of any other
46            provision of this License; or
47         2. the validity or enforceability in other jurisdictions of that or
48            any other provision of this License.
49
50   -------------------------------------------------------------------------
51
52                 $RCSfile: EplStatusu.c,v $
53
54                 $Author: D.Krueger $
55
56                 $Revision: 1.5 $  $Date: 2008/10/17 15:32:32 $
57
58                 $State: Exp $
59
60                 Build Environment:
61                     GCC V3.4
62
63   -------------------------------------------------------------------------
64
65   Revision History:
66
67   2006/11/15 d.k.:   start of the implementation
68
69 ****************************************************************************/
70
71 #include "user/EplStatusu.h"
72 #include "user/EplDlluCal.h"
73
74 /***************************************************************************/
75 /*                                                                         */
76 /*                                                                         */
77 /*          G L O B A L   D E F I N I T I O N S                            */
78 /*                                                                         */
79 /*                                                                         */
80 /***************************************************************************/
81
82 //---------------------------------------------------------------------------
83 // const defines
84 //---------------------------------------------------------------------------
85
86 //---------------------------------------------------------------------------
87 // local types
88 //---------------------------------------------------------------------------
89
90 //---------------------------------------------------------------------------
91 // modul globale vars
92 //---------------------------------------------------------------------------
93
94 //---------------------------------------------------------------------------
95 // local function prototypes
96 //---------------------------------------------------------------------------
97
98 /***************************************************************************/
99 /*                                                                         */
100 /*                                                                         */
101 /*          C L A S S  <xxxxx>                                             */
102 /*                                                                         */
103 /*                                                                         */
104 /***************************************************************************/
105 //
106 // Description:
107 //
108 //
109 /***************************************************************************/
110
111 //=========================================================================//
112 //                                                                         //
113 //          P R I V A T E   D E F I N I T I O N S                          //
114 //                                                                         //
115 //=========================================================================//
116
117 //---------------------------------------------------------------------------
118 // const defines
119 //---------------------------------------------------------------------------
120
121 //---------------------------------------------------------------------------
122 // local types
123 //---------------------------------------------------------------------------
124
125 typedef struct {
126         tEplStatusuCbResponse m_apfnCbResponse[254];
127
128 } tEplStatusuInstance;
129
130 //---------------------------------------------------------------------------
131 // local vars
132 //---------------------------------------------------------------------------
133
134 static tEplStatusuInstance EplStatusuInstance_g;
135
136 //---------------------------------------------------------------------------
137 // local function prototypes
138 //---------------------------------------------------------------------------
139
140 static tEplKernel PUBLIC EplStatusuCbStatusResponse(tEplFrameInfo *
141                                                     pFrameInfo_p);
142
143 //=========================================================================//
144 //                                                                         //
145 //          P U B L I C   F U N C T I O N S                                //
146 //                                                                         //
147 //=========================================================================//
148
149 //---------------------------------------------------------------------------
150 //
151 // Function:    EplStatusuInit
152 //
153 // Description: init first instance of the module
154 //
155 //
156 //
157 // Parameters:
158 //
159 //
160 // Returns:     tEplKernel  = errorcode
161 //
162 //
163 // State:
164 //
165 //---------------------------------------------------------------------------
166
167 EPLDLLEXPORT tEplKernel PUBLIC EplStatusuInit()
168 {
169         tEplKernel Ret;
170
171         Ret = EplStatusuAddInstance();
172
173         return Ret;
174 }
175
176 //---------------------------------------------------------------------------
177 //
178 // Function:    EplStatusuAddInstance
179 //
180 // Description: init other instances of the module
181 //
182 //
183 //
184 // Parameters:
185 //
186 //
187 // Returns:     tEplKernel  = errorcode
188 //
189 //
190 // State:
191 //
192 //---------------------------------------------------------------------------
193
194 EPLDLLEXPORT tEplKernel PUBLIC EplStatusuAddInstance()
195 {
196         tEplKernel Ret;
197
198         Ret = kEplSuccessful;
199
200         // reset instance structure
201         EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof(EplStatusuInstance_g));
202
203         // register StatusResponse callback function
204         Ret =
205             EplDlluCalRegAsndService(kEplDllAsndStatusResponse,
206                                      EplStatusuCbStatusResponse,
207                                      kEplDllAsndFilterAny);
208
209         return Ret;
210
211 }
212
213 //---------------------------------------------------------------------------
214 //
215 // Function:    EplStatusuDelInstance
216 //
217 // Description: delete instance
218 //
219 //
220 //
221 // Parameters:
222 //
223 //
224 // Returns:     tEplKernel  = errorcode
225 //
226 //
227 // State:
228 //
229 //---------------------------------------------------------------------------
230
231 EPLDLLEXPORT tEplKernel PUBLIC EplStatusuDelInstance()
232 {
233         tEplKernel Ret;
234
235         Ret = kEplSuccessful;
236
237         // deregister StatusResponse callback function
238         Ret =
239             EplDlluCalRegAsndService(kEplDllAsndStatusResponse, NULL,
240                                      kEplDllAsndFilterNone);
241
242         return Ret;
243
244 }
245
246 //---------------------------------------------------------------------------
247 //
248 // Function:    EplStatusuReset
249 //
250 // Description: resets this instance
251 //
252 // Parameters:
253 //
254 // Returns:     tEplKernel  = errorcode
255 //
256 //
257 // State:
258 //
259 //---------------------------------------------------------------------------
260
261 EPLDLLEXPORT tEplKernel PUBLIC EplStatusuReset()
262 {
263         tEplKernel Ret;
264
265         Ret = kEplSuccessful;
266
267         // reset instance structure
268         EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof(EplStatusuInstance_g));
269
270         return Ret;
271
272 }
273
274 //---------------------------------------------------------------------------
275 //
276 // Function:    EplStatusuRequestStatusResponse
277 //
278 // Description: returns the StatusResponse for the specified node.
279 //
280 // Parameters:  uiNodeId_p                  = IN: node ID
281 //              pfnCbResponse_p             = IN: function pointer to callback function
282 //                                            which will be called if StatusResponse is received
283 //
284 // Return:      tEplKernel                  = error code
285 //
286 // State:       not tested
287 //
288 //---------------------------------------------------------------------------
289
290 tEplKernel PUBLIC EplStatusuRequestStatusResponse(unsigned int uiNodeId_p,
291                                                   tEplStatusuCbResponse
292                                                   pfnCbResponse_p)
293 {
294         tEplKernel Ret;
295
296         Ret = kEplSuccessful;
297
298         // decrement node ID, because array is zero based
299         uiNodeId_p--;
300         if (uiNodeId_p < tabentries(EplStatusuInstance_g.m_apfnCbResponse)) {
301 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
302                 if (EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] != NULL) {        // request already issued (maybe by someone else)
303                         Ret = kEplInvalidOperation;
304                 } else {
305                         EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] =
306                             pfnCbResponse_p;
307                         Ret =
308                             EplDlluCalIssueRequest(kEplDllReqServiceStatus,
309                                                    (uiNodeId_p + 1), 0xFF);
310                 }
311 #else
312                 Ret = kEplInvalidOperation;
313 #endif
314         } else {                // invalid node ID specified
315                 Ret = kEplInvalidNodeId;
316         }
317
318         return Ret;
319
320 }
321
322 //=========================================================================//
323 //                                                                         //
324 //          P R I V A T E   F U N C T I O N S                              //
325 //                                                                         //
326 //=========================================================================//
327
328 //---------------------------------------------------------------------------
329 //
330 // Function:    EplStatusuCbStatusResponse
331 //
332 // Description: callback funktion for StatusResponse
333 //
334 //
335 //
336 // Parameters:  pFrameInfo_p            = Frame with the StatusResponse
337 //
338 //
339 // Returns:     tEplKernel              = error code
340 //
341 //
342 // State:
343 //
344 //---------------------------------------------------------------------------
345 static tEplKernel PUBLIC EplStatusuCbStatusResponse(tEplFrameInfo *
346                                                     pFrameInfo_p)
347 {
348         tEplKernel Ret = kEplSuccessful;
349         unsigned int uiNodeId;
350         unsigned int uiIndex;
351         tEplStatusuCbResponse pfnCbResponse;
352
353         uiNodeId = AmiGetByteFromLe(&pFrameInfo_p->m_pFrame->m_le_bSrcNodeId);
354
355         uiIndex = uiNodeId - 1;
356
357         if (uiIndex < tabentries(EplStatusuInstance_g.m_apfnCbResponse)) {
358                 // memorize pointer to callback function
359                 pfnCbResponse = EplStatusuInstance_g.m_apfnCbResponse[uiIndex];
360                 if (pfnCbResponse == NULL) {    // response was not requested
361                         goto Exit;
362                 }
363                 // reset callback function pointer so that caller may issue next request
364                 EplStatusuInstance_g.m_apfnCbResponse[uiIndex] = NULL;
365
366                 if (pFrameInfo_p->m_uiFrameSize < EPL_C_DLL_MINSIZE_STATUSRES) {        // StatusResponse not received or it has invalid size
367                         Ret = pfnCbResponse(uiNodeId, NULL);
368                 } else {        // StatusResponse received
369                         Ret =
370                             pfnCbResponse(uiNodeId,
371                                           &pFrameInfo_p->m_pFrame->m_Data.
372                                           m_Asnd.m_Payload.m_StatusResponse);
373                 }
374         }
375
376       Exit:
377         return Ret;
378 }
379
380 // EOF