flipperzero-firmware/applications/infrared/infrared_app_signal.h

135 lines
3.6 KiB
C
Raw Normal View History

/**
* @file infrared_app_signal.h
* Infrared: Signal class
*/
#pragma once
#include <infrared_worker.h>
#include <stdint.h>
#include <string>
#include <infrared.h>
/** Infrared application signal class */
class InfraredAppSignal {
public:
/** Raw signal structure */
typedef struct {
/** Timings amount */
size_t timings_cnt;
/** Samples of raw signal in ms */
uint32_t* timings;
/** PWM Frequency of raw signal */
uint32_t frequency;
/** PWM Duty cycle of raw signal */
float duty_cycle;
} RawSignal;
private:
/** if true - signal is raw, if false - signal is parsed */
bool raw_signal;
/** signal data, either raw or parsed */
union {
/** signal data for parsed signal */
InfraredMessage message;
/** raw signal data */
RawSignal raw;
} payload;
/** Copy raw signal into object
*
* @param timings - timings (samples) of raw signal
* @param size - number of timings
* @frequency - PWM frequency of raw signal
* @duty_cycle - PWM duty cycle
*/
void
copy_raw_signal(const uint32_t* timings, size_t size, uint32_t frequency, float duty_cycle);
/** Clear and free timings data */
void clear_timings();
public:
/** Construct Infrared signal class */
InfraredAppSignal() {
raw_signal = false;
payload.message.protocol = InfraredProtocolUnknown;
}
/** Destruct signal class and free all allocated data */
~InfraredAppSignal() {
clear_timings();
}
/** Construct object with raw signal
*
* @param timings - timings (samples) of raw signal
* @param size - number of timings
* @frequency - PWM frequency of raw signal
* @duty_cycle - PWM duty cycle
*/
InfraredAppSignal(
const uint32_t* timings,
size_t timings_cnt,
uint32_t frequency,
float duty_cycle);
/** Construct object with parsed signal
*
* @param infrared_message - parsed_signal to construct from
*/
InfraredAppSignal(const InfraredMessage* infrared_message);
/** Copy constructor */
InfraredAppSignal(const InfraredAppSignal& other);
/** Move constructor */
InfraredAppSignal(InfraredAppSignal&& other);
/** Assignment operator */
InfraredAppSignal& operator=(const InfraredAppSignal& signal);
/** Set object to parsed signal
*
* @param infrared_message - parsed_signal to construct from
*/
void set_message(const InfraredMessage* infrared_message);
/** Set object to raw signal
*
* @param timings - timings (samples) of raw signal
* @param size - number of timings
* @frequency - PWM frequency of raw signal
* @duty_cycle - PWM duty cycle
*/
void
set_raw_signal(uint32_t* timings, size_t timings_cnt, uint32_t frequency, float duty_cycle);
/** Transmit held signal (???) */
void transmit() const;
/** Show is held signal raw
*
* @retval true if signal is raw, false if signal is parsed
*/
bool is_raw(void) const {
return raw_signal;
}
/** Get parsed signal.
* User must check is_raw() signal before calling this function.
*
* @retval parsed signal pointer
*/
const InfraredMessage& get_message(void) const {
furi_assert(!raw_signal);
return payload.message;
}
/** Get raw signal.
* User must check is_raw() signal before calling this function.
*
* @retval raw signal
*/
const RawSignal& get_raw_signal(void) const {
furi_assert(raw_signal);
return payload.raw;
}
};