 17d6b9f612
			
		
	
	
		17d6b9f612
		
			
		
	
	
	
	
		
			
			* Bugfix: remove freeing of uninitialized object (IrdaAppSignal). Therefore rubbish in memory sometimes caused HardFault. * Fix: slow FFF makes IR-remotes loading take much time, so we can glimpse previous scene's view while remote is parsing. Reproducing: remove remote, fast press back (while popup is playing) and select new remote - previous popup view is displayed.
		
			
				
	
	
		
			117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "irda_app_signal.h"
 | |
| #include <irda_transmit.h>
 | |
| 
 | |
| void IrdaAppSignal::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 IrdaAppSignal::clear_timings() {
 | |
|     if(raw_signal) {
 | |
|         delete[] payload.raw.timings;
 | |
|         payload.raw.timings_cnt = 0;
 | |
|         payload.raw.timings = nullptr;
 | |
|     }
 | |
| }
 | |
| 
 | |
| IrdaAppSignal::IrdaAppSignal(
 | |
|     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);
 | |
| }
 | |
| 
 | |
| IrdaAppSignal::IrdaAppSignal(const IrdaMessage* irda_message) {
 | |
|     raw_signal = false;
 | |
|     payload.message = *irda_message;
 | |
| }
 | |
| 
 | |
| IrdaAppSignal& IrdaAppSignal::operator=(const IrdaAppSignal& 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;
 | |
| }
 | |
| 
 | |
| IrdaAppSignal::IrdaAppSignal(const IrdaAppSignal& 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);
 | |
|     }
 | |
| }
 | |
| 
 | |
| IrdaAppSignal::IrdaAppSignal(IrdaAppSignal&& 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 IrdaAppSignal::set_message(const IrdaMessage* irda_message) {
 | |
|     clear_timings();
 | |
|     raw_signal = false;
 | |
|     payload.message = *irda_message;
 | |
| }
 | |
| 
 | |
| void IrdaAppSignal::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 IrdaAppSignal::transmit() const {
 | |
|     if(!raw_signal) {
 | |
|         irda_send(&payload.message, 1);
 | |
|     } else {
 | |
|         irda_send_raw_ext(
 | |
|             payload.raw.timings,
 | |
|             payload.raw.timings_cnt,
 | |
|             true,
 | |
|             payload.raw.frequency,
 | |
|             payload.raw.duty_cycle);
 | |
|     }
 | |
| }
 |