Skip to content

Commit ce9eace

Browse files
committed
Update CircuitOS library to v1.5.0
1 parent e46d29d commit ce9eace

15 files changed

+181
-27
lines changed

libraries/CircuitOS/Setup.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
* The library has better performance on higher-res screens (320x240 and above). */
1616
// #define CIRCUITOS_LOVYANGFX
1717

18+
/** Zoom factor for the display buffer, 2 means every pixel in the buffer equates to 4 pixels on-screen. */
19+
// #define CIRCUITOS_LOVYANGFX_ZOOM 1
20+
1821
/** Whether NVS (non-volatile storage) is present in the core. Enables NVS variant of Settings */
1922
// #define CIRCUITOS_NVS
2023

libraries/CircuitOS/library.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=CircuitOS
2-
version=1.4.0
2+
version=1.5.0
33
author=CircuitMess
44
maintainer=Filip Budiša <[email protected]>
55
sentence=Circuit OS is our custom-made operating system built on top of FreeRTOS.

libraries/CircuitOS/src/Buffer/RingBuffer.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ size_t RingBuffer::write(uint8_t* source, size_t n){
5858
return n;
5959
}
6060

61+
size_t RingBuffer::skip(size_t n){
62+
n = min(n, readAvailable());
63+
if(n == 0) return 0;
64+
beginning = (beginning + n) % size;
65+
return n;
66+
}
67+
6168
void RingBuffer::clear(){
6269
beginning = end = 0;
6370
}

libraries/CircuitOS/src/Buffer/RingBuffer.h

