mirror of
				https://github.com/Show-maket/IR-protocol.git
				synced 2025-10-31 02:52:36 +00:00 
			
		
		
		
	Compare commits
	
		
			5 Commits
		
	
	
		
			2db1ef7805
			...
			STM32-opti
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2d839d3ff8 | |||
| 6ba8fdffe4 | |||
| aa0b478229 | |||
| 277985f79a | |||
| 444b84c313 | 
							
								
								
									
										4
									
								
								.vscode/arduino.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.vscode/arduino.json
									
									
									
									
										vendored
									
									
								
							| @ -1,7 +1,5 @@ | |||||||
| { | { | ||||||
|     "board": "STMicroelectronics:stm32:GenF4", |     "board": "STMicroelectronics:stm32:GenF4", | ||||||
|     "port": "COM17", |     "port": "COM17", | ||||||
|     "prebuild": "if exist bin rd /s /q bin", |     "prebuild": "if exist bin rd /s /q bin" | ||||||
|     "configuration": "clock=25MHz,pnum=MAKET_F401RETX,upload_method=swdMethod,xserial=generic,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano", |  | ||||||
|     "sketch": "IR-protocol.ino" |  | ||||||
| } | } | ||||||
							
								
								
									
										108
									
								
								IR_Encoder.cpp
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								IR_Encoder.cpp
									
									
									
									
									
								
							| @ -5,11 +5,8 @@ | |||||||
