#ifndef AD0X0_SPI_EXT_H
#define AD0X0_SPI_EXT_H

#include "main.h"
#include "ad0x0_spi.h"

typedef __packed struct{
	uint8_t	*pbuf_tx,*pbuf_rx,pbuf_count;
	//uint8_t	calls_count;
	uint8_t	sf_id;//в пуше присваиваем, когда вызываем ф-ю, передаем как пар-р	
	//void	(*pSetTXRXBuf)(__packed struct ad0x0_sfunc_t *self);
	//ф-ии pre вызываются ПЕРЕД командами SPI, НЕ ОСВОБОЖДАЕТ ячейку
	void	(*p_pre_SetTXRXBuf)(ad0x0_spi_desc_s *pdspi,void *_p_ad0x0_spi_ext_t);//void	EXT_SetTXRXBuf(ad0x0_spi_desc_s *pdspi,uint8_t _handle)
	void (*_p_pre_cb_func)(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
	//ф-ии post вызываются ПОСЛЕ команд SPI и освобождает ячейку
	void (*_p_post_cb_func)(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
	uint32_t user_data0,user_data1;
	void *user_pointer0,*user_pointer1;//
	uint8_t reference_count;//ячейка не освобождается >0!!!!!!!!!!!!! 
	SPI_TypeDef *spi;
}ad0x0_spi_ext_t;

typedef void (*p_ext_func_t)(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);

void	ad0x0_spi_ext_init(void	(*perr)(void));
void	ad0x0_spi_ext_clear(ad0x0_spi_ext_t *pf);//вызывать после get
//выдать ячейку EXT. Может и не выдать!!! проверять надо возвр. значение
uint8_t ad0x0_spi_ext_get(uint8_t *_p_out_handle,ad0x0_spi_ext_t **_p_out_desc);
//void	ad0x0_sfunc_SetBufParams(ad0x0_spi_desc_s *pdspi,ad0x0_sfunc_t *pf);//
//вызывает ф-ии EXT перед командой SPI (иниц.буферов и т.п.)
void	ad0x0_spi_ext_pre_process(ad0x0_spi_desc_s *pdspi,uint8_t _handle);
//вызывает ф-ии EXT ПОСЛЕ команды SPI (логика ветвлений) и ОСВОБОЖДАЕТ ячейку (не всегда, ref_count...)
void	ad0x0_spi_ext_post_process(ad0x0_spi_desc_s *pdspi,uint8_t _handle);
ad0x0_spi_ext_t *ad0x0_spi_ext_get_pdesc(uint8_t _handle);

void	EXT_SetTXRXBuf(ad0x0_spi_desc_s *pdspi,void *_p_ad0x0_spi_ext_t);
#endif 
