Prusa MINI Firmware overview
GCodeThumbDecoder Class Reference

#include <gcode_thumb_decoder.h>

Public Member Functions

int Read (FIL *f, char *pc, int n)
 
void Reset ()
 

Static Public Member Functions

static GCodeThumbDecoderInstance ()
 

Member Function Documentation

◆ Instance()

static GCodeThumbDecoder& GCodeThumbDecoder::Instance ( )
static
145  {
146  static GCodeThumbDecoder i;
147  return i;
148  }
Here is the caller graph for this function:

◆ Read()

int GCodeThumbDecoder::Read ( FIL f,
char *  pc,
int  n 
)
71  {
72  static const size_t MAX_READ_LINES = 2048; // treba 2K radek
73  switch (state) {
74  case States::Searching: {
75  // ctu radky, dokud nenarazim na begin thumbnail nebo neprelezu max
76  // ctenou velikost (radove asi 64KB) nebo neskonci fajl
77  for (size_t lines = 0; lines < MAX_READ_LINES; ++lines) {
78  SLine l;
79  if (!ReadLine(f, l)) {
80  // tahle podminka nevypada na prvni pohled uplne spravne, ale je
81  // treba si uvedomit, ze hledany thumbnail rozhodne neni na
82  // konci fajlu, takze lze s klidem skoncit bez ocheckovani
83  // posledni nactene radky z fajlu Podobna domain-specific
84  // prasecina je tu vickrat
85  state = States::Error;
86  break; // konec souboru
87  }
88  if (l.IsBeginThumbnail()) {
89  state = States::Base64;
90  break; // nalezen png meho rozmeru, budu cist jeho data
91  }
92  }
93  if (state != States::Base64) {
94  // nenalezen png, konec fajlu nebo hloubky hledani
95  state = States::Error;
96  return -1;
97  }
98  }
99  // [[fallthrough]]; // here is no break intentionally
100  case States::Base64: {
101  int i = 0; // spravne by to melo byt unsigned, ale chci eliminovat
102  // warning i == n, pricemz n je definitoricky int
103  for (;;) {
104  // tady nemusim cist po radkach, akorat pak bych musel naprasit
105  // automat na hledani ; thumbnail end, coz se mi nechce nicmene ten
106  // vysledek musim prehodit do nejakyho zpracovanyho pole
107  if (bytesQ.isEmpty()) {
108  SLine l;
109  // nutno nacist dalsi line
110  if (!ReadLine(f, l)) {
111  state = States::Error; // rozbite, predcasny konec fajlu
112  return -1;
113  }
114  // kontrola, ze se precetla cela radka a nic se z toho
115  // nezahodilo v rezimu cteni base64 je to dulezite, nemuzu nic
116  // zahodit, rozbil bych si data
117  if (l.expectedLineSize > l.size) {
118  state = States::Error; // rozbite, moc dlouha radka
119  return -1;
120  }
121  if (l.IsEndThumbnail()) {
122  state = States::End; // platny konec thumbnailu
123  return i; // uz je EOF, nemam dalsi data, ale automat konci
124  // spravnym koncem
125  // vracim, kolik jsem dosud nactetl
126  } else if (LineIsBase64(l, bytesQ)) {
127  // line nactena v poradku a zdekodovana, stav base64
128  // zustava, ocekava se dalsi takova radka
129  } else {
130  state = States::Error;
131  return -1;
132  }
133  }
134  // tady zamerne NENI else
135  if (!bytesQ.isEmpty()) {
136  *(pc + i) = bytesQ.dequeue();
137  ++i;
138  if (i == n)
139  break;
140  }
141  }
142  return i;
143  }
144  default: // ve vsech ostatnich stavech vratit -1, nemam data, ani kdybych se
145  // rozkrajel
146  return -1;
147  }
148 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Reset()

void GCodeThumbDecoder::Reset ( )
156  {
157  // opakovani pokusu - cteni po vice bajtech
158  // nutno resetovat automaty, coz je taky potreba vyresit
159  state = States::Searching;
160  base64SD.Reset();
161  while (!bytesQ.isEmpty())
162  bytesQ.dequeue();
163  }
Here is the call graph for this function:
Here is the caller graph for this function:
CircularQueue::isEmpty
bool isEmpty()
Checks if the queue has no items.
Definition: circularqueue.h:101
SLine::size
uint8_t size
Definition: gcode_thumb_decoder.h:28
i
uint8_t i
Definition: screen_test_graph.c:72
CircularQueue::dequeue
T dequeue()
Removes and returns a item from the queue.
Definition: circularqueue.h:65
SLine
Definition: gcode_thumb_decoder.h:26
state
static volatile fsensor_t state
Definition: filament_sensor.c:23
SLine::expectedLineSize
size_t expectedLineSize
Definition: gcode_thumb_decoder.h:30
Base64StreamDecoder::Reset
void Reset()
Definition: base64_stream_decoder.h:26
SLine::IsEndThumbnail
bool IsEndThumbnail() const
Definition: gcode_thumb_decoder.cpp:29
g29_auto.lines
int lines
Definition: g29_auto.py:141
GCodeThumbDecoder
Definition: gcode_thumb_decoder.h:60
SLine::IsBeginThumbnail
bool IsBeginThumbnail() const
Definition: gcode_thumb_decoder.cpp:3