2 * This file is part of the libsigrokdecode project.
4 * Copyright (C) 2012 Bert Vermeulen <bert@biot.com>
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "libsigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
25 static PyObject
*srd_logic_iter(PyObject
*self
)
30 static PyObject
*srd_logic_iternext(PyObject
*self
)
33 PyObject
*py_samplenum
, *py_samples
;
34 uint8_t *sample_pos
, sample
;
35 int byte_offset
, bit_offset
, i
;
37 logic
= (srd_logic
*)self
;
38 if (logic
->itercnt
>= logic
->inbuflen
/ logic
->di
->data_unitsize
) {
39 /* End iteration loop. */
44 * Convert the bit-packed sample to an array of bytes, with only 0x01
45 * and 0x00 values, so the PD doesn't need to do any bitshifting.
47 sample_pos
= logic
->inbuf
+ logic
->itercnt
* logic
->di
->data_unitsize
;
48 for (i
= 0; i
< logic
->di
->dec_num_channels
; i
++) {
49 /* A channelmap value of -1 means "unused optional channel". */
50 if (logic
->di
->dec_channelmap
[i
] == -1) {
51 /* Value of unused channel is 0xff, instead of 0 or 1. */
52 logic
->di
->channel_samples
[i
] = 0xff;
54 byte_offset
= logic
->di
->dec_channelmap
[i
] / 8;
55 bit_offset
= logic
->di
->dec_channelmap
[i
] % 8;
56 sample
= *(sample_pos
+ byte_offset
) & (1 << bit_offset
) ? 1 : 0;
57 logic
->di
->channel_samples
[i
] = sample
;
61 /* Prepare the next samplenum/sample list in this iteration. */
63 PyLong_FromUnsignedLongLong(logic
->start_samplenum
+
65 PyList_SetItem(logic
->sample
, 0, py_samplenum
);
66 py_samples
= PyBytes_FromStringAndSize((const char *)logic
->di
->channel_samples
,
67 logic
->di
->dec_num_channels
);
68 PyList_SetItem(logic
->sample
, 1, py_samples
);
69 Py_INCREF(logic
->sample
);
76 SRD_PRIV PyTypeObject srd_logic_type
= {
77 PyVarObject_HEAD_INIT(NULL
, 0)
78 .tp_name
= "srd_logic",
79 .tp_basicsize
= sizeof(srd_logic
),
80 .tp_flags
= Py_TPFLAGS_DEFAULT
,
81 .tp_doc
= "Sigrokdecode logic sample object",
82 .tp_iter
= srd_logic_iter
,
83 .tp_iternext
= srd_logic_iternext
,