* 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);
 | 
						|
}; |