1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Python Wrapper
3  * Title:        cmsismodule.h
4  * Description:  C code for the CMSIS-DSP Python wrapper
5  *
6  * $Date:        27 April 2021
7  * $Revision:    V1.0
8  *
9  * Target Processor: Cortex-M cores
10  * -------------------------------------------------------------------- */
11 /*
12  * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
13  *
14  * SPDX-License-Identifier: Apache-2.0
15  *
16  * Licensed under the Apache License, Version 2.0 (the License); you may
17  * not use this file except in compliance with the License.
18  * You may obtain a copy of the License at
19  *
20  * www.apache.org/licenses/LICENSE-2.0
21  *
22  * Unless required by applicable law or agreed to in writing, software
23  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
24  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25  * See the License for the specific language governing permissions and
26  * limitations under the License.
27  */
28 
29 #define MODNAME "cmsisdsp_controller"
30 #define MODINITNAME cmsisdsp_controller
31 
32 #include "cmsisdsp_module.h"
33 
34 
35 
36 NUMPYVECTORFROMBUFFER(f32,float32_t,NPY_FLOAT);
37 
38 
39 
40 typedef struct {
41     PyObject_HEAD
42     arm_pid_instance_q15 *instance;
43 } dsp_arm_pid_instance_q15Object;
44 
45 
46 static void
arm_pid_instance_q15_dealloc(dsp_arm_pid_instance_q15Object * self)47 arm_pid_instance_q15_dealloc(dsp_arm_pid_instance_q15Object* self)
48 {
49     //printf("Dealloc called\n");
50     if (self->instance)
51     {
52 
53 
54        PyMem_Free(self->instance);
55     }
56 
57     Py_TYPE(self)->tp_free((PyObject*)self);
58 }
59 
60 
61 static PyObject *
arm_pid_instance_q15_new(PyTypeObject * type,PyObject * args,PyObject * kwds)62 arm_pid_instance_q15_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
63 {
64     dsp_arm_pid_instance_q15Object *self;
65     //printf("New called\n");
66 
67     self = (dsp_arm_pid_instance_q15Object *)type->tp_alloc(type, 0);
68     //printf("alloc called\n");
69 
70     if (self != NULL) {
71 
72         self->instance = PyMem_Malloc(sizeof(arm_pid_instance_q15));
73 
74 
75     }
76 
77 
78     return (PyObject *)self;
79 }
80 
81 static int
arm_pid_instance_q15_init(dsp_arm_pid_instance_q15Object * self,PyObject * args,PyObject * kwds)82 arm_pid_instance_q15_init(dsp_arm_pid_instance_q15Object *self, PyObject *args, PyObject *kwds)
83 {
84 
85 char *kwlist[] = {
86 "A0","A1","A2","state","Kp","Ki","Kd",NULL
87 };
88 
89 if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhhhhhh", kwlist,&self->instance->A0
90 ,&self->instance->A1
91 ,&self->instance->A2
92 ,&self->instance->state
93 ,&self->instance->Kp
94 ,&self->instance->Ki
95 ,&self->instance->Kd
96 ))
97     {
98 
99 
100     }
101     return 0;
102 }
103 
104 GETFIELD(arm_pid_instance_q15,A0,"h");
105 GETFIELD(arm_pid_instance_q15,A1,"h");
106 GETFIELD(arm_pid_instance_q15,A2,"h");
107 GETFIELD(arm_pid_instance_q15,state,"h");
108 GETFIELD(arm_pid_instance_q15,Kp,"h");
109 GETFIELD(arm_pid_instance_q15,Ki,"h");
110 GETFIELD(arm_pid_instance_q15,Kd,"h");
111 
112 
113 static PyMethodDef arm_pid_instance_q15_methods[] = {
114 
115     {"A0", (PyCFunction) Method_arm_pid_instance_q15_A0,METH_NOARGS,"A0"},
116     {"A1", (PyCFunction) Method_arm_pid_instance_q15_A1,METH_NOARGS,"A1"},
117     {"A2", (PyCFunction) Method_arm_pid_instance_q15_A2,METH_NOARGS,"A2"},
118     {"state", (PyCFunction) Method_arm_pid_instance_q15_state,METH_NOARGS,"state"},
119     {"Kp", (PyCFunction) Method_arm_pid_instance_q15_Kp,METH_NOARGS,"Kp"},
120     {"Ki", (PyCFunction) Method_arm_pid_instance_q15_Ki,METH_NOARGS,"Ki"},
121     {"Kd", (PyCFunction) Method_arm_pid_instance_q15_Kd,METH_NOARGS,"Kd"},
122 
123     {NULL}  /* Sentinel */
124 };
125 
126 
127 DSPType(arm_pid_instance_q15,arm_pid_instance_q15_new,arm_pid_instance_q15_dealloc,arm_pid_instance_q15_init,arm_pid_instance_q15_methods);
128 
129 
130 typedef struct {
131     PyObject_HEAD
132     arm_pid_instance_q31 *instance;
133 } dsp_arm_pid_instance_q31Object;
134 
135 
136 static void
arm_pid_instance_q31_dealloc(dsp_arm_pid_instance_q31Object * self)137 arm_pid_instance_q31_dealloc(dsp_arm_pid_instance_q31Object* self)
138 {
139     //printf("Dealloc called\n");
140     if (self->instance)
141     {
142 
143 
144        PyMem_Free(self->instance);
145     }
146 
147     Py_TYPE(self)->tp_free((PyObject*)self);
148 }
149 
150 
151 static PyObject *
arm_pid_instance_q31_new(PyTypeObject * type,PyObject * args,PyObject * kwds)152 arm_pid_instance_q31_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
153 {
154     dsp_arm_pid_instance_q31Object *self;
155     //printf("New called\n");
156 
157     self = (dsp_arm_pid_instance_q31Object *)type->tp_alloc(type, 0);
158     //printf("alloc called\n");
159 
160     if (self != NULL) {
161 
162         self->instance = PyMem_Malloc(sizeof(arm_pid_instance_q31));
163 
164 
165     }
166 
167 
168     return (PyObject *)self;
169 }
170 
171 static int
arm_pid_instance_q31_init(dsp_arm_pid_instance_q31Object * self,PyObject * args,PyObject * kwds)172 arm_pid_instance_q31_init(dsp_arm_pid_instance_q31Object *self, PyObject *args, PyObject *kwds)
173 {
174 
175 char *kwlist[] = {
176 "A0","A1","A2","state","Kp","Ki","Kd",NULL
177 };
178 
179 if (PyArg_ParseTupleAndKeywords(args, kwds, "|iiiiiii", kwlist,&self->instance->A0
180 ,&self->instance->A1
181 ,&self->instance->A2
182 ,&self->instance->state
183 ,&self->instance->Kp
184 ,&self->instance->Ki
185 ,&self->instance->Kd
186 ))
187     {
188 
189 
190     }
191     return 0;
192 }
193 
194 GETFIELD(arm_pid_instance_q31,A0,"i");
195 GETFIELD(arm_pid_instance_q31,A1,"i");
196 GETFIELD(arm_pid_instance_q31,A2,"i");
197 GETFIELD(arm_pid_instance_q31,state,"i");
198 GETFIELD(arm_pid_instance_q31,Kp,"i");
199 GETFIELD(arm_pid_instance_q31,Ki,"i");
200 GETFIELD(arm_pid_instance_q31,Kd,"i");
201 
202 
203 static PyMethodDef arm_pid_instance_q31_methods[] = {
204 
205     {"A0", (PyCFunction) Method_arm_pid_instance_q31_A0,METH_NOARGS,"A0"},
206     {"A1", (PyCFunction) Method_arm_pid_instance_q31_A1,METH_NOARGS,"A1"},
207     {"A2", (PyCFunction) Method_arm_pid_instance_q31_A2,METH_NOARGS,"A2"},
208     {"state", (PyCFunction) Method_arm_pid_instance_q31_state,METH_NOARGS,"state"},
209     {"Kp", (PyCFunction) Method_arm_pid_instance_q31_Kp,METH_NOARGS,"Kp"},
210     {"Ki", (PyCFunction) Method_arm_pid_instance_q31_Ki,METH_NOARGS,"Ki"},
211     {"Kd", (PyCFunction) Method_arm_pid_instance_q31_Kd,METH_NOARGS,"Kd"},
212 
213     {NULL}  /* Sentinel */
214 };
215 
216 
217 DSPType(arm_pid_instance_q31,arm_pid_instance_q31_new,arm_pid_instance_q31_dealloc,arm_pid_instance_q31_init,arm_pid_instance_q31_methods);
218 
219 
220 typedef struct {
221     PyObject_HEAD
222     arm_pid_instance_f32 *instance;
223 } dsp_arm_pid_instance_f32Object;
224 
225 
226 static void
arm_pid_instance_f32_dealloc(dsp_arm_pid_instance_f32Object * self)227 arm_pid_instance_f32_dealloc(dsp_arm_pid_instance_f32Object* self)
228 {
229     //printf("Dealloc called\n");
230     if (self->instance)
231     {
232 
233 
234        PyMem_Free(self->instance);
235     }
236 
237     Py_TYPE(self)->tp_free((PyObject*)self);
238 }
239 
240 
241 static PyObject *
arm_pid_instance_f32_new(PyTypeObject * type,PyObject * args,PyObject * kwds)242 arm_pid_instance_f32_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
243 {
244     dsp_arm_pid_instance_f32Object *self;
245     //printf("New called\n");
246 
247     self = (dsp_arm_pid_instance_f32Object *)type->tp_alloc(type, 0);
248     //printf("alloc called\n");
249 
250     if (self != NULL) {
251 
252         self->instance = PyMem_Malloc(sizeof(arm_pid_instance_f32));
253 
254 
255     }
256 
257 
258     return (PyObject *)self;
259 }
260 
261 static int
arm_pid_instance_f32_init(dsp_arm_pid_instance_f32Object * self,PyObject * args,PyObject * kwds)262 arm_pid_instance_f32_init(dsp_arm_pid_instance_f32Object *self, PyObject *args, PyObject *kwds)
263 {
264 
265 char *kwlist[] = {
266 "A0","A1","A2","state","Kp","Ki","Kd",NULL
267 };
268 
269 if (PyArg_ParseTupleAndKeywords(args, kwds, "|fffffff", kwlist,&self->instance->A0
270 ,&self->instance->A1
271 ,&self->instance->A2
272 ,&self->instance->state
273 ,&self->instance->Kp
274 ,&self->instance->Ki
275 ,&self->instance->Kd
276 ))
277     {
278 
279 
280     }
281     return 0;
282 }
283 
284 GETFIELD(arm_pid_instance_f32,A0,"f");
285 GETFIELD(arm_pid_instance_f32,A1,"f");
286 GETFIELD(arm_pid_instance_f32,A2,"f");
287 GETFIELD(arm_pid_instance_f32,state,"f");
288 GETFIELD(arm_pid_instance_f32,Kp,"f");
289 GETFIELD(arm_pid_instance_f32,Ki,"f");
290 GETFIELD(arm_pid_instance_f32,Kd,"f");
291 
292 
293 static PyMethodDef arm_pid_instance_f32_methods[] = {
294 
295     {"A0", (PyCFunction) Method_arm_pid_instance_f32_A0,METH_NOARGS,"A0"},
296     {"A1", (PyCFunction) Method_arm_pid_instance_f32_A1,METH_NOARGS,"A1"},
297     {"A2", (PyCFunction) Method_arm_pid_instance_f32_A2,METH_NOARGS,"A2"},
298     {"state", (PyCFunction) Method_arm_pid_instance_f32_state,METH_NOARGS,"state"},
299     {"Kp", (PyCFunction) Method_arm_pid_instance_f32_Kp,METH_NOARGS,"Kp"},
300     {"Ki", (PyCFunction) Method_arm_pid_instance_f32_Ki,METH_NOARGS,"Ki"},
301     {"Kd", (PyCFunction) Method_arm_pid_instance_f32_Kd,METH_NOARGS,"Kd"},
302 
303     {NULL}  /* Sentinel */
304 };
305 
306 
307 DSPType(arm_pid_instance_f32,arm_pid_instance_f32_new,arm_pid_instance_f32_dealloc,arm_pid_instance_f32_init,arm_pid_instance_f32_methods);
308 
309 
310 
311 
typeRegistration(PyObject * module)312 void typeRegistration(PyObject *module) {
313 
314 
315 
316   ADDTYPE(arm_pid_instance_q15);
317   ADDTYPE(arm_pid_instance_q31);
318   ADDTYPE(arm_pid_instance_f32);
319 
320 
321 }
322 
323 
324 static PyObject *
cmsis_arm_pid_init_f32(PyObject * obj,PyObject * args)325 cmsis_arm_pid_init_f32(PyObject *obj, PyObject *args)
326 {
327 
328   PyObject *S=NULL; // input
329   int32_t resetStateFlag; // input
330 
331   if (PyArg_ParseTuple(args,"Oi",&S,&resetStateFlag))
332   {
333 
334     dsp_arm_pid_instance_f32Object *selfS = (dsp_arm_pid_instance_f32Object *)S;
335 
336     arm_pid_init_f32(selfS->instance,resetStateFlag);
337     Py_RETURN_NONE;
338 
339   }
340   return(NULL);
341 }
342 
343 
344 static PyObject *
cmsis_arm_pid_reset_f32(PyObject * obj,PyObject * args)345 cmsis_arm_pid_reset_f32(PyObject *obj, PyObject *args)
346 {
347 
348   PyObject *S=NULL; // input
349 
350   if (PyArg_ParseTuple(args,"O",&S))
351   {
352 
353     dsp_arm_pid_instance_f32Object *selfS = (dsp_arm_pid_instance_f32Object *)S;
354 
355     arm_pid_reset_f32(selfS->instance);
356     Py_RETURN_NONE;
357 
358   }
359   return(NULL);
360 }
361 
362 
363 static PyObject *
cmsis_arm_pid_init_q31(PyObject * obj,PyObject * args)364 cmsis_arm_pid_init_q31(PyObject *obj, PyObject *args)
365 {
366 
367   PyObject *S=NULL; // input
368   int32_t resetStateFlag; // input
369 
370   if (PyArg_ParseTuple(args,"Oi",&S,&resetStateFlag))
371   {
372 
373     dsp_arm_pid_instance_q31Object *selfS = (dsp_arm_pid_instance_q31Object *)S;
374 
375     arm_pid_init_q31(selfS->instance,resetStateFlag);
376     Py_RETURN_NONE;
377 
378   }
379   return(NULL);
380 }
381 
382 
383 static PyObject *
cmsis_arm_pid_reset_q31(PyObject * obj,PyObject * args)384 cmsis_arm_pid_reset_q31(PyObject *obj, PyObject *args)
385 {
386 
387   PyObject *S=NULL; // input
388 
389   if (PyArg_ParseTuple(args,"O",&S))
390   {
391 
392     dsp_arm_pid_instance_q31Object *selfS = (dsp_arm_pid_instance_q31Object *)S;
393 
394     arm_pid_reset_q31(selfS->instance);
395     Py_RETURN_NONE;
396 
397   }
398   return(NULL);
399 }
400 
401 
402 static PyObject *
cmsis_arm_pid_init_q15(PyObject * obj,PyObject * args)403 cmsis_arm_pid_init_q15(PyObject *obj, PyObject *args)
404 {
405 
406   PyObject *S=NULL; // input
407   int32_t resetStateFlag; // input
408 
409   if (PyArg_ParseTuple(args,"Oi",&S,&resetStateFlag))
410   {
411 
412     dsp_arm_pid_instance_q15Object *selfS = (dsp_arm_pid_instance_q15Object *)S;
413 
414     arm_pid_init_q15(selfS->instance,resetStateFlag);
415     Py_RETURN_NONE;
416 
417   }
418   return(NULL);
419 }
420 
421 
422 static PyObject *
cmsis_arm_pid_reset_q15(PyObject * obj,PyObject * args)423 cmsis_arm_pid_reset_q15(PyObject *obj, PyObject *args)
424 {
425 
426   PyObject *S=NULL; // input
427 
428   if (PyArg_ParseTuple(args,"O",&S))
429   {
430 
431     dsp_arm_pid_instance_q15Object *selfS = (dsp_arm_pid_instance_q15Object *)S;
432 
433     arm_pid_reset_q15(selfS->instance);
434     Py_RETURN_NONE;
435 
436   }
437   return(NULL);
438 }
439 
440 
441 
442 
443 
444 static PyObject *
cmsis_arm_sin_cos_f32(PyObject * obj,PyObject * args)445 cmsis_arm_sin_cos_f32(PyObject *obj, PyObject *args)
446 {
447 
448   float32_t theta; // input
449   float32_t pS;
450   float32_t pC;
451 
452   if (PyArg_ParseTuple(args,"f",&theta))
453   {
454 
455 
456 
457     arm_sin_cos_f32(theta,&pS,&pC);
458 
459     PyObject* retS=Py_BuildValue("f",pS);
460     PyObject* retC=Py_BuildValue("f",pC);
461 
462     PyObject *pythonResult = Py_BuildValue("OO",retS,retC);
463 
464     Py_DECREF(retS);
465     Py_DECREF(retC);
466 
467     return(pythonResult);
468 
469   }
470   return(NULL);
471 }
472 
473 
474 static PyObject *
cmsis_arm_sin_cos_q31(PyObject * obj,PyObject * args)475 cmsis_arm_sin_cos_q31(PyObject *obj, PyObject *args)
476 {
477 
478   q31_t theta; // input
479   q31_t pS;
480   q31_t pC;
481 
482   if (PyArg_ParseTuple(args,"i",&theta))
483   {
484 
485     arm_sin_cos_q31(theta,&pS,&pC);
486 
487     PyObject* retS=Py_BuildValue("i",pS);
488     PyObject* retC=Py_BuildValue("i",pC);
489 
490     PyObject *pythonResult = Py_BuildValue("OO",retS,retC);
491 
492     Py_DECREF(retS);
493     Py_DECREF(retC);
494 
495     return(pythonResult);
496 
497   }
498   return(NULL);
499 }
500 
501 
502 
503 
504 static PyObject *
cmsis_arm_pid_f32(PyObject * obj,PyObject * args)505 cmsis_arm_pid_f32(PyObject *obj, PyObject *args)
506 {
507 
508   PyObject *S=NULL; // input
509   float32_t in; // input
510 
511   if (PyArg_ParseTuple(args,"Of",&S,&in))
512   {
513 
514     dsp_arm_pid_instance_f32Object *selfS = (dsp_arm_pid_instance_f32Object *)S;
515 
516     float32_t returnValue = arm_pid_f32(selfS->instance,in);
517     PyObject* theReturnOBJ=Py_BuildValue("f",returnValue);
518 
519     PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
520 
521     Py_DECREF(theReturnOBJ);
522     return(pythonResult);
523 
524   }
525   return(NULL);
526 }
527 
528 
529 static PyObject *
cmsis_arm_pid_q31(PyObject * obj,PyObject * args)530 cmsis_arm_pid_q31(PyObject *obj, PyObject *args)
531 {
532 
533   PyObject *S=NULL; // input
534   q31_t in; // input
535 
536   if (PyArg_ParseTuple(args,"Oi",&S,&in))
537   {
538 
539     dsp_arm_pid_instance_q31Object *selfS = (dsp_arm_pid_instance_q31Object *)S;
540 
541     q31_t returnValue = arm_pid_q31(selfS->instance,in);
542     PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
543 
544     PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
545 
546     Py_DECREF(theReturnOBJ);
547     return(pythonResult);
548 
549   }
550   return(NULL);
551 }
552 
553 
554 static PyObject *
cmsis_arm_pid_q15(PyObject * obj,PyObject * args)555 cmsis_arm_pid_q15(PyObject *obj, PyObject *args)
556 {
557 
558   PyObject *S=NULL; // input
559   q15_t in; // input
560 
561   if (PyArg_ParseTuple(args,"Oh",&S,&in))
562   {
563 
564     dsp_arm_pid_instance_q15Object *selfS = (dsp_arm_pid_instance_q15Object *)S;
565 
566     q15_t returnValue = arm_pid_q15(selfS->instance,in);
567     PyObject* theReturnOBJ=Py_BuildValue("h",returnValue);
568 
569     PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
570 
571     Py_DECREF(theReturnOBJ);
572     return(pythonResult);
573 
574   }
575   return(NULL);
576 }
577 
578 
579 
580 static PyObject *
cmsis_arm_clarke_f32(PyObject * obj,PyObject * args)581 cmsis_arm_clarke_f32(PyObject *obj, PyObject *args)
582 {
583 
584   float32_t Ia; // input
585   float32_t Ib; // input
586   PyObject *pIalpha=NULL; // input
587   float32_t *pIalpha_converted=NULL; // input
588   PyObject *pIbeta=NULL; // input
589   float32_t *pIbeta_converted=NULL; // input
590 
591   if (PyArg_ParseTuple(args,"ffOO",&Ia,&Ib,&pIalpha,&pIbeta))
592   {
593 
594     GETARGUMENT(pIalpha,NPY_DOUBLE,double,float32_t);
595     GETARGUMENT(pIbeta,NPY_DOUBLE,double,float32_t);
596 
597     arm_clarke_f32(Ia,Ib,pIalpha_converted,pIbeta_converted);
598     FREEARGUMENT(pIalpha_converted);
599     FREEARGUMENT(pIbeta_converted);
600     Py_RETURN_NONE;
601 
602   }
603   return(NULL);
604 }
605 
606 
607 static PyObject *
cmsis_arm_clarke_q31(PyObject * obj,PyObject * args)608 cmsis_arm_clarke_q31(PyObject *obj, PyObject *args)
609 {
610 
611   q31_t Ia; // input
612   q31_t Ib; // input
613   PyObject *pIalpha=NULL; // input
614   q31_t *pIalpha_converted=NULL; // input
615   PyObject *pIbeta=NULL; // input
616   q31_t *pIbeta_converted=NULL; // input
617 
618   if (PyArg_ParseTuple(args,"iiOO",&Ia,&Ib,&pIalpha,&pIbeta))
619   {
620 
621     GETARGUMENT(pIalpha,NPY_INT32,int32_t,int32_t);
622     GETARGUMENT(pIbeta,NPY_INT32,int32_t,int32_t);
623 
624     arm_clarke_q31(Ia,Ib,pIalpha_converted,pIbeta_converted);
625     FREEARGUMENT(pIalpha_converted);
626     FREEARGUMENT(pIbeta_converted);
627     Py_RETURN_NONE;
628 
629   }
630   return(NULL);
631 }
632 
633 
634 
635 
636 static PyObject *
cmsis_arm_inv_clarke_f32(PyObject * obj,PyObject * args)637 cmsis_arm_inv_clarke_f32(PyObject *obj, PyObject *args)
638 {
639 
640   float32_t Ialpha; // input
641   float32_t Ibeta; // input
642   PyObject *pIa=NULL; // input
643   float32_t *pIa_converted=NULL; // input
644   PyObject *pIb=NULL; // input
645   float32_t *pIb_converted=NULL; // input
646 
647   if (PyArg_ParseTuple(args,"ffOO",&Ialpha,&Ibeta,&pIa,&pIb))
648   {
649 
650     GETARGUMENT(pIa,NPY_DOUBLE,double,float32_t);
651     GETARGUMENT(pIb,NPY_DOUBLE,double,float32_t);
652 
653     arm_inv_clarke_f32(Ialpha,Ibeta,pIa_converted,pIb_converted);
654     FREEARGUMENT(pIa_converted);
655     FREEARGUMENT(pIb_converted);
656     Py_RETURN_NONE;
657 
658   }
659   return(NULL);
660 }
661 
662 
663 static PyObject *
cmsis_arm_inv_clarke_q31(PyObject * obj,PyObject * args)664 cmsis_arm_inv_clarke_q31(PyObject *obj, PyObject *args)
665 {
666 
667   q31_t Ialpha; // input
668   q31_t Ibeta; // input
669   PyObject *pIa=NULL; // input
670   q31_t *pIa_converted=NULL; // input
671   PyObject *pIb=NULL; // input
672   q31_t *pIb_converted=NULL; // input
673 
674   if (PyArg_ParseTuple(args,"iiOO",&Ialpha,&Ibeta,&pIa,&pIb))
675   {
676 
677     GETARGUMENT(pIa,NPY_INT32,int32_t,int32_t);
678     GETARGUMENT(pIb,NPY_INT32,int32_t,int32_t);
679 
680     arm_inv_clarke_q31(Ialpha,Ibeta,pIa_converted,pIb_converted);
681     FREEARGUMENT(pIa_converted);
682     FREEARGUMENT(pIb_converted);
683     Py_RETURN_NONE;
684 
685   }
686   return(NULL);
687 }
688 
689 
690 
691 
692 static PyObject *
cmsis_arm_park_f32(PyObject * obj,PyObject * args)693 cmsis_arm_park_f32(PyObject *obj, PyObject *args)
694 {
695 
696   float32_t Ialpha; // input
697   float32_t Ibeta; // input
698   PyObject *pId=NULL; // input
699   float32_t *pId_converted=NULL; // input
700   PyObject *pIq=NULL; // input
701   float32_t *pIq_converted=NULL; // input
702   float32_t sinVal; // input
703   float32_t cosVal; // input
704 
705   if (PyArg_ParseTuple(args,"ffOOff",&Ialpha,&Ibeta,&pId,&pIq,&sinVal,&cosVal))
706   {
707 
708     GETARGUMENT(pId,NPY_DOUBLE,double,float32_t);
709     GETARGUMENT(pIq,NPY_DOUBLE,double,float32_t);
710 
711     arm_park_f32(Ialpha,Ibeta,pId_converted,pIq_converted,sinVal,cosVal);
712     FREEARGUMENT(pId_converted);
713     FREEARGUMENT(pIq_converted);
714     Py_RETURN_NONE;
715 
716   }
717   return(NULL);
718 }
719 
720 
721 static PyObject *
cmsis_arm_park_q31(PyObject * obj,PyObject * args)722 cmsis_arm_park_q31(PyObject *obj, PyObject *args)
723 {
724 
725   q31_t Ialpha; // input
726   q31_t Ibeta; // input
727   PyObject *pId=NULL; // input
728   q31_t *pId_converted=NULL; // input
729   PyObject *pIq=NULL; // input
730   q31_t *pIq_converted=NULL; // input
731   q31_t sinVal; // input
732   q31_t cosVal; // input
733 
734   if (PyArg_ParseTuple(args,"iiOOii",&Ialpha,&Ibeta,&pId,&pIq,&sinVal,&cosVal))
735   {
736 
737     GETARGUMENT(pId,NPY_INT32,int32_t,int32_t);
738     GETARGUMENT(pIq,NPY_INT32,int32_t,int32_t);
739 
740     arm_park_q31(Ialpha,Ibeta,pId_converted,pIq_converted,sinVal,cosVal);
741     FREEARGUMENT(pId_converted);
742     FREEARGUMENT(pIq_converted);
743     Py_RETURN_NONE;
744 
745   }
746   return(NULL);
747 }
748 
749 
750 
751 
752 
753 static PyObject *
cmsis_arm_inv_park_f32(PyObject * obj,PyObject * args)754 cmsis_arm_inv_park_f32(PyObject *obj, PyObject *args)
755 {
756 
757   float32_t Id; // input
758   float32_t Iq; // input
759   PyObject *pIalpha=NULL; // input
760   float32_t *pIalpha_converted=NULL; // input
761   PyObject *pIbeta=NULL; // input
762   float32_t *pIbeta_converted=NULL; // input
763   float32_t sinVal; // input
764   float32_t cosVal; // input
765 
766   if (PyArg_ParseTuple(args,"ffOOff",&Id,&Iq,&pIalpha,&pIbeta,&sinVal,&cosVal))
767   {
768 
769     GETARGUMENT(pIalpha,NPY_DOUBLE,double,float32_t);
770     GETARGUMENT(pIbeta,NPY_DOUBLE,double,float32_t);
771 
772     arm_inv_park_f32(Id,Iq,pIalpha_converted,pIbeta_converted,sinVal,cosVal);
773     FREEARGUMENT(pIalpha_converted);
774     FREEARGUMENT(pIbeta_converted);
775     Py_RETURN_NONE;
776 
777   }
778   return(NULL);
779 }
780 
781 
782 static PyObject *
cmsis_arm_inv_park_q31(PyObject * obj,PyObject * args)783 cmsis_arm_inv_park_q31(PyObject *obj, PyObject *args)
784 {
785 
786   q31_t Id; // input
787   q31_t Iq; // input
788   PyObject *pIalpha=NULL; // input
789   q31_t *pIalpha_converted=NULL; // input
790   PyObject *pIbeta=NULL; // input
791   q31_t *pIbeta_converted=NULL; // input
792   q31_t sinVal; // input
793   q31_t cosVal; // input
794 
795   if (PyArg_ParseTuple(args,"iiOOii",&Id,&Iq,&pIalpha,&pIbeta,&sinVal,&cosVal))
796   {
797 
798     GETARGUMENT(pIalpha,NPY_INT32,int32_t,int32_t);
799     GETARGUMENT(pIbeta,NPY_INT32,int32_t,int32_t);
800 
801     arm_inv_park_q31(Id,Iq,pIalpha_converted,pIbeta_converted,sinVal,cosVal);
802     FREEARGUMENT(pIalpha_converted);
803     FREEARGUMENT(pIbeta_converted);
804     Py_RETURN_NONE;
805 
806   }
807   return(NULL);
808 }
809 
810 
811 
812 
813 static PyMethodDef CMSISDSPMethods[] = {
814 
815 
816 
817 {"arm_pid_init_f32",  cmsis_arm_pid_init_f32, METH_VARARGS,""},
818 {"arm_pid_reset_f32",  cmsis_arm_pid_reset_f32, METH_VARARGS,""},
819 {"arm_pid_init_q31",  cmsis_arm_pid_init_q31, METH_VARARGS,""},
820 {"arm_pid_reset_q31",  cmsis_arm_pid_reset_q31, METH_VARARGS,""},
821 {"arm_pid_init_q15",  cmsis_arm_pid_init_q15, METH_VARARGS,""},
822 {"arm_pid_reset_q15",  cmsis_arm_pid_reset_q15, METH_VARARGS,""},
823 
824 
825 {"arm_sin_cos_f32",  cmsis_arm_sin_cos_f32, METH_VARARGS,""},
826 {"arm_sin_cos_q31",  cmsis_arm_sin_cos_q31, METH_VARARGS,""},
827 
828 {"arm_pid_f32",  cmsis_arm_pid_f32, METH_VARARGS,""},
829 {"arm_pid_q31",  cmsis_arm_pid_q31, METH_VARARGS,""},
830 {"arm_pid_q15",  cmsis_arm_pid_q15, METH_VARARGS,""},
831 
832 {"arm_clarke_f32",  cmsis_arm_clarke_f32, METH_VARARGS,""},
833 {"arm_clarke_q31",  cmsis_arm_clarke_q31, METH_VARARGS,""},
834 {"arm_inv_clarke_f32",  cmsis_arm_inv_clarke_f32, METH_VARARGS,""},
835 {"arm_inv_clarke_q31",  cmsis_arm_inv_clarke_q31, METH_VARARGS,""},
836 {"arm_park_f32",  cmsis_arm_park_f32, METH_VARARGS,""},
837 {"arm_park_q31",  cmsis_arm_park_q31, METH_VARARGS,""},
838 {"arm_inv_park_f32",  cmsis_arm_inv_park_f32, METH_VARARGS,""},
839 {"arm_inv_park_q31",  cmsis_arm_inv_park_q31, METH_VARARGS,""},
840 
841 
842     {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
843     {NULL, NULL, 0, NULL}        /* Sentinel */
844 };
845 
846 #ifdef IS_PY3K
cmsisdsp_traverse(PyObject * m,visitproc visit,void * arg)847 static int cmsisdsp_traverse(PyObject *m, visitproc visit, void *arg) {
848     Py_VISIT(GETSTATE(m)->error);
849     return 0;
850 }
851 
cmsisdsp_clear(PyObject * m)852 static int cmsisdsp_clear(PyObject *m) {
853     Py_CLEAR(GETSTATE(m)->error);
854     return 0;
855 }
856 
857 
858 static struct PyModuleDef moduledef = {
859         PyModuleDef_HEAD_INIT,
860         MODNAME,
861         NULL,
862         sizeof(struct module_state),
863         CMSISDSPMethods,
864         NULL,
865         cmsisdsp_traverse,
866         cmsisdsp_clear,
867         NULL
868 };
869 
870 #define INITERROR return NULL
871 
872 PyMODINIT_FUNC
CAT(PyInit_,MODINITNAME)873 CAT(PyInit_,MODINITNAME)(void)
874 
875 
876 #else
877 #define INITERROR return
878 
879 void CAT(init,MODINITNAME)(void)
880 #endif
881 {
882     import_array();
883 
884   #ifdef IS_PY3K
885     PyObject *module = PyModule_Create(&moduledef);
886   #else
887     PyObject *module = Py_InitModule(MODNAME, CMSISDSPMethods);
888   #endif
889 
890   if (module == NULL)
891       INITERROR;
892   struct module_state *st = GETSTATE(module);
893 
894   st->error = PyErr_NewException(MODNAME".Error", NULL, NULL);
895   if (st->error == NULL) {
896       Py_DECREF(module);
897       INITERROR;
898   }
899 
900 
901   typeRegistration(module);
902 
903   #ifdef IS_PY3K
904     return module;
905   #endif
906 }