]> sigrok.org Git - libsigrokdecode.git/blob - irmp/irmp-main-sharedlib.h
irmp: rework shared library (style, reliability, TODO items)
[libsigrokdecode.git] / irmp / irmp-main-sharedlib.h
1 /*
2  * irmp-main-sharedlib.h
3  *
4  * Copyright (c) 2009-2019 Frank Meyer - frank(at)fli4l.de
5  * Copyright (c) 2009-2019 RenĂ© Staffen - r.staffen(at)gmx.de
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  */
12
13 #ifndef IRMP_SHAREDLIB_H
14 #define IRMP_SHAREDLIB_H
15
16 #include <stdint.h>
17 #include <stdlib.h>
18
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22
23 /* Export the public API routines. */
24 #ifndef IRMP_DLLEXPORT
25 #  if defined WIN32 && defined _MSC_VER
26 #    define IRMP_DLLEXPORT __declspec(dllexport)
27 #  else
28 #    define IRMP_DLLEXPORT __attribute__((visibility("default")))
29 #  endif
30 #endif
31
32 /* Part of the library API is optional. */
33 #define WITH_IRMP_DETECT_BUFFER 0
34
35 /**
36  * @brief IR decoder result data at the library's public API.
37  */
38 struct irmp_result_data {
39         uint32_t protocol;      /**!< protocol, e.g. NEC_PROTOCOL */
40         const char *protocol_name;      /**!< name of the protocol */
41         uint32_t address;       /**!< address */
42         uint32_t command;       /**!< command */
43         uint32_t flags;         /**!< flags currently only repetition (bit 0) */
44         uint32_t start_sample;  /**!< the sampleindex there the detected command started */
45         uint32_t end_sample;    /**!< the sampleindex there the detected command ended */
46 };
47
48 #define IRMP_DATA_FLAG_REPETITION       (1 << 0)
49
50 /**
51  * @brief Query the IRMP library's configured sample rate.
52  *
53  * The internally used sample rate is a compile time option. Any data
54  * that is provided at runtime needs to match this rate, or detection
55  * will fail.
56  */
57 IRMP_DLLEXPORT uint32_t irmp_get_sample_rate(void);
58
59 /**
60  * @brief Reset internal decoder state.
61  *
62  * This must be called before data processing starts.
63  */
64 IRMP_DLLEXPORT void irmp_reset_state(void);
65
66 /**
67  * @brief Feed an individual sample to the detector.
68  *
69  * See @ref irmp_get_result_data() for result retrieval when detection
70  * of an IR frame completes. Make sure @ref irmp_reset_state() was
71  * called before providing the first sample.
72  *
73  * @param[in] sample The pin value to feed to the detector.
74  *
75  * @returns Non-zero when an IR frame was detected.
76  */
77 IRMP_DLLEXPORT int irmp_add_one_sample(int sample);
78
79 #if WITH_IRMP_DETECT_BUFFER
80 /**
81  * @brief Process the given buffer until an IR frame is found.
82  *
83  * Stops at the first detected IR frame, and returns its data. Subsequent
84  * calls resume processing at the previously stopped position. Make sure
85  * @ref irmp_reset_state() was called before the first detect call.
86  *
87  * @param[in] buf Pointer to the data buffer.
88  * @param[in] len Number of samples in the Buffer.
89  */
90 IRMP_DLLEXPORT struct irmp_result_data irmp_detect_buffer(const uint8_t *buf, size_t len);
91 #endif
92
93 /**
94  * @brief Query result data after detection succeeded.
95  *
96  * @param[out] data The caller provided result buffer.
97  *
98  * @returns Non-zero if data was available, zero otherwise.
99  */
100 IRMP_DLLEXPORT int irmp_get_result_data(struct irmp_result_data *data);
101
102 /**
103  * @brief Resolve the protocol identifer to the protocol's name.
104  *
105  * @param[in] protocol The numerical identifier.
106  *
107  * @returns A pointer to the string literal, or #NULL in case of failure.
108  */
109 IRMP_DLLEXPORT const char *irmp_get_protocol_name(uint32_t protocol);
110
111 #ifdef __cplusplus
112 }
113 #endif
114
115 #endif