| #define ISR_Out 10 | #define ISR_Out 10 | ||||||
| #define TestOut 13 | #define TestOut 13 | ||||||
|  |  | ||||||
| std::list<IR_Encoder *> &IR_Encoder::get_enc_list() // определение функции | IR_Encoder *IR_Encoder::head = nullptr; | ||||||
| { | IR_Encoder *IR_Encoder::last = nullptr; | ||||||
|     static std::list<IR_Encoder *> dec_list; // статическая локальная переменная |  | ||||||
|     return dec_list;                         // возвращается ссылка на переменную |  | ||||||
| } |  | ||||||
|  |  | ||||||
| IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool autoHandle) | IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool autoHandle) | ||||||
| { | { | ||||||
| @ -32,45 +29,88 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool | |||||||
|  |  | ||||||
|     if (autoHandle) |     if (autoHandle) | ||||||
|     { |     { | ||||||
|         get_enc_list().push_back(this); |         if (IR_Encoder::head == nullptr) | ||||||
|  |         { | ||||||
|  |         IR_Encoder::head = this; | ||||||
|  |         } | ||||||
|  |         if (last != nullptr) | ||||||
|  |         { | ||||||
|  |         last->next = this; | ||||||
|  |         } | ||||||
|  |         last = this; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |   | ||||||
|  | HardwareTimer* IR_Encoder::IR_Timer = nullptr; | ||||||
|  |  | ||||||
| HardwareTimer IR_Encoder::IR_Timer; | inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} | ||||||
|  |  | ||||||
| inline HardwareTimer* IR_Encoder::get_IR_Timer(){return &IR_Encoder::IR_Timer;} | void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)()){ | ||||||
| // void Encoder_ISR(){ |     IR_Timer = timer; | ||||||
| //     IR_Encoder::isr(); |     if(IR_Timer == nullptr) return; | ||||||
| // } |     IR_Timer->setOverflow(carrierFrec * 2, HERTZ_FORMAT); | ||||||
| void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ |     IR_Timer->attachInterrupt(channel, (isrCallback == nullptr ? IR_Encoder::isr : isrCallback)); | ||||||
|     //TODO: check std::bind isr func |     NVIC_SetPriority(IRQn, priority); | ||||||
|     // IR_Timer = timer; |     IR_Timer->resume(); | ||||||
|     // IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); |  | ||||||
|     // IR_Timer.attachInterrupt(channel, Encoder_ISR); |  | ||||||
|     // NVIC_SetPriority(IRQn, 0); |  | ||||||
|     // IR_Timer.resume(); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void IR_Encoder::enable() | void IR_Encoder::enable() | ||||||
| { | { | ||||||
|     auto &enc_list = get_enc_list(); |     bool exist = false; | ||||||
|     if (std::find(enc_list.begin(), enc_list.end(), this) == enc_list.end()) |     IR_Encoder *current = IR_Encoder::head; | ||||||
|  |     while (current != nullptr) | ||||||
|     { |     { | ||||||
|         enc_list.push_back(this); |         exist = (current == this); | ||||||
|  |         if (exist) break; | ||||||
|  |         current = current->next; | ||||||
|  |     } | ||||||
|  |     if (!exist) | ||||||
|  |     { | ||||||
|  |         if (IR_Encoder::head == nullptr) | ||||||
|  |         { | ||||||
|  |             IR_Encoder::head = this; | ||||||
|  |             last = this; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             last->next = this; | ||||||
|  |             last = this; | ||||||
|  |         } | ||||||
|  |         this->next = nullptr; // Указываем, что следующий за этим элементом — nullptr | ||||||
|     } |     } | ||||||
|     pinMode(pin, OUTPUT); |     pinMode(pin, OUTPUT); | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void IR_Encoder::disable() | void IR_Encoder::disable() | ||||||
| { | { | ||||||
|     auto &enc_list = get_enc_list(); |     IR_Encoder *current = IR_Encoder::head; | ||||||
|     auto it = std::find(enc_list.begin(), enc_list.end(), this); |     IR_Encoder *prev = nullptr; | ||||||
|     if (it != enc_list.end()) |  | ||||||
|  |     while (current != nullptr) | ||||||
|     { |     { | ||||||
|         enc_list.erase(it); |         if (current == this) break; | ||||||
|  |         prev = current; | ||||||
|  |         current = current->next; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (current != nullptr) // Элемент найден в списке | ||||||
|  |     { | ||||||
|  |         if (prev != nullptr) | ||||||
|  |         { | ||||||
|  |             prev->next = current->next; // Убираем текущий элемент из списка | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             IR_Encoder::head = current->next; // Удаляемый элемент был первым | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (current == last) | ||||||
|  |         { | ||||||
|  |             last = prev; // Если удаляется последний элемент, обновляем last | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pinMode(pin, INPUT); |     pinMode(pin, INPUT); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -84,10 +124,7 @@ void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) | |||||||
|     blindDecoders = decoders; |     blindDecoders = decoders; | ||||||
| } | } | ||||||
|  |  | ||||||
| IR_Encoder::~IR_Encoder() | IR_Encoder::~IR_Encoder(){}; | ||||||
| { |  | ||||||
|     get_enc_list().remove(this); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) | void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) | ||||||
| { | { | ||||||
| @ -287,10 +324,11 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) | |||||||
|  |  | ||||||
| void IR_Encoder::isr() | void IR_Encoder::isr() | ||||||
| { | { | ||||||
|     //  Serial.println(get_enc_list().size()); |     IR_Encoder *current = IR_Encoder::head; | ||||||
|     for (const auto &element : get_enc_list()) |     while (current != nullptr) | ||||||
|     { |     { | ||||||
|         element->_isr(); |       current->_isr(); | ||||||
|  |       current = current->next; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -318,9 +356,9 @@ void IR_Encoder::_isr() | |||||||
|             // сброс счетчиков |             // сброс счетчиков | ||||||
|             // ... |             // ... | ||||||
|             isSending = false; |             isSending = false; | ||||||
|             Serial.println("STOP"); |             // Serial.println("STOP"); | ||||||
|             setDecoder_isSending(); |             setDecoder_isSending(); | ||||||
|             Serial.println(); |             // Serial.println(); | ||||||
|             return; |             return; | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								IR_Encoder.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								IR_Encoder.h
									
									
									
									
									
								
							| @ -7,9 +7,11 @@ class IR_DecoderRaw; | |||||||
| class IR_Encoder : public IR_FOX | class IR_Encoder : public IR_FOX | ||||||
| { | { | ||||||
|     friend IR_DecoderRaw; |     friend IR_DecoderRaw; | ||||||
|  |     static IR_Encoder *head; | ||||||
|  |     static IR_Encoder *last; | ||||||
|  |     IR_Encoder *next; | ||||||
| public: | public: | ||||||
|     static HardwareTimer IR_Timer; |     static HardwareTimer* IR_Timer; | ||||||
| private: | private: | ||||||
|     // uint16_t id; /// @brief Адрес передатчика |     // uint16_t id; /// @brief Адрес передатчика | ||||||
| public: | public: | ||||||
| @ -19,7 +21,7 @@ public: | |||||||
|     /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком |     /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком | ||||||
|     IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); |     IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); | ||||||
|     static void isr(); |     static void isr(); | ||||||
|     static void begin(HardwareTimer IR_Timer, uint8_t channel, IRQn_Type IRQn); |     static void begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)() = nullptr); | ||||||
|     static HardwareTimer* get_IR_Timer(); |     static HardwareTimer* get_IR_Timer(); | ||||||
|  |  | ||||||
|     void enable(); |     void enable(); | ||||||
| @ -44,10 +46,9 @@ public: | |||||||
|     ~IR_Encoder(); |     ~IR_Encoder(); | ||||||
|     volatile bool ir_out_virtual; |     volatile bool ir_out_virtual; | ||||||
|  |  | ||||||
| private: |  | ||||||
|     static std::list<IR_Encoder*>& get_enc_list(); |  | ||||||
|     void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); |  | ||||||
|     void _isr(); |     void _isr(); | ||||||
|  | private: | ||||||
|  |     void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); | ||||||
|  |  | ||||||
|     void setDecoder_isSending(); |     void setDecoder_isSending(); | ||||||
|     void sendByte(uint8_t byte, bool *prev, bool LOW_FIRST); |     void sendByte(uint8_t byte, bool *prev, bool LOW_FIRST); | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|     IR_MSG_ACCEPT с адреса 0 воспринимается всеми устройствами |     IR_MSG_ACCEPT с адреса 0 воспринимается всеми устройствами | ||||||
| */  | */  | ||||||
| //**** Контрольные точки ****** | //**** Контрольные точки ****** | ||||||
| #define IR_MAX_ADDR_CPU 64999 | #define IR_MAX_ADDR_CPU 63999 | ||||||
| #define IR_MIN_ADDR_CPU 32000 | #define IR_MIN_ADDR_CPU 32000 | ||||||
|  |  | ||||||
| // //***** Группы машинок ******** | // //***** Группы машинок ******** | ||||||
| @ -28,11 +28,11 @@ | |||||||
|  |  | ||||||
| //********* Машинки *********** | //********* Машинки *********** | ||||||
| #define IR_MAX_CAR 31999 | #define IR_MAX_CAR 31999 | ||||||
| #define IR_MIN_CAR 100 | #define IR_MIN_CAR 1 | ||||||
|  |  | ||||||
| //***** Пульты управления ***** | //***** Пульты управления ***** | ||||||
| #define IR_MAX_CONTROLLER 99 | #define IR_MAX_CONTROLLER 64999 | ||||||
| #define IR_MIN_CONTROLLER 0 | #define IR_MIN_CONTROLLER 64000 | ||||||
| /* | /* | ||||||
|  |  | ||||||
| /```````````````````````````````````````````````` data pack `````````````````````````````````````````````\                                   | /```````````````````````````````````````````````` data pack `````````````````````````````````````````````\                                   | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user