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 }