 1f761d7fbb
			
		
	
	
		1f761d7fbb
		
			
		
	
	
	
	
		
			
			* maxim crc function * one wire template device and ds1990 classes * 3 fields for addr * cyfral emulator lib * add cyfral read mode, refract rendering and events * add ADC1_IN14, add adc interrupt * cyfral read mode * rename and move api-hal includes folder * build onewire libs only if we build app * start in mode 0
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| #include "flipper.h"
 | |
| #include "flipper_v2.h"
 | |
| #include "one_wire_timings.h"
 | |
| 
 | |
| // TODO fix GPL compability
 | |
| // currently we use rework of OneWireHub
 | |
| 
 | |
| #define ONE_WIRE_MAX_DEVICES 1
 | |
| #define ONE_WIRE_TREE_SIZE ((2 * ONE_WIRE_MAX_DEVICES) - 1)
 | |
| 
 | |
| #define OWET OneWireEmulateTiming
 | |
| 
 | |
| class OneWireDevice;
 | |
| 
 | |
| enum class OneWireGpioSlaveError : uint8_t {
 | |
|     NO_ERROR = 0,
 | |
|     READ_TIMESLOT_TIMEOUT = 1,
 | |
|     WRITE_TIMESLOT_TIMEOUT = 2,
 | |
|     WAIT_RESET_TIMEOUT = 3,
 | |
|     VERY_LONG_RESET = 4,
 | |
|     VERY_SHORT_RESET = 5,
 | |
|     PRESENCE_LOW_ON_LINE = 6,
 | |
|     READ_TIMESLOT_TIMEOUT_LOW = 7,
 | |
|     AWAIT_TIMESLOT_TIMEOUT_HIGH = 8,
 | |
|     PRESENCE_HIGH_ON_LINE = 9,
 | |
|     INCORRECT_ONEWIRE_CMD = 10,
 | |
|     INCORRECT_SLAVE_USAGE = 11,
 | |
|     TRIED_INCORRECT_WRITE = 12,
 | |
|     FIRST_TIMESLOT_TIMEOUT = 13,
 | |
|     FIRST_BIT_OF_BYTE_TIMEOUT = 14,
 | |
|     RESET_IN_PROGRESS = 15
 | |
| };
 | |
| 
 | |
| class OneWireGpioSlave {
 | |
| private:
 | |
|     const GpioPin* gpio;
 | |
|     bool overdrive_mode = false;
 | |
|     uint8_t cmd;
 | |
|     OneWireGpioSlaveError error;
 | |
|     uint8_t error_place;
 | |
| 
 | |
|     uint8_t devices_count;
 | |
|     OneWireDevice* devices[ONE_WIRE_MAX_DEVICES];
 | |
|     OneWireDevice* device_selected;
 | |
| 
 | |
|     struct IDTree {
 | |
|         uint8_t device_selected; // for which slave is this jump-command relevant
 | |
|         uint8_t id_position; // where does the algorithm has to look for a junction
 | |
|         uint8_t got_zero; // if 0 switch to which tree branch
 | |
|         uint8_t got_one; // if 1 switch to which tree branch
 | |
|     } id_tree[ONE_WIRE_TREE_SIZE];
 | |
| 
 | |
| public:
 | |
|     OneWireGpioSlave(const GpioPin* one_wire_gpio);
 | |
|     ~OneWireGpioSlave();
 | |
| 
 | |
|     void start(void);
 | |
|     void stop(void);
 | |
|     bool emulate();
 | |
|     bool check_reset(void);
 | |
|     bool show_presence(void);
 | |
|     bool receive_and_process_cmd(void);
 | |
|     bool receive(uint8_t* data, const uint8_t data_length = 1);
 | |
|     bool receive_bit(void);
 | |
|     bool send_bit(bool value);
 | |
|     bool send(const uint8_t* address, const uint8_t data_length = 1);
 | |
| 
 | |
|     OneWiteTimeType wait_while_gpio_is(volatile OneWiteTimeType retries, const bool pin_value);
 | |
| 
 | |
|     // set pin state
 | |
|     inline void pin_set_float();
 | |
|     inline void pin_set_low();
 | |
| 
 | |
|     // get error text
 | |
|     const char* decode_error();
 | |
| 
 | |
|     // devices managment
 | |
|     uint8_t attach(OneWireDevice& device);
 | |
|     bool detach(const OneWireDevice& device);
 | |
|     bool detach(uint8_t device_number);
 | |
|     uint8_t get_next_device_index(const uint8_t index_start = 0) const;
 | |
| 
 | |
|     // id tree managment
 | |
|     uint8_t build_id_tree(void);
 | |
|     uint8_t build_id_tree(uint8_t id_bit_position, uint32_t device_mask);
 | |
| 
 | |
|     uint8_t get_first_bit_set_position(uint32_t mask) const;
 | |
|     uint8_t get_first_id_tree_el_position(void) const;
 | |
| 
 | |
|     // commands
 | |
|     void cmd_search_rom(void);
 | |
| }; |