supla-device
Loading...
Searching...
No Matches
fram_spi.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4/*
5 * This extension depends on Adafruit FRAM SPI library
6 * Please install it from librarary manager in Arduino
7 */
8
9#ifndef SRC_SUPLA_STORAGE_FRAM_SPI_H_
10#define SRC_SUPLA_STORAGE_FRAM_SPI_H_
11
12#include <SPI.h>
13#include <supla/log_wrapper.h>
14
15#include "Adafruit_FRAM_SPI.h"
16#include "storage.h"
17
18#define SUPLA_FRAM_WRITING_PERIOD 1000
19
20namespace Supla {
21
22class FramSpi : public Storage {
23 public:
24 FramSpi(int8_t clk,
25 int8_t miso,
26 int8_t mosi,
27 int8_t framCs,
28 unsigned int storageStartingOffset = 0)
29 : Storage(storageStartingOffset), fram(clk, miso, mosi, framCs) {
30 setStateSavePeriod(SUPLA_FRAM_WRITING_PERIOD);
31 }
32
33 explicit FramSpi(int8_t framCs, unsigned int storageStartingOffset = 0)
34 : Storage(storageStartingOffset), fram(framCs) {
35 setStateSavePeriod(SUPLA_FRAM_WRITING_PERIOD);
36 }
37
38 bool init() {
39 if (fram.begin()) {
40 SUPLA_LOG_INFO("Storage: FRAM found");
41 } else {
42 SUPLA_LOG_INFO("Storage: FRAM not found");
43 }
44
45 return Storage::init();
46 }
47
48 void commit() {
49 }
50
51 protected:
52 int readStorage(unsigned int offset,
53 unsigned char *buf,
54 unsigned int size,
55 bool logs) {
56 for (int i = 0; i < size; i++) {
57 buf[i] = fram.read8(offset + i);
58 }
59 if (logs) {
60 static constexpr uint8_t MaxLogBytes = 32;
61 static constexpr uint16_t LogBufferSize = MaxLogBytes * 3 + 1;
62
63 uint8_t sizeMax = (size > MaxLogBytes) ? MaxLogBytes : size;
64
65 char logBuffer[LogBufferSize] = {};
66 int logSize = 0;
67
68 for (uint8_t i = 0; i < sizeMax && logSize < LogBufferSize - 1; i++) {
69 logSize += snprintf(
70 logBuffer + logSize, LogBufferSize - logSize, "%02X ", buf[i]);
71 }
72
73 SUPLA_LOG_INFO(
74 "FRAM: Read %d bytes [%s] (offset %d)", size, logBuffer, offset);
75 }
76
77 return size;
78 }
79
80 int writeStorage(unsigned int offset,
81 const unsigned char *buf,
82 unsigned int size) {
83 fram.writeEnable(true);
84 fram.write(offset, const_cast<uint8_t *>(buf), size);
85 fram.writeEnable(false);
86
87 SUPLA_LOG_INFO("FRAM: Wrote %d bytes (offset %d)", size, offset);
88
89 return size;
90 }
91
92 Adafruit_FRAM_SPI fram;
93};
94
95}; // namespace Supla
96
97#endif // SRC_SUPLA_STORAGE_FRAM_SPI_H_
Definition fram_spi.h:22
Definition storage.h:23