Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more
Fork of SX126xLib by
SX126x Class Reference
Represents the SX126x and its features. More...
#include <sx126x.h>
Inherits Radio.
Inherited by SX126xHal.
Public Member Functions | |
SX126x (RadioCallbacks_t *callbacks) | |
Instantiates a SX126x object and provides API functions to communicates with the radio. | |
void | Init (void) |
Initializes the radio driver. | |
virtual RadioOperatingModes_t | GetOperatingMode (void) |
Gets the current Operation Mode of the Radip. | |
virtual void | CheckDeviceReady (void) |
Wakeup the radio if it is in Sleep mode and check that Busy is low. | |
void | SetPayload (uint8_t *payload, uint8_t size) |
Saves the payload to be send in the radio buffer. | |
uint8_t | GetPayload (uint8_t *payload, uint8_t *size, uint8_t maxSize) |
Reads the payload received. If the received payload is longer than maxSize, then the method returns 1 and do not set size and payload. | |
void | SendPayload (uint8_t *payload, uint8_t size, uint32_t timeout) |
Sends a payload. | |
uint8_t | SetSyncWord (uint8_t *syncWord) |
Sets the Sync Word given by index used in GFSK. | |
void | SetCrcSeed (uint16_t seed) |
Sets the Initial value for the LFSR used for the CRC calculation. | |
void | SetCrcPolynomial (uint16_t seed) |
Sets the seed used for the CRC calculation. | |
void | SetWhiteningSeed (uint16_t seed) |
Sets the Initial value of the LFSR used for the whitening in GFSK protocols. | |
uint32_t | GetRandom (void) |
Gets a 32 bits random value generated by the radio. | |
void | SetSleep (SleepParams_t sleepConfig) |
Sets the radio in sleep mode. | |
void | SetStandby (RadioStandbyModes_t mode) |
Sets the radio in configuration mode. | |
void | SetFs (void) |
Sets the radio in FS mode. | |
void | SetTx (uint32_t timeout) |
Sets the radio in transmission mode. | |
void | SetRxBoosted (uint32_t timeout) |
Sets the radio in reception Boosted mode. | |
void | SetRx (uint32_t timeout) |
Sets the radio in reception mode. | |
void | SetRxDutyCycle (uint32_t rxTime, uint32_t sleepTime) |
Sets the Rx duty cycle management parameters. | |
void | SetCad (void) |
Sets the radio in CAD mode. | |
void | SetTxContinuousWave (void) |
Sets the radio in continuous wave transmission mode. | |
void | SetTxInfinitePreamble (void) |
Sets the radio in continuous preamble transmission mode. | |
void | SetStopRxTimerOnPreambleDetect (bool enable) |
Decide which interrupt will stop the internal radio rx timer. | |
void | SetLoRaSymbNumTimeout (uint8_t SymbNum) |
Set the number of symbol the radio will wait to validate a reception. | |
void | SetRegulatorMode (RadioRegulatorMode_t mode) |
Sets the power regulators operating mode. | |
void | Calibrate (CalibrationParams_t calibParam) |
Calibrates the given radio block. | |
void | CalibrateImage (uint32_t freq) |
Calibrates the Image rejection depending of the frequency. | |
void | SetPaConfig (uint8_t paDutyCycle, uint8_t HpMax, uint8_t deviceSel, uint8_t paLUT) |
Sets the transmission parameters. | |
void | SetRxTxFallbackMode (uint8_t fallbackMode) |
Defines into which mode the chip goes after a TX / RX done. | |
void | SetDioIrqParams (uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask) |
Sets the IRQ mask and DIO masks. | |
uint16_t | GetIrqStatus (void) |
Returns the current IRQ status. | |
void | SetRfFrequency (uint32_t frequency) |
Sets the RF frequency. | |
void | SetPacketType (RadioPacketTypes_t packetType) |
Sets the radio for the given protocol. | |
RadioPacketTypes_t | GetPacketType (void) |
Gets the current radio protocol. | |
void | SetTxParams (int8_t power, RadioRampTimes_t rampTime) |
Sets the transmission parameters. | |
void | SetModulationParams (ModulationParams_t *modParams) |
Set the modulation parameters. | |
void | SetPacketParams (PacketParams_t *packetParams) |
Sets the packet parameters. | |
void | SetCadParams (RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, RadioCadExitModes_t cadExitMode, uint32_t cadTimeout) |
Sets the Channel Activity Detection (CAD) parameters. | |
void | SetBufferBaseAddresses (uint8_t txBaseAddress, uint8_t rxBaseAddress) |
Sets the data buffer base address for transmission and reception. | |
virtual RadioStatus_t | GetStatus (void) |
Gets the current radio status. | |
int8_t | GetRssiInst (void) |
Returns the instantaneous RSSI value for the last packet received. | |
void | GetRxBufferStatus (uint8_t *payloadLength, uint8_t *rxStartBuffer) |
Gets the last received packet buffer status. | |
void | GetPacketStatus (PacketStatus_t *pktStatus) |
Gets the last received packet payload length. | |
RadioError_t | GetDeviceErrors (void) |
Returns the possible system erros. | |
void | ClearIrqStatus (uint16_t irq) |
Clears the IRQs. | |
void | SetPollingMode (void) |
Set the driver in polling mode. | |
void | SetInterruptMode (void) |
Set the driver in interrupt mode. | |
virtual void | Reset (void)=0 |
Resets the radio. | |
virtual void | Wakeup (void)=0 |
Wake-ups the radio from Sleep mode. | |
virtual void | WriteCommand (RadioCommands_t opcode, uint8_t *buffer, uint16_t size)=0 |
Writes the given command to the radio. | |
virtual void | ReadCommand (RadioCommands_t opcode, uint8_t *buffer, uint16_t size)=0 |
Reads the given command from the radio. | |
virtual void | WriteRegister (uint16_t address, uint8_t *buffer, uint16_t size)=0 |
Writes multiple radio registers starting at address. | |
virtual void | WriteReg (uint16_t address, uint8_t value)=0 |
Writes the radio register at the specified address. | |
virtual void | ReadRegister (uint16_t address, uint8_t *buffer, uint16_t size)=0 |
Reads multiple radio registers starting at address. | |
virtual uint8_t | ReadReg (uint16_t address)=0 |
Reads the radio register at the specified address. | |
virtual void | WriteBuffer (uint8_t offset, uint8_t *buffer, uint8_t size)=0 |
Writes Radio Data Buffer with buffer of size starting at offset. | |
virtual void | ReadBuffer (uint8_t offset, uint8_t *buffer, uint8_t size)=0 |
Reads Radio Data Buffer at offset to buffer of size. | |
virtual uint8_t | GetDioStatus (void)=0 |
Gets the current status of the radio DIOs. | |
virtual uint8_t | GetDeviceType (void)=0 |
Returns the device type. | |
virtual uint8_t | GetFreqSelect (void)=0 |
Returns the matching frequency. | |
virtual void | AntSwOn (void)=0 |
RF Switch power on. | |
virtual void | AntSwOff (void)=0 |
RF Switch power off. | |
void | ProcessIrqs (void) |
Process the analysis of radio IRQs and calls callback functions depending on radio state. | |
Protected Member Functions | |
virtual void | IoIrqInit (DioIrqHandler irqHandler)=0 |
Sets a function to be triggered on radio interrupt. | |
void | OnDioIrq (void) |
DIOs interrupt callback. | |
Protected Attributes | |
void(* | txDone )(void) |
Callback on Tx done interrupt. | |
void(* | rxDone )(void) |
Callback on Rx done interrupt. | |
void(* | rxPreambleDetect )(void) |
Callback on Rx preamble detection interrupt. | |
void(* | rxSyncWordDone )(void) |
Callback on Rx SyncWord interrupt. | |
void(* | rxHeaderDone )(void) |
Callback on Rx header received interrupt. | |
void(* | txTimeout )(void) |
Callback on Tx timeout interrupt. | |
void(* | rxTimeout )(void) |
Callback on Rx timeout interrupt. | |
void(* | rxError )(IrqErrorCode_t errCode) |
Callback on Rx error interrupt. | |
void(* | cadDone )(bool cadFlag) |
Callback on Channel Activity Detection done interrupt. |
Detailed Description
Represents the SX126x and its features.
It implements the commands the SX126x can understands
Definition at line 669 of file sx126x.h.
Constructor & Destructor Documentation
SX126x | ( | RadioCallbacks_t * | callbacks ) |
Member Function Documentation
virtual void AntSwOff | ( | void | ) | [pure virtual] |
RF Switch power off.
Implemented in SX126xHal.
virtual void AntSwOn | ( | void | ) | [pure virtual] |
RF Switch power on.
Implemented in SX126xHal.
void Calibrate | ( | CalibrationParams_t | calibParam ) |
Calibrates the given radio block.
- Parameters:
-
[in] calibParam The description of blocks to be calibrated
Definition at line 341 of file sx126x.cpp.
void CalibrateImage | ( | uint32_t | freq ) |
Calibrates the Image rejection depending of the frequency.
- Parameters:
-
[in] freq The operating frequency
Definition at line 346 of file sx126x.cpp.
void CheckDeviceReady | ( | void | ) | [virtual] |
Wakeup the radio if it is in Sleep mode and check that Busy is low.
Definition at line 90 of file sx126x.cpp.
void ClearIrqStatus | ( | uint16_t | irq ) |
RadioError_t GetDeviceErrors | ( | void | ) |
Returns the possible system erros.
- Return values:
-
sysErrors Value representing the possible sys failures
Definition at line 810 of file sx126x.cpp.
virtual uint8_t GetDeviceType | ( | void | ) | [pure virtual] |
virtual uint8_t GetDioStatus | ( | void | ) | [pure virtual] |
Gets the current status of the radio DIOs.
- Return values:
-
status [Bit #3: DIO3, Bit #2: DIO2, Bit #1: DIO1, Bit #0: BUSY]
Implemented in SX126xHal.
virtual uint8_t GetFreqSelect | ( | void | ) | [pure virtual] |
uint16_t GetIrqStatus | ( | void | ) |
Returns the current IRQ status.
- Return values:
-
irqStatus IRQ status
Definition at line 417 of file sx126x.cpp.
RadioOperatingModes_t GetOperatingMode | ( | void | ) | [virtual] |
Gets the current Operation Mode of the Radip.
- Return values:
-
RadioOperatingModes_t last operating mode
Definition at line 85 of file sx126x.cpp.
void GetPacketStatus | ( | PacketStatus_t * | pktStatus ) |
Gets the last received packet payload length.
- Parameters:
-
[out] pktStatus A structure of packet status
Definition at line 777 of file sx126x.cpp.
RadioPacketTypes_t GetPacketType | ( | void | ) |
Gets the current radio protocol.
- Return values:
-
packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
Definition at line 479 of file sx126x.cpp.
uint8_t GetPayload | ( | uint8_t * | payload, |
uint8_t * | size, | ||
uint8_t | maxSize | ||
) |
Reads the payload received. If the received payload is longer than maxSize, then the method returns 1 and do not set size and payload.
- Parameters:
-
[out] payload A pointer to a buffer into which the payload will be copied [out] size A pointer to the size of the payload received [in] maxSize The maximal size allowed to copy into the buffer
Definition at line 105 of file sx126x.cpp.
uint32_t GetRandom | ( | void | ) |
Gets a 32 bits random value generated by the radio.
- Remarks:
- The radio must be in reception mode before executing this function
- Return values:
-
randomValue 32 bits random value
Definition at line 184 of file sx126x.cpp.
int8_t GetRssiInst | ( | void | ) |
Returns the instantaneous RSSI value for the last packet received.
- Return values:
-
rssiInst Instantaneous RSSI
Definition at line 750 of file sx126x.cpp.
void GetRxBufferStatus | ( | uint8_t * | payloadLength, |
uint8_t * | rxStartBuffer | ||
) |
Gets the last received packet buffer status.
- Parameters:
-
[out] payloadLength Last received packet payload length [out] rxStartBuffer Last received packet buffer address pointer
Definition at line 758 of file sx126x.cpp.
RadioStatus_t GetStatus | ( | void | ) | [virtual] |
Gets the current radio status.
- Return values:
-
status Radio status
Implements Radio.
Definition at line 740 of file sx126x.cpp.
void Init | ( | void | ) |
Initializes the radio driver.
pin OPT is used to detect if the board has a TCXO or a XTAL
OPT = 0 >> TCXO; OPT = 1 >> XTAL
Definition at line 40 of file sx126x.cpp.
virtual void IoIrqInit | ( | DioIrqHandler | irqHandler ) | [protected, pure virtual] |
Sets a function to be triggered on radio interrupt.
- Parameters:
-
[in] irqHandler A pointer to a function to be run on interrupt from the radio
Implemented in SX126xHal.
void OnDioIrq | ( | void | ) | [protected] |
DIOs interrupt callback.
- Remarks:
- Called to handle all 3 DIOs pins
Definition at line 839 of file sx126x.cpp.
void ProcessIrqs | ( | void | ) |
Process the analysis of radio IRQs and calls callback functions depending on radio state.
Definition at line 856 of file sx126x.cpp.
virtual void ReadBuffer | ( | uint8_t | offset, |
uint8_t * | buffer, | ||
uint8_t | size | ||
) | [pure virtual] |
virtual void ReadCommand | ( | RadioCommands_t | opcode, |
uint8_t * | buffer, | ||
uint16_t | size | ||
) | [pure virtual] |
virtual uint8_t ReadReg | ( | uint16_t | address ) | [pure virtual] |
virtual void ReadRegister | ( | uint16_t | address, |
uint8_t * | buffer, | ||
uint16_t | size | ||
) | [pure virtual] |
virtual void Reset | ( | void | ) | [pure virtual] |
void SendPayload | ( | uint8_t * | payload, |
uint8_t | size, | ||
uint32_t | timeout | ||
) |
Sends a payload.
- Parameters:
-
[in] payload A pointer to the payload to send [in] size The size of the payload to send [in] timeout The timeout for Tx operation
Definition at line 118 of file sx126x.cpp.
void SetBufferBaseAddresses | ( | uint8_t | txBaseAddress, |
uint8_t | rxBaseAddress | ||
) |
Sets the data buffer base address for transmission and reception.
- Parameters:
-
[in] txBaseAddress Transmission base address [in] rxBaseAddress Reception base address
Definition at line 727 of file sx126x.cpp.
void SetCad | ( | void | ) |
Sets the radio in CAD mode.
Definition at line 301 of file sx126x.cpp.
void SetCadParams | ( | RadioLoRaCadSymbols_t | cadSymbolNum, |
uint8_t | cadDetPeak, | ||
uint8_t | cadDetMin, | ||
RadioCadExitModes_t | cadExitMode, | ||
uint32_t | cadTimeout | ||
) |
Sets the Channel Activity Detection (CAD) parameters.
- Parameters:
-
[in] cadSymbolNum The number of symbol to use for CAD operations [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL, LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL, LORA_CAD_16_SYMBOL] [in] cadDetPeak Limite for detection of SNR peak used in the CAD [in] cadDetMin Set the minimum symbol recognition for CAD [in] cadExitMode Operation to be done at the end of CAD action [LORA_CAD_ONLY, LORA_CAD_RX, LORA_CAD_LBT] [in] cadTimeout Defines the timeout value to abort the CAD activity
Definition at line 712 of file sx126x.cpp.
void SetCrcPolynomial | ( | uint16_t | seed ) |
Sets the seed used for the CRC calculation.
- Parameters:
-
[in] seed The seed value
Definition at line 148 of file sx126x.cpp.
void SetCrcSeed | ( | uint16_t | seed ) |
Sets the Initial value for the LFSR used for the CRC calculation.
- Parameters:
-
[in] seed Initial LFSR value ( 2 bytes )
Definition at line 130 of file sx126x.cpp.
void SetDioIrqParams | ( | uint16_t | irqMask, |
uint16_t | dio1Mask, | ||
uint16_t | dio2Mask, | ||
uint16_t | dio3Mask | ||
) |
Sets the IRQ mask and DIO masks.
- Parameters:
-
[in] irqMask General IRQ mask [in] dio1Mask DIO1 mask [in] dio2Mask DIO2 mask [in] dio3Mask DIO3 mask
Definition at line 398 of file sx126x.cpp.
void SetFs | ( | void | ) |
Sets the radio in FS mode.
Definition at line 228 of file sx126x.cpp.
void SetInterruptMode | ( | void | ) |
Set the driver in interrupt mode.
In interrupt mode, the driver communicate with the radio during the interruption by direct calls to ProcessIrqs( ). The main advantage is the possibility to have low power application architecture. This is the default mode.
// Initializations and callbacks declaration/definition radio = SX126x( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks ); radio.Init( ); radio.SetInterruptMode( ); // Optionnal. Driver default behavior while( true ) { // Do some applicative work }
- See also:
- SX126x::SetPollingMode
Definition at line 834 of file sx126x.cpp.
void SetLoRaSymbNumTimeout | ( | uint8_t | SymbNum ) |
Set the number of symbol the radio will wait to validate a reception.
- Parameters:
-
[in] SymbNum number of LoRa symbols
Definition at line 328 of file sx126x.cpp.
void SetModulationParams | ( | ModulationParams_t * | modParams ) |
Set the modulation parameters.
- Parameters:
-
[in] modParams A structure describing the modulation parameters
Definition at line 545 of file sx126x.cpp.
void SetPacketParams | ( | PacketParams_t * | packetParams ) |
Sets the packet parameters.
- Parameters:
-
[in] packetParams A structure describing the packet parameters
Definition at line 646 of file sx126x.cpp.
void SetPacketType | ( | RadioPacketTypes_t | packetType ) |
Sets the radio for the given protocol.
- Parameters:
-
[in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
- Remarks:
- This method has to be called before SetRfFrequency, SetModulationParams and SetPacketParams
Definition at line 468 of file sx126x.cpp.
void SetPaConfig | ( | uint8_t | paDutyCycle, |
uint8_t | HpMax, | ||
uint8_t | deviceSel, | ||
uint8_t | paLUT | ||
) |
Sets the transmission parameters.
- Parameters:
-
[in] paDutyCycle Duty Cycle for the PA [in] HpMax 0 for sx1261, 7 for sx1262 [in] deviceSel 1 for sx1261, 0 for sx1262 [in] paLUT 0 for 14dBm LUT, 1 for 22dBm LUT
Definition at line 378 of file sx126x.cpp.
void SetPayload | ( | uint8_t * | payload, |
uint8_t | size | ||
) |
Saves the payload to be send in the radio buffer.
- Parameters:
-
[in] payload A pointer to the payload [in] size The size of the payload
Definition at line 100 of file sx126x.cpp.
void SetPollingMode | ( | void | ) |
Set the driver in polling mode.
In polling mode the application is responsible to call ProcessIrqs( ) to execute callbacks functions. The default mode is Interrupt Mode.
// Initializations and callbacks declaration/definition radio = SX126x( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks ); radio.Init( ); radio.SetPollingMode( ); while( true ) { // IRQ processing is automatically done radio.ProcessIrqs( ); // <-- here, as well as callback functions // calls // Do some applicative work }
- See also:
- SX126x::SetInterruptMode
Definition at line 829 of file sx126x.cpp.
void SetRegulatorMode | ( | RadioRegulatorMode_t | mode ) |
Sets the power regulators operating mode.
- Parameters:
-
[in] mode [0: LDO, 1:DC_DC]
Definition at line 333 of file sx126x.cpp.
void SetRfFrequency | ( | uint32_t | frequency ) |
Sets the RF frequency.
- Parameters:
-
[in] frequency RF frequency [Hz]
Definition at line 445 of file sx126x.cpp.
void SetRx | ( | uint32_t | timeout ) |
Sets the radio in reception mode.
- Parameters:
-
[in] timeout Structure describing the reception timeout value
Definition at line 271 of file sx126x.cpp.
void SetRxBoosted | ( | uint32_t | timeout ) |
Sets the radio in reception Boosted mode.
- Parameters:
-
[in] timeout Structure describing the transmission timeout value
Definition at line 253 of file sx126x.cpp.
void SetRxDutyCycle | ( | uint32_t | rxTime, |
uint32_t | sleepTime | ||
) |
Sets the Rx duty cycle management parameters.
- Parameters:
-
[in] rxTime Structure describing reception timeout value [in] sleepTime Structure describing sleep timeout value
Definition at line 287 of file sx126x.cpp.
void SetRxTxFallbackMode | ( | uint8_t | fallbackMode ) |
Defines into which mode the chip goes after a TX / RX done.
- Parameters:
-
[in] fallbackMode The mode in which the radio goes
Definition at line 393 of file sx126x.cpp.
void SetSleep | ( | SleepParams_t | sleepConfig ) |
Sets the radio in sleep mode.
- Parameters:
-
[in] sleepConfig The sleep configuration describing data retention and RTC wake-up
Definition at line 200 of file sx126x.cpp.
void SetStandby | ( | RadioStandbyModes_t | mode ) |
Sets the radio in configuration mode.
- Parameters:
-
[in] mode The standby mode to put the radio into
Definition at line 212 of file sx126x.cpp.
void SetStopRxTimerOnPreambleDetect | ( | bool | enable ) |
Decide which interrupt will stop the internal radio rx timer.
- Parameters:
-
[in] enable [0: Timer stop after header/syncword detection 1: Timer stop after preamble detection]
Definition at line 323 of file sx126x.cpp.
uint8_t SetSyncWord | ( | uint8_t * | syncWord ) |
Sets the Sync Word given by index used in GFSK.
- Parameters:
-
[in] syncWord SyncWord bytes ( 8 bytes )
- Return values:
-
status [0: OK, 1: NOK]
Definition at line 124 of file sx126x.cpp.
void SetTx | ( | uint32_t | timeout ) |
Sets the radio in transmission mode.
- Parameters:
-
[in] timeout Structure describing the transmission timeout value
Definition at line 237 of file sx126x.cpp.
void SetTxContinuousWave | ( | void | ) |
Sets the radio in continuous wave transmission mode.
Definition at line 307 of file sx126x.cpp.
void SetTxInfinitePreamble | ( | void | ) |
Sets the radio in continuous preamble transmission mode.
Definition at line 315 of file sx126x.cpp.
void SetTxParams | ( | int8_t | power, |
RadioRampTimes_t | rampTime | ||
) |
Sets the transmission parameters.
- Parameters:
-
[in] power RF output power [-18..13] dBm [in] rampTime Transmission ramp up time
Definition at line 484 of file sx126x.cpp.
void SetWhiteningSeed | ( | uint16_t | seed ) |
Sets the Initial value of the LFSR used for the whitening in GFSK protocols.
- Parameters:
-
[in] seed Initial LFSR value
Definition at line 166 of file sx126x.cpp.
virtual void Wakeup | ( | void | ) | [pure virtual] |
Wake-ups the radio from Sleep mode.
Implemented in SX126xHal.
virtual void WriteBuffer | ( | uint8_t | offset, |
uint8_t * | buffer, | ||
uint8_t | size | ||
) | [pure virtual] |
virtual void WriteCommand | ( | RadioCommands_t | opcode, |
uint8_t * | buffer, | ||
uint16_t | size | ||
) | [pure virtual] |
virtual void WriteReg | ( | uint16_t | address, |
uint8_t | value | ||
) | [pure virtual] |
virtual void WriteRegister | ( | uint16_t | address, |
uint8_t * | buffer, | ||
uint16_t | size | ||
) | [pure virtual] |
Field Documentation
void( * cadDone)(bool cadFlag) [protected, inherited] |
void( * rxDone)(void) [protected, inherited] |
void( * rxError)(IrqErrorCode_t errCode) [protected, inherited] |
void( * rxHeaderDone)(void) [protected, inherited] |
void( * rxPreambleDetect)(void) [protected, inherited] |
void( * rxSyncWordDone)(void) [protected, inherited] |
void( * rxTimeout)(void) [protected, inherited] |
void( * txDone)(void) [protected, inherited] |
Generated on Tue Jul 12 2022 15:50:44 by
