| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include "infrared_app_signal.h"
- #include <infrared_transmit.h>
- void InfraredAppSignal::copy_raw_signal(
- const uint32_t* timings,
- size_t size,
- uint32_t frequency,
- float duty_cycle) {
- furi_assert(size);
- furi_assert(timings);
- payload.raw.frequency = frequency;
- payload.raw.duty_cycle = duty_cycle;
- payload.raw.timings_cnt = size;
- if(size) {
- payload.raw.timings = new uint32_t[size];
- memcpy(payload.raw.timings, timings, size * sizeof(uint32_t));
- }
- }
- void InfraredAppSignal::clear_timings() {
- if(raw_signal) {
- delete[] payload.raw.timings;
- payload.raw.timings_cnt = 0;
- payload.raw.timings = nullptr;
- }
- }
- InfraredAppSignal::InfraredAppSignal(
- const uint32_t* timings,
- size_t timings_cnt,
- uint32_t frequency,
- float duty_cycle) {
- raw_signal = true;
- copy_raw_signal(timings, timings_cnt, frequency, duty_cycle);
- }
- InfraredAppSignal::InfraredAppSignal(const InfraredMessage* infrared_message) {
- raw_signal = false;
- payload.message = *infrared_message;
- }
- InfraredAppSignal& InfraredAppSignal::operator=(const InfraredAppSignal& other) {
- clear_timings();
- raw_signal = other.raw_signal;
- if(!raw_signal) {
- payload.message = other.payload.message;
- } else {
- copy_raw_signal(
- other.payload.raw.timings,
- other.payload.raw.timings_cnt,
- other.payload.raw.frequency,
- other.payload.raw.duty_cycle);
- }
- return *this;
- }
- InfraredAppSignal::InfraredAppSignal(const InfraredAppSignal& other) {
- raw_signal = other.raw_signal;
- if(!raw_signal) {
- payload.message = other.payload.message;
- } else {
- copy_raw_signal(
- other.payload.raw.timings,
- other.payload.raw.timings_cnt,
- other.payload.raw.frequency,
- other.payload.raw.duty_cycle);
- }
- }
- InfraredAppSignal::InfraredAppSignal(InfraredAppSignal&& other) {
- raw_signal = other.raw_signal;
- if(!raw_signal) {
- payload.message = other.payload.message;
- } else {
- furi_assert(other.payload.raw.timings_cnt > 0);
- payload.raw.timings = other.payload.raw.timings;
- payload.raw.timings_cnt = other.payload.raw.timings_cnt;
- payload.raw.frequency = other.payload.raw.frequency;
- payload.raw.duty_cycle = other.payload.raw.duty_cycle;
- other.payload.raw.timings = nullptr;
- other.payload.raw.timings_cnt = 0;
- other.raw_signal = false;
- }
- }
- void InfraredAppSignal::set_message(const InfraredMessage* infrared_message) {
- clear_timings();
- raw_signal = false;
- payload.message = *infrared_message;
- }
- void InfraredAppSignal::set_raw_signal(
- uint32_t* timings,
- size_t timings_cnt,
- uint32_t frequency,
- float duty_cycle) {
- clear_timings();
- raw_signal = true;
- copy_raw_signal(timings, timings_cnt, frequency, duty_cycle);
- }
- void InfraredAppSignal::transmit() const {
- if(!raw_signal) {
- infrared_send(&payload.message, 1);
- } else {
- infrared_send_raw_ext(
- payload.raw.timings,
- payload.raw.timings_cnt,
- true,
- payload.raw.frequency,
- payload.raw.duty_cycle);
- }
- }
|