flipperzero-firmware/applications/irda/irda_nec.c
DrZlo13 37fc47a24f
IR transmit example (#180)
* DWT-based microsecond delay

* simple ir app (work only with NEC protocol and predefined address - command)

* remove space from file name, add delay_us_init_DWT header

* float-based delay us

* init tim2 by CubeMX

* fix simple pwm functions

* simple pwm timer based ir nec protocol

* ir gui test app

Co-authored-by: aanper <mail@s3f.ru>
2020-10-23 12:39:11 +03:00

46 lines
1.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "flipper.h"
#include "irda_nec.h"
#include "irda_protocols.h"
void ir_nec_preambula(void) {
// 9ms carrier + 4.5ms pause
pwm_set(NEC_DUTY_CYCLE, NEC_CARRIER_FREQUENCY, &htim2, TIM_CHANNEL_4);
delay_us(9000);
pwm_stop(&htim2, TIM_CHANNEL_4);
delay_us(4500);
}
void ir_nec_send_bit(bool bit) {
// 0 is 562.5us carrier + 1687.5us pause
// 1 is 562.5us carrier + 562.5us pause
pwm_set(NEC_DUTY_CYCLE, NEC_CARRIER_FREQUENCY, &htim2, TIM_CHANNEL_4);
delay_us(562.5);
pwm_stop(&htim2, TIM_CHANNEL_4);
if(bit) {
delay_us(562.5);
} else {
delay_us(1687.5);
}
}
void ir_nec_send_byte(uint8_t data) {
for(uint8_t i = 0; i < 8; i++) {
ir_nec_send_bit((data & (1 << (i))) != 0);
}
}
void ir_nec_send(uint8_t addr, uint8_t data) {
// nec protocol is:
// preambula + addr + inverse addr + command + inverse command + bit pulse
//
// oddly enough, my analyzer (https://github.com/ukw100/IRMP) displays the reverse command
// and I dont know if this is my fault or a feature of the analyzer
// TODO: check the dictionary and check with a known remote
uint8_t nec_packet[4] = {addr, ~(uint8_t)addr, ~(uint8_t)data, data};
ir_nec_preambula();
ir_nec_send_byte(nec_packet[0]);
ir_nec_send_byte(nec_packet[1]);
ir_nec_send_byte(nec_packet[2]);
ir_nec_send_byte(nec_packet[3]);
ir_nec_send_bit(1);
}