MCPcopy Create free account
hub / github.com/BruceDevices/firmware / rf_raw_save

Function rf_raw_save

src/modules/rf/save.cpp:2–75  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1#include "save.h"
2bool rf_raw_save(RawRecording recorded) {
3 FS *fs = nullptr;
4 if (!getFsStorage(fs) || fs == nullptr) {
5 displayError("No space left on device", true);
6 return false;
7 }
8
9 char filename[32];
10 int index = 0;
11
12 if (!fs->exists("/BruceRF")) {
13 if (!fs->mkdir("/BruceRF")) {
14 displayError("Error creating directory", true);
15 return false;
16 }
17 }
18
19 do { snprintf(filename, sizeof(filename), "/BruceRF/raw_%d.sub", index++); } while (fs->exists(filename));
20
21 File file = fs->open(filename, FILE_WRITE, true);
22 if (!file) {
23 displayError("Error creating file", true);
24 return false;
25 }
26
27 file.write((const uint8_t *)"Filetype: Bruce SubGhz File\n", 28);
28 file.write((const uint8_t *)"Version 1\n", 10);
29
30 char line[64];
31 int len = snprintf(line, sizeof(line), "Frequency: %d\n", (int)(recorded.frequency * 1000000));
32 file.write((const uint8_t *)line, len);
33
34 file.write((const uint8_t *)"Preset: 0\n", 10);
35 file.write((const uint8_t *)"Protocol: RAW\n", 14);
36 file.write((const uint8_t *)"RAW_Data: ", 10);
37
38 uint16_t values = 0;
39 for (size_t i = 0; i < recorded.codes.size(); ++i) {
40 size_t count = recorded.codeLengths[i];
41 for (size_t j = 0; j < count; ++j) {
42 // RAW_Data must keep maximun 512 values per line
43 // https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/file_formats/SubGhzFileFormats.md#raw-files
44 // check after each addition
45 auto &code = recorded.codes[i][j];
46 if (code.duration0 > 0) {
47 if (code.level0 != 1) file.write((const uint8_t *)"-", 1);
48 len = snprintf(line, sizeof(line), "%d ", code.duration0);
49 file.write((const uint8_t *)line, len);
50 values++;
51 if (values % 512 == 0) file.write((const uint8_t *)"\nRAW_Data: ", 11);
52 }
53 if (code.duration1 > 0) {
54 if (code.level1 != 1) file.write((const uint8_t *)"-", 1);
55 len = snprintf(line, sizeof(line), "%d ", code.duration1);
56 file.write((const uint8_t *)line, len);
57 values++;
58 if (values % 512 == 0) file.write((const uint8_t *)"\nRAW_Data: ", 11);
59 }
60 }

Callers 1

rf_raw_recordFunction · 0.85

Calls 7

getFsStorageFunction · 0.85
displayErrorFunction · 0.85
displaySuccessFunction · 0.85
sizeMethod · 0.80
closeMethod · 0.80
writeMethod · 0.45
flushMethod · 0.45

Tested by

no test coverage detected