* Add RAW format * F5 stubs for build to pass * Fix saving decoded signal error * Irda: set ISR before starting timer, remove explicit NVIC configuration Co-authored-by: あく <alleteam@gmail.com>
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "irda-app-signal.h"
 | 
						|
#include <irda_transmit.h>
 | 
						|
 | 
						|
void IrdaAppSignal::copy_timings(const uint32_t* timings, size_t size) {
 | 
						|
    furi_assert(size);
 | 
						|
    furi_assert(timings);
 | 
						|
 | 
						|
    if(size) {
 | 
						|
        payload.raw.timings = new uint32_t[size];
 | 
						|
        payload.raw.timings_cnt = size;
 | 
						|
        memcpy(payload.raw.timings, timings, size * sizeof(uint32_t));
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void IrdaAppSignal::clear_timings() {
 | 
						|
    if(!decoded) {
 | 
						|
        delete[] payload.raw.timings;
 | 
						|
        payload.raw.timings_cnt = 0;
 | 
						|
        payload.raw.timings = nullptr;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
IrdaAppSignal::IrdaAppSignal(const uint32_t* timings, size_t timings_cnt) {
 | 
						|
    decoded = false;
 | 
						|
    copy_timings(timings, timings_cnt);
 | 
						|
}
 | 
						|
 | 
						|
IrdaAppSignal::IrdaAppSignal(const IrdaMessage* irda_message) {
 | 
						|
    decoded = true;
 | 
						|
    payload.message = *irda_message;
 | 
						|
}
 | 
						|
 | 
						|
IrdaAppSignal& IrdaAppSignal::operator=(const IrdaAppSignal& other) {
 | 
						|
    clear_timings();
 | 
						|
    decoded = other.decoded;
 | 
						|
    if(decoded) {
 | 
						|
        payload.message = other.payload.message;
 | 
						|
    } else {
 | 
						|
        copy_timings(other.payload.raw.timings, other.payload.raw.timings_cnt);
 | 
						|
    }
 | 
						|
 | 
						|
    return *this;
 | 
						|
}
 | 
						|
 | 
						|
IrdaAppSignal::IrdaAppSignal(const IrdaAppSignal& other) {
 | 
						|
    decoded = other.decoded;
 | 
						|
    if(decoded) {
 | 
						|
        payload.message = other.payload.message;
 | 
						|
    } else {
 | 
						|
        copy_timings(other.payload.raw.timings, other.payload.raw.timings_cnt);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
IrdaAppSignal::IrdaAppSignal(IrdaAppSignal&& other) {
 | 
						|
    clear_timings();
 | 
						|
 | 
						|
    decoded = other.decoded;
 | 
						|
    if(decoded) {
 | 
						|
        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;
 | 
						|
        other.payload.raw.timings = nullptr;
 | 
						|
        other.payload.raw.timings_cnt = 0;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void IrdaAppSignal::set_message(const IrdaMessage* irda_message) {
 | 
						|
    clear_timings();
 | 
						|
    decoded = true;
 | 
						|
    payload.message = *irda_message;
 | 
						|
}
 | 
						|
 | 
						|
void IrdaAppSignal::set_raw_signal(uint32_t* timings, size_t timings_cnt) {
 | 
						|
    clear_timings();
 | 
						|
    decoded = false;
 | 
						|
    payload.raw.timings = timings;
 | 
						|
    payload.raw.timings_cnt = timings_cnt;
 | 
						|
}
 | 
						|
 | 
						|
void IrdaAppSignal::copy_raw_signal(uint32_t* timings, size_t timings_cnt) {
 | 
						|
    clear_timings();
 | 
						|
    decoded = false;
 | 
						|
    copy_timings(timings, timings_cnt);
 | 
						|
}
 | 
						|
 | 
						|
void IrdaAppSignal::transmit() const {
 | 
						|
    if(decoded) {
 | 
						|
        irda_send(&payload.message, 1);
 | 
						|
    } else {
 | 
						|
        irda_send_raw(payload.raw.timings, payload.raw.timings_cnt, true);
 | 
						|
    }
 | 
						|
}
 |