/**
	ADF4351-ESP32.h

	Firmware pour piloter un circuit DDS : ADF4351
	avec un ESP32

		Silicium628 - avril 2026

**/

#include <stdint.h>

#pragma	once

#define	ADF_CLK		26		//GPIO26 = P15 de ma carte
#define	ADF_DATA	27		//GPIO27 = P16 de ma carte		
#define	ADF_LE		23 		//GPIO23 = P1 de ma carte		
#define	ADF_CE		22		//GPIO22 = P2 de ma carte
// #define	pin_MUXOUT	00	 // à voir		

class ADF4351
{

public:

	uint32_t registers[6] = {0x4580A8, 0x80080C9, 0x4E42, 0x4B3, 0xBC803C, 0x580005};
	uint32_t memo_registers[6] = {0, 0, 0, 0, 0, 0};

	uint32_t RFint, RFintold, INTA, RFcalc, PDRFout, MOD, FRAC;

	double RFout, REFin, PFDRFout, OutputChannelSpacing, FRACF;
	
	double RFoutMin = 35; // 35 MHz
	double RFoutMax = 4400; // 4400MHz = 4.4 GHz
	double REFinMax = 250;
			
	uint8_t DIV;
	
	ADF4351();
	
	void init();
	void mute(uint8_t valeur);
	void setFreq(double frequence);  // en MHz (avec decimales) -> calcule la valeur des registres ADF4351
	void Write_Register32(uint8_t reg_num);   //Programme physiquement un registre 32bits. SetFreq() doit avoir été appelé avant.
	void Write_All_Register(); // Programme physiquement tous les registres de l'ADF4351

	bool _powerdown, _auxEnabled, _rfEnabled, _feedbackType;
	//void PORT_ADF_set_bit( uint8_t masque_bit);
	//void PORT_ADF_clear_bit( uint8_t masque_bit);
	void impulse_CLK();
	void impulse_LE();
	void out1octet(uint8_t octet_i);	
	
private:


	
};

