7 changed files with 177 additions and 1 deletions
-
85components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.cpp
-
28components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.hpp
-
7components/zcancmder/zcanreceiver.cpp
-
1components/zcancmder/zcanreceiver.hpp
-
36components/zcancmder_module/zcan_eeprom_module.cpp
-
19components/zcancmder_module/zcan_eeprom_module.hpp
-
2components/zprotocols/zcancmder
@ -0,0 +1,85 @@ |
|||||
|
#include "m24lr64e_i2c_eeprom.hpp"
|
||||
|
|
||||
|
#include <stdio.h>
|
||||
|
#include <string.h>
|
||||
|
|
||||
|
#include "sdk\components\zprotocols\errorcode\errorcode.hpp"
|
||||
|
|
||||
|
#ifdef HAL_I2C_MODULE_ENABLED
|
||||
|
|
||||
|
using namespace std; |
||||
|
using namespace iflytop; |
||||
|
|
||||
|
#define READ_ADD 0x53
|
||||
|
#define MAX_SIZE (128 * 16)
|
||||
|
#define TAG "M24LR64E_I2CEEPROM"
|
||||
|
void M24LR64E_I2CEEPROM::initialize(I2C_HandleTypeDef* i2c_handle) { |
||||
|
m_i2c_handle = i2c_handle; |
||||
|
ZASSERT(m_i2c_handle); |
||||
|
m_mutex.init(); |
||||
|
m_monitor_thread.init(TAG, 1024, osPriorityNormal); |
||||
|
} |
||||
|
|
||||
|
int32_t M24LR64E_I2CEEPROM::start_monitor_status(function<void(eeprom_status_t& status)> cb) { |
||||
|
ZLOGI(TAG, "start_monitor_status"); |
||||
|
m_monitor_thread.start([this, cb]() { |
||||
|
eeprom_status_t status; |
||||
|
|
||||
|
m_is_online_flag = isonline(); |
||||
|
status.connected = m_is_online_flag; |
||||
|
if (cb) cb(status); |
||||
|
|
||||
|
while (!m_monitor_thread.getExitFlag()) { |
||||
|
/**
|
||||
|
* @brief CHECK ONLINE |
||||
|
*/ |
||||
|
bool is_online = isonline(); |
||||
|
if (is_online != m_is_online_flag) { |
||||
|
ZLOGI(TAG, "detect M24LR64E_I2CEEPROM online status changed: %d", is_online); |
||||
|
m_is_online_flag = is_online; |
||||
|
status.connected = m_is_online_flag; |
||||
|
if (cb) (status); |
||||
|
} |
||||
|
|
||||
|
osDelay(100); |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
int32_t M24LR64E_I2CEEPROM::stop_monitor_status() { |
||||
|
ZLOGI(TAG, "stop_monitor_status"); |
||||
|
m_monitor_thread.stop(); |
||||
|
return 0; |
||||
|
}; |
||||
|
int32_t M24LR64E_I2CEEPROM::read(u16 sector_index, u16 sector_size, zcancmder_read_ram_ack_t& ack) { |
||||
|
zlock_guard guard(m_mutex); |
||||
|
if (sector_size > sizeof(ack.packet)) return err::kce_buffer_not_enough; |
||||
|
|
||||
|
uint16_t add = sector_index * sector_size; |
||||
|
if (add >= MAX_SIZE) return err::kce_param_out_of_range; |
||||
|
|
||||
|
if (add + sector_size > MAX_SIZE) { |
||||
|
ack.len = MAX_SIZE - add; |
||||
|
ack.is_end = 1; |
||||
|
} else { |
||||
|
ack.len = sector_size; |
||||
|
ack.is_end = 0; |
||||
|
} |
||||
|
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(m_i2c_handle, READ_ADD, add, I2C_MEMADD_SIZE_8BIT, ack.packet, ack.len, 30); |
||||
|
if (status != HAL_OK) { |
||||
|
printf("M24LR64E_I2CEEPROM::read error: %d\n", status); |
||||
|
return err::kce_device_offline; |
||||
|
} |
||||
|
return 0; |
||||
|
}; |
||||
|
|
||||
|
bool M24LR64E_I2CEEPROM::isonline() { |
||||
|
zlock_guard guard(m_mutex); |
||||
|
uint8_t data[2]; |
||||
|
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(m_i2c_handle, READ_ADD, 0, I2C_MEMADD_SIZE_8BIT, data, 2, 5); |
||||
|
if (status != HAL_OK) { |
||||
|
return false; |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
#endif
|
@ -0,0 +1,28 @@ |
|||||
|
#include "sdk\components\zprotocols\zcancmder\api\i_eeprom.hpp"
|
||||
|
#include "sdk\os\zos.hpp"
|
||||
|
|
||||
|
#ifdef HAL_I2C_MODULE_ENABLED
|
||||
|
namespace iflytop { |
||||
|
using namespace std; |
||||
|
class M24LR64E_I2CEEPROM : public I_EEPROMModule { |
||||
|
I2C_HandleTypeDef* m_i2c_handle; |
||||
|
ZThread m_monitor_thread; |
||||
|
bool m_is_online_flag = false; |
||||
|
zmutex m_mutex; |
||||
|
|
||||
|
public: |
||||
|
M24LR64E_I2CEEPROM(){}; |
||||
|
~M24LR64E_I2CEEPROM(){}; |
||||
|
|
||||
|
void initialize(I2C_HandleTypeDef* i2c_handle); |
||||
|
|
||||
|
int32_t start_monitor_status(function<void(eeprom_status_t& status)> cb) override; |
||||
|
int32_t stop_monitor_status() override; |
||||
|
int32_t read(u16 sector_index, u16 sector_size, zcancmder_read_ram_ack_t& ack) override; |
||||
|
|
||||
|
private: |
||||
|
bool isonline(); |
||||
|
}; |
||||
|
} // namespace iflytop
|
||||
|
|
||||
|
#endif
|
@ -0,0 +1,36 @@ |
|||||
|
#include "zcan_eeprom_module.hpp"
|
||||
|
using namespace iflytop; |
||||
|
|
||||
|
#define TAG "ZCanEepromModule"
|
||||
|
#if 1
|
||||
|
void ZCanEepromModule::initialize(ZCanCmder* cancmder, int id, I_EEPROMModule* module) { |
||||
|
m_cancmder = cancmder; |
||||
|
m_id = id; |
||||
|
m_module = module; |
||||
|
m_lock.init(); |
||||
|
cancmder->registerListener(this); |
||||
|
} |
||||
|
void ZCanEepromModule::onRceivePacket(CanPacketRxBuffer* rxcmd) { //
|
||||
|
zlock_guard l(m_lock); |
||||
|
|
||||
|
PROCESS_PACKET(kcmd_eeprom_start_monitor_status, m_id) { |
||||
|
errorcode = m_module->start_monitor_status([this, cmdheader](I_EEPROMModule::eeprom_status_t& status) { //
|
||||
|
zlock_guard l(m_lock); |
||||
|
auto* report = (kcmd_eeprom_start_monitor_status_report_t*)m_txbuf; |
||||
|
static_assert(sizeof(*report) < sizeof(m_txbuf), "report size too large"); |
||||
|
|
||||
|
ZLOGI(TAG, "kcmd_eeprom_start_monitor_status exec_status:%d", status); |
||||
|
report->id = m_id; |
||||
|
report->status = status; |
||||
|
m_cancmder->sendStatusReport(cmdheader, (uint8_t*)report, sizeof(*report)); |
||||
|
}); |
||||
|
}; |
||||
|
END_PP(); |
||||
|
|
||||
|
PROCESS_PACKET(kcmd_eeprom_stop_monitor_status, m_id) { errorcode = m_module->stop_monitor_status(); }; |
||||
|
END_PP(); |
||||
|
|
||||
|
PROCESS_PACKET(kcmd_eeprom_read_block, m_id) { errorcode = m_module->read(cmd->sector_index, cmd->sector_size, ack->ack); }; |
||||
|
END_PP(); |
||||
|
} |
||||
|
#endif
|
@ -0,0 +1,19 @@ |
|||||
|
#pragma once
|
||||
|
// #include "sdk/components/zprotocols/zcancmder/api/i_step_motor_ctrl_module.hpp"
|
||||
|
#include "sdk/components/zprotocols/zcancmder/api/i_eeprom.hpp"
|
||||
|
#include "sdk\components\zcancmder\zcanreceiver.hpp"
|
||||
|
namespace iflytop { |
||||
|
|
||||
|
class ZCanEepromModule : public ZCanCmderListener { |
||||
|
ZCanCmder* m_cancmder = nullptr; |
||||
|
int m_id = 0; |
||||
|
I_EEPROMModule* m_module; |
||||
|
|
||||
|
uint8_t m_txbuf[300] = {0}; |
||||
|
zmutex m_lock; |
||||
|
|
||||
|
public: |
||||
|
void initialize(ZCanCmder* cancmder, int id, I_EEPROMModule* module); |
||||
|
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd); |
||||
|
}; |
||||
|
} // namespace iflytop
|
@ -1 +1 @@ |
|||||
Subproject commit 20e1197365b8384b7168085f75818d475d2add22 |
|
||||
|
Subproject commit fca927c9a222ea031e6516df2bdef9b7f1f300b7 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue