Skip to content

Commit 866f710

Browse files
committed
Fix RPI
1 parent b146201 commit 866f710

File tree

11 files changed

+64
-24
lines changed

11 files changed

+64
-24
lines changed

ArduinoCore-API/api/Print.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class Print
5050
virtual size_t write(uint8_t) = 0;
5151
size_t write(const char *str) {
5252
if (str == NULL) return 0;
53-
return write((const uint8_t *)str, strlen(str));
53+
int len = strlen(str);
54+
return write((const uint8_t *)str, len);
5455
}
5556
virtual size_t write(const uint8_t *buffer, size_t size);
5657
size_t write(const char *buffer, size_t size) {

ArduinoCore-Linux/cores/arduino/ArdStdio.h

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,58 +28,72 @@ class StdioDevice : public Stream {
2828
// nothing to be done
2929
}
3030

31-
virtual void print(const char* str){
31+
virtual size_t print(const char* str){
3232
std::cout << str;
3333
if (auto_flush) flush();
34+
return strlen(str);
3435
}
3536

36-
virtual void println(const char* str=""){
37+
virtual size_t println(const char* str=""){
3738
std::cout << str << "\n";
3839
if (auto_flush) flush();
40+
return strlen(str) + 1;
3941
}
4042

41-
virtual void print(int val, int radix = DEC){
42-
if (radix == DEC) { std::cout << val; } else { Stream::print(val, radix); }
43+
virtual size_t print(int val, int radix = DEC){
44+
size_t result = Stream::print(val, radix);
4345
if (auto_flush) flush();
46+
return result;
4447
}
4548

46-
virtual void println(int val, int radix = DEC){
47-
if (radix == DEC) { std::cout << val << "\n"; } else { Stream::println(val, radix); }
49+
virtual size_t println(int val, int radix = DEC){
50+
size_t result = Stream::println(val, radix);
4851
if (auto_flush) flush();
52+
return result;
4953
}
5054

51-
virtual void println(String &str){
52-
println(str.c_str());
55+
virtual size_t println(String &str){
56+
return println(str.c_str());
5357
}
5458

55-
virtual void print(String &str){
56-
print(str.c_str());
59+
virtual size_t print(String &str){
60+
return print(str.c_str());
5761
}
5862

5963

60-
virtual void println(Printable &p){
61-
p.printTo(*this);
64+
virtual size_t println(Printable &p){
65+
size_t result = p.printTo(*this);
6266
std::cout << "\n";
6367
if (auto_flush) flush();
68+
return result + 1;
6469
}
6570

66-
virtual void print(Printable &p){
67-
p.printTo(*this);
71+
virtual size_t print(Printable &p){
72+
auto result = p.printTo(*this);
6873
if (auto_flush) flush();
74+
return result;
6975
}
7076

7177
virtual void flush() {
7278
std::cout.flush();
7379
}
7480

75-
virtual void write(const char* str, int len) {
81+
virtual size_t write(const char* str, size_t len) {
7682
std::cout.write(str, len);
7783
if (auto_flush) flush();
84+
return len;
7885
}
7986

80-
virtual void write(uint8_t* str, int len) {
87+
virtual size_t write(uint8_t* str, size_t len) {
8188
std::cout.write((const char*)str, len);
8289
if (auto_flush) flush();
90+
return len;
91+
92+
}
93+
size_t write(const uint8_t* str, size_t len) override {
94+
std::cout.write((const char*)str, len);
95+
if (auto_flush) flush();
96+
return len;
8397
}
8498

8599
virtual size_t write(int32_t value){
@@ -88,7 +102,7 @@ class StdioDevice : public Stream {
88102
return 1;
89103
}
90104

91-
virtual size_t write(uint8_t value){
105+
size_t write(uint8_t value) override {
92106
std::cout.put(value);
93107
if (auto_flush) flush();
94108
return 1;

ArduinoCore-Linux/cores/arduino/Arduino.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,9 @@
3838

3939
#include "ArduinoAPI.h"
4040
#include "ArdStdio.h"
41-
#include "ArduinoLogger.h"
4241
#include "Serial.h"
42+
#include "ArduinoLogger.h"
4343
#include "RemoteSerial.h"
4444
#include "HardwareSetup.h"
45-
#ifdef USE_RPI
46-
# include "HardwareSetupRPI.h"
47-
#endif
48-
using namespace arduino;
45+
46+
using namespace arduino;

ArduinoCore-Linux/cores/rasperry_pi/HardwareGPIO_RPI.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ static std::map<pin_size_t, gpiod_line*> gpio_lines;
1414
static gpiod_chip* gpio_chip = nullptr;
1515

1616
HardwareGPIO_RPI::HardwareGPIO_RPI() {
17+
Logger.warning("Activating Rasperry PI: GPIO");
1718
gpio_chip = gpiod_chip_open_by_name("gpiochip0");
1819
if (!gpio_chip) {
1920
Logger.error("HardwareGPIO_RPI", "Failed to open gpiochip0");
21+
} else {
22+
is_open = true;
2023
}
2124
}
2225

ArduinoCore-Linux/cores/rasperry_pi/HardwareGPIO_RPI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,16 @@ class HardwareGPIO_RPI : public HardwareGPIO {
9191
*/
9292
void analogWriteFrequency(uint8_t pin, uint32_t freq);
9393

94+
operator bool() { return is_open; }
95+
9496
private:
9597
/** Analog reference mode (default AR_DEFAULT) */
9698
int m_analogReference = 0;
9799
/** Map of pin numbers to their PWM frequencies */
98100
std::map<pin_size_t, uint32_t> gpio_frequencies;
99101
/** PWM-capable pins on Raspberry Pi */
100102
int pwm_pins[4] = {12, 13, 18, 19};
103+
bool is_open = false;
101104
};
102105

103106
} // namespace arduino

ArduinoCore-Linux/cores/rasperry_pi/HardwareI2C_RPI.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,21 @@ void HardwareI2C_RPI::begin(uint8_t address) {
1616
current_address = address;
1717
if (ioctl(i2c_fd, I2C_SLAVE, address) < 0) {
1818
Logger.error("HardwareI2C_RPI: Failed to set I2C address");
19+
is_open = false;
20+
} else {
21+
is_open = true;
1922
}
2023
}
2124

2225
void HardwareI2C_RPI::begin() {
26+
Logger.warning("Activating Rasperry PI: I2C");
2327
if (i2c_fd < 0) {
2428
i2c_fd = open(i2c_device, O_RDWR);
2529
if (i2c_fd < 0) {
2630
Logger.error("HardwareI2C_RPI: Failed to open I2C device");
31+
is_open = false;
32+
} else {
33+
is_open = true;
2734
}
2835
}
2936
}

ArduinoCore-Linux/cores/rasperry_pi/HardwareI2C_RPI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class HardwareI2C_RPI : public HardwareI2C {
3737
int peek() override;
3838
void flush() override { fsync(i2c_fd);}
3939

40+
operator bool() { return is_open; }
41+
4042
private:
4143
int i2c_fd = -1;
4244
uint8_t current_address = 0;
@@ -45,6 +47,7 @@ class HardwareI2C_RPI : public HardwareI2C {
4547
std::vector<uint8_t> i2c_tx_buffer;
4648
int i2c_rx_pos = 0;
4749
const char* i2c_device;
50+
bool is_open = false;
4851
};
4952

5053
} // namespace arduino

ArduinoCore-Linux/cores/rasperry_pi/HardwareSPI_RPI.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,18 @@ HardwareSPI_RPI::~HardwareSPI_RPI() {
2323
end();
2424
}
2525
void HardwareSPI_RPI::begin() {
26+
Logger.warning("Activating Rasperry PI: SPI");
2627
spi_fd = open(device, O_RDWR);
2728
if (spi_fd < 0) {
2829
Logger.error("HardwareSPI_RPI: Failed to open SPI device");
30+
is_open = false;
31+
return;
2932
}
3033
ioctl(spi_fd, SPI_IOC_WR_MODE, &spi_mode);
3134
ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bits);
3235
ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed);
36+
is_open = true;
37+
return;
3338
}
3439

3540
void HardwareSPI_RPI::end() {

ArduinoCore-Linux/cores/rasperry_pi/HardwareSPI_RPI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@ class HardwareSPI_RPI : public HardwareSPI {
3030
void begin() override;
3131
void end() override;
3232

33+
operator bool() { return is_open; }
34+
3335
protected:
3436
int spi_fd = -1;
3537
const char* device = "/dev/spidev0.0";
3638
uint32_t spi_speed = 500000; // Default to 500kHz
3739
uint8_t spi_mode = 0; // Default to SPI mode 0
3840
uint8_t spi_bits = 8; // Default to 8 bits per word
41+
bool is_open = false;
3942
};
4043

4144
} // namespace arduino

ArduinoCore-Linux/cores/rasperry_pi/HardwareSetupRPI.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

2+
#pragma once
23
#ifdef USE_RPI
34
#include "Hardware.h" // for Hardware;
45
#include "HardwareGPIO_RPI.h"
@@ -26,11 +27,12 @@ class HardwareSetupRPI {
2627
/**
2728
* @brief Initializes hardware pointers to Raspberry Pi interfaces.
2829
*/
29-
void begin() {
30+
bool begin() {
3031
Logger.info("Using Raspberry Pi hardware interfaces");
3132
Hardware.gpio = &gpio;
3233
Hardware.i2c = &i2c;
3334
Hardware.spi = &spi;
35+
return gpio && i2c && spi;
3436
}
3537

3638
/**

0 commit comments

Comments
 (0)