+9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ class RingBuffer {
1414
size_t read(uint8_t* destination, size_t n);
1515
size_t write(uint8_t* source, size_t n);
1616

17+
template<typename T>
18+
const T* peek(size_t offset = 0){
19+
if(offset + sizeof(T) > readAvailable()) return nullptr;
20+
offset = (beginning + offset) % size;
21+
return (T*) (buffer + offset);
22+
}
23+
24+
size_t skip(size_t n);
25+
1726
void clear();
1827

1928
private:

libraries/CircuitOS/src/Display/Display.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ void Display::commit(){
6161
}
6262
#ifdef CIRCUITOS_LOVYANGFX
6363
tft.startWrite();
64-
baseSprite->pushRotateZoom(161, 121, 0, 2, 2);
64+
#ifdef CIRCUITOS_LOVYANGFX_ZOOM
65+
baseSprite->pushRotateZoom(width + 1, height + 1, 0, CIRCUITOS_LOVYANGFX_ZOOM, CIRCUITOS_LOVYANGFX_ZOOM);
66+
#else
67+
baseSprite->push();
68+
#endif
6569
tft.endWrite();
6670
#else
6771
baseSprite->push();

libraries/CircuitOS/src/Display/LovyanGFX_setup.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace lgfx {
1010
class LGFX : public lgfx::LGFX_Device {
1111

12-
lgfx::Panel_ILI9341 _panel_instance;
12+
lgfx::LOVYAN_PANEL _panel_instance;
1313
lgfx::Bus_SPI _bus_instance;
1414

1515
public:
@@ -21,8 +21,8 @@ class LGFX : public lgfx::LGFX_Device {
2121

2222
cfg.spi_host = VSPI_HOST;
2323
cfg.spi_mode = 0;
24-
cfg.freq_write = 60000000;
25-
cfg.freq_read = 60000000;
24+
cfg.freq_write = LOVYAN_FREQ;
25+
cfg.freq_read = LOVYAN_FREQ;
2626
cfg.spi_3wire = false;
2727
cfg.use_lock = true;
2828
cfg.dma_channel = 1;

libraries/CircuitOS/src/FS/RamFile.cpp

+32-16
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
#include "RamFile.h"
22

3-
RamFile::RamFile(uint8_t* data, size_t size) : data(data), dataSize(size){
3+
RamFile::RamFile(uint8_t* data, size_t size, bool readonly) : data(data), dataSize(size), readonly(readonly){
44

55
}
66

77
RamFile::~RamFile(){
88
RamFile::close();
99
}
1010

11-
fs::File RamFile::open(uint8_t* data, size_t size){
12-
return File(std::make_shared<RamFile>(data, size));
11+
fs::File RamFile::open(uint8_t* data, size_t size, bool readonly){
12+
return File(std::make_shared<RamFile>(data, size, readonly));
1313
}
1414

15-
fs::File RamFile::open(fs::File file){
15+
fs::File RamFile::open(fs::File& file, bool readonly){
1616
uint8_t* data;
1717
#ifdef CONFIG_SPIRAM_SUPPORT
1818
data = static_cast<uint8_t*>(ps_malloc(file.size()));
@@ -23,7 +23,7 @@ fs::File RamFile::open(fs::File file){
2323
file.seek(0);
2424
file.readBytes(reinterpret_cast<char*>(data), file.size());
2525

26-
auto f = std::make_shared<RamFile>(data, file.size());
26+
auto f = std::make_shared<RamFile>(data, file.size(), readonly);
2727

2828
String name = file.name();
2929
char* fstr = static_cast<char*>(malloc(name.length() + 1));
@@ -35,17 +35,37 @@ fs::File RamFile::open(fs::File file){
3535
}
3636

3737
size_t RamFile::write(uint8_t data){
38+
if(readonly) return 0;
39+
40+
if(cursor == dataSize){
41+
dataSize++;
42+
}
43+
3844
this->data[cursor++] = data;
3945
return 1;
4046
}
4147

4248
size_t RamFile::write(const uint8_t* buf, size_t size){
49+
if(readonly) return 0;
50+
if(size == 0) return 0;
51+
52+
if(cursor + size > dataSize){
53+
dataSize = size + cursor;
54+
#ifdef CONFIG_SPIRAM_SUPPORT
55+
data = static_cast<uint8_t*>(ps_realloc(data, dataSize));
56+
#else
57+
data = static_cast<uint8_t*>(realloc(data, dataSize));
58+
#endif
59+
}
60+
4361
memcpy(data + cursor, buf, size);
4462
cursor += size;
63+
64+
return size;
4565
}
4666

4767
int RamFile::available(){
48-
return cursor < dataSize;
68+
return dataSize - cursor;
4969
}
5070

5171
int RamFile::read(){
@@ -61,16 +81,12 @@ void RamFile::flush(){
6181
}
6282

6383
bool RamFile::seek(uint32_t pos, fs::SeekMode mode){
64-
switch(mode){
65-
case fs::SeekSet:
66-
cursor = pos;
67-
break;
68-
case fs::SeekEnd:
69-
cursor = dataSize - pos - 1;
70-
break;
71-
case fs::SeekCur:
72-
cursor += pos;
73-
break;
84+
if(mode == fs::SeekSet){
85+
cursor = pos;
86+
}else if(mode == fs::SeekEnd){
87+
cursor = dataSize - pos;
88+
}else if(mode == fs::SeekCur){
89+
cursor += pos;
7490
}
7591
}
7692

libraries/CircuitOS/src/FS/RamFile.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ class RamFile : public fs::FileImpl {
1616
void rewindDirectory() ;
1717
operator bool() ;
1818
#endif
19-
RamFile(uint8_t* data, size_t size);
19+
RamFile(uint8_t* data, size_t size, bool readonly = true);
2020
virtual ~RamFile();
2121

22-
static fs::File open(uint8_t* data, size_t size);
23-
static fs::File open(fs::File file);
22+
static fs::File open(uint8_t* data, size_t size, bool readonly = true);
23+
static fs::File open(fs::File& file, bool readonly = true);
2424

2525
size_t write(const uint8_t* buf, size_t size) override;
2626
size_t read(uint8_t* buf, size_t size) override;
@@ -51,6 +51,7 @@ class RamFile : public fs::FileImpl {
5151
uint8_t* data = nullptr;
5252
size_t dataSize;
5353
size_t cursor = 0;
54+
bool readonly;
5455
const char* filename = nullptr;
5556

5657
};

libraries/CircuitOS/src/Input/I2cExpander.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,21 @@ I2cExpander::I2cExpander()
1414
I2cExpander::~I2cExpander()
1515
{
1616
}
17-
void I2cExpander::begin(uint8_t _address, uint8_t _sda, uint8_t _scl)
17+
bool I2cExpander::begin(uint8_t _address, uint8_t _sda, uint8_t _scl)
1818
{
1919
address = _address;
2020
Wire.begin(_sda, _scl);
21+
22+
Wire.beginTransmission(address);
23+
if(Wire.endTransmission() != 0){
24+
return false;
25+
}
26+
2127
portWrite(0xFFFF);
2228
_write(0x0000, INVERT_REG);
2329
portConfig(0xFFFF);
30+
31+
return true;
2432
}
2533
void I2cExpander::_write(uint16_t _portData, uint8_t reg)
2634
{

libraries/CircuitOS/src/Input/I2cExpander.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class I2cExpander
1313
public:
1414
I2cExpander();
1515
~I2cExpander();
16-
void begin(uint8_t _address = 0x74, uint8_t _sda = 27, uint8_t _scl = 14);
16+
bool begin(uint8_t _address = 0x74, uint8_t _sda = 27, uint8_t _scl = 14);
1717
uint16_t portRead();
1818
bool portRead(uint16_t& state);
1919
void pinMode(uint8_t pin, uint8_t mode);

libraries/CircuitOS/src/Input/Input.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ void Input::btnPress(uint i){
6464
}
6565

6666
for(auto listener : listeners){
67+
if(mask.find(listener) != mask.end()) continue;
68+
6769
if(removedListeners.find(listener) != removedListeners.end()) continue;
6870
listener->buttonPressed(buttons[i]);
6971
if(removedListeners.find(listener) != removedListeners.end()) continue;
@@ -102,6 +104,8 @@ void Input::btnRelease(uint i){
102104
btnHoldRepeatCounter[buttons[i]] = 0;
103105

104106
for(auto listener : listeners){
107+
if(mask.find(listener) != mask.end()) continue;
108+
105109
if(removedListeners.find(listener) != removedListeners.end()) continue;
106110
listener->buttonReleased(buttons[i]);
107111
if(listener->holdTimes.find(buttons[i]) != listener->holdTimes.end()){
@@ -139,6 +143,8 @@ void Input::loop(uint _time){
139143
}
140144

141145
for(auto listener : listeners){
146+
if(mask.find(listener) != mask.end()) continue;
147+
142148
auto search = listener->holdTimes.find(buttons[i]);
143149
if(search != listener->holdTimes.end() && holdTime >= search->second.time && !search->second.holdingOver){
144150
listener->buttonHeld(buttons[i]);
@@ -185,6 +191,11 @@ uint32_t Input::getButtonHeldMillis(uint8_t pin){
185191
return millis() - btnHoldStart[pin];
186192
}
187193

194+
bool Input::getButtonState(uint8_t pin){
195+
if(pin >= btnState.size()) return false;
196+
return btnState[pin];
197+
}
198+
188199
void Input::setAnyKeyCallback(void (* callback)(), bool returnAfterCallback){
189200
anyKeyCallback = callback;
190201
anyKeyCallbackReturn = returnAfterCallback;
@@ -205,11 +216,20 @@ void Input::addListener(InputListener* listener){
205216
if(l != removedListeners.end()){
206217
removedListeners.erase(l);
207218
}
219+
220+
for(auto pair : listener->holdTimes){
221+
pair.second.holdingOver = false;
222+
}
223+
224+
for(auto pair : listener->holdAndRepeatTimes){
225+
pair.second.repeatCounter = 0;
226+
}
208227
}
209228

210229
void Input::removeListener(InputListener* listener){
211230
if(listeners.indexOf(listener) == -1 || removedListeners.find(listener) != removedListeners.end()) return;
212231
removedListeners.insert(listener);
232+
mask.erase(listener);
213233
}
214234

215235
void Input::clearListeners(){
@@ -221,3 +241,21 @@ void Input::clearListeners(){
221241

222242
removedListeners.clear();
223243
}
244+
245+
void Input::maskAll(){
246+
for(auto listener : listeners){
247+
mask.insert(listener);
248+
}
249+
}
250+
251+
void Input::unmaskAll(){
252+
mask.clear();
253+
}
254+
255+
void Input::addMask(InputListener* listener){
256+
mask.insert(listener);
257+
}
258+
259+
void Input::removeMask(InputListener* listener){
260+
mask.erase(listener);
261+
}

libraries/CircuitOS/src/Input/Input.h

+14
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@ class Input : public LoopListener {
8282

8383
void removeListener(InputListener* listener);
8484

85+
bool getButtonState(uint8_t pin);
86+
87+
/**
88+
* Listener masking functions.
89+
*
90+
* Listeners added to mask will be ignored when input events happen.
91+
*/
92+
void maskAll();
93+
void unmaskAll();
94+
void addMask(InputListener* listener);
95+
void removeMask(InputListener* listener);
96+
8597
protected:
8698
uint8_t pinNumber = 0;
8799

@@ -116,6 +128,8 @@ class Input : public LoopListener {
116128
std::unordered_set<InputListener*> removedListeners;
117129

118130
void clearListeners();
131+
132+
std::unordered_set<InputListener*> mask;
119133
};
120134

121135

libraries/CircuitOS/src/Input/InputShift.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void InputShift::scanButtons(){
2424

2525
std::vector<bool> states(numShifts * 8, true);
2626
for(int i = 0; i < numShifts * 8; i++){
27-
states[i] = digitalRead(dataPin) == HIGH;
27+
states[numShifts * 8 - i - 1] = digitalRead(dataPin) == HIGH;
2828
HL(clockPin);
2929
}
3030

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "NullStream.h"
2+
3+
NullStream::NullStream(){
4+
setTimeout(0); // no timeout.
5+
}
6+
7+
int NullStream::available(){
8+
return 0;
9+
}
10+
11+
int NullStream::peek(){
12+
return EOF;
13+
}
14+
15+
int NullStream::read(){
16+
return EOF;
17+
}
18+
19+
void NullStream::flush(){
20+
return;
21+
}
22+
23+
size_t NullStream::write(const uint8_t data){
24+
bottomlessPit = data;
25+
return 1;
26+
}
27+
28+
size_t NullStream::write(const uint8_t* buffer, size_t size){
29+
if(size > 0) bottomlessPit = buffer[size - 1];
30+
return size;
31+
}

0 commit comments

Comments
 (0)