mirror of
https://github.com/ArduPilot/ardupilot.git
synced 2026-10-02 10:23:25 +08:00
AP_Notify: stop using ownptr for SH1106
This commit is contained in:
committed by
Andrew Tridgell
parent
cfbbebeb3f
commit
6c54e00a72
@@ -30,8 +30,6 @@
|
||||
#include <AP_GPS/AP_GPS.h>
|
||||
#include <AP_BattMonitor/AP_BattMonitor.h>
|
||||
|
||||
#include <utility>
|
||||
|
||||
extern const AP_HAL::HAL& hal;
|
||||
|
||||
// Bit Map
|
||||
@@ -356,7 +354,7 @@ bool Display::init(void)
|
||||
break;
|
||||
}
|
||||
case DISPLAY_SH1106: {
|
||||
_driver = Display_SH1106_I2C::probe(std::move(hal.i2c_mgr->get_device(i, NOTIFY_DISPLAY_I2C_ADDR)));
|
||||
_driver = probe_i2c_display(i, Display_SH1106_I2C::probe);
|
||||
break;
|
||||
}
|
||||
case DISPLAY_SITL: {
|
||||
|
||||
@@ -14,24 +14,12 @@
|
||||
*/
|
||||
#include "Display_SH1106_I2C.h"
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include <AP_HAL/AP_HAL.h>
|
||||
#include <AP_HAL/I2CDevice.h>
|
||||
#include <AP_HAL/Device.h>
|
||||
|
||||
// constructor
|
||||
Display_SH1106_I2C::Display_SH1106_I2C(AP_HAL::OwnPtr<AP_HAL::Device> dev) :
|
||||
_dev(std::move(dev))
|
||||
Display_Backend *Display_SH1106_I2C::probe(AP_HAL::Device &_dev)
|
||||
{
|
||||
}
|
||||
|
||||
Display_SH1106_I2C::~Display_SH1106_I2C()
|
||||
{
|
||||
}
|
||||
|
||||
Display_SH1106_I2C *Display_SH1106_I2C::probe(AP_HAL::OwnPtr<AP_HAL::Device> dev)
|
||||
{
|
||||
Display_SH1106_I2C *driver = NEW_NOTHROW Display_SH1106_I2C(std::move(dev));
|
||||
Display_SH1106_I2C *driver = NEW_NOTHROW Display_SH1106_I2C(_dev);
|
||||
if (!driver || !driver->hw_init()) {
|
||||
delete driver;
|
||||
return nullptr;
|
||||
@@ -67,21 +55,14 @@ bool Display_SH1106_I2C::hw_init()
|
||||
|
||||
memset(_displaybuffer, 0, SH1106_COLUMNS * SH1106_ROWS_PER_PAGE);
|
||||
|
||||
// take i2c bus semaphore
|
||||
if (!_dev) {
|
||||
return false;
|
||||
}
|
||||
_dev->get_semaphore()->take_blocking();
|
||||
WITH_SEMAPHORE(dev.get_semaphore());
|
||||
|
||||
// init display
|
||||
bool success = _dev->transfer((uint8_t *)&init_seq, sizeof(init_seq), nullptr, 0);
|
||||
|
||||
// give back i2c semaphore
|
||||
_dev->get_semaphore()->give();
|
||||
bool success = dev.transfer((uint8_t *)&init_seq, sizeof(init_seq), nullptr, 0);
|
||||
|
||||
if (success) {
|
||||
_need_hw_update = true;
|
||||
_dev->register_periodic_callback(20000, FUNCTOR_BIND_MEMBER(&Display_SH1106_I2C::_timer, void));
|
||||
dev.register_periodic_callback(20000, FUNCTOR_BIND_MEMBER(&Display_SH1106_I2C::_timer, void));
|
||||
}
|
||||
|
||||
return success;
|
||||
@@ -114,12 +95,12 @@ void Display_SH1106_I2C::_timer()
|
||||
// write buffer to display
|
||||
for (uint8_t i = 0; i < (SH1106_ROWS / SH1106_ROWS_PER_PAGE); i++) {
|
||||
command.page = 0xB0 | (i & 0x0F);
|
||||
_dev->transfer((uint8_t *)&command, sizeof(command), nullptr, 0);
|
||||
dev.transfer((uint8_t *)&command, sizeof(command), nullptr, 0);
|
||||
|
||||
memcpy(&display_buffer.db[0], &_displaybuffer[i * SH1106_COLUMNS], SH1106_COLUMNS/2);
|
||||
_dev->transfer((uint8_t *)&display_buffer, SH1106_COLUMNS/2 + 1, nullptr, 0);
|
||||
dev.transfer((uint8_t *)&display_buffer, SH1106_COLUMNS/2 + 1, nullptr, 0);
|
||||
memcpy(&display_buffer.db[0], &_displaybuffer[i * SH1106_COLUMNS + SH1106_COLUMNS/2 ], SH1106_COLUMNS/2);
|
||||
_dev->transfer((uint8_t *)&display_buffer, SH1106_COLUMNS/2 + 1, nullptr, 0);
|
||||
dev.transfer((uint8_t *)&display_buffer, SH1106_COLUMNS/2 + 1, nullptr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ class Display_SH1106_I2C: public Display_Backend {
|
||||
|
||||
public:
|
||||
|
||||
static Display_SH1106_I2C *probe(AP_HAL::OwnPtr<AP_HAL::Device> dev);
|
||||
static Display_Backend *probe(AP_HAL::Device &_dev);
|
||||
|
||||
void hw_update() override;
|
||||
void set_pixel(uint16_t x, uint16_t y) override;
|
||||
@@ -21,8 +21,10 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
Display_SH1106_I2C(AP_HAL::OwnPtr<AP_HAL::Device> dev);
|
||||
~Display_SH1106_I2C() override;
|
||||
Display_SH1106_I2C(AP_HAL::Device &_dev) :
|
||||
dev{_dev}
|
||||
{ }
|
||||
~Display_SH1106_I2C() override {};
|
||||
|
||||
private:
|
||||
|
||||
@@ -30,7 +32,7 @@ private:
|
||||
|
||||
void _timer();
|
||||
|
||||
AP_HAL::OwnPtr<AP_HAL::Device> _dev;
|
||||
AP_HAL::Device &dev;
|
||||
uint8_t _displaybuffer[SH1106_COLUMNS * SH1106_ROWS_PER_PAGE];
|
||||
bool _need_hw_update;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user