diff --git a/doxygen/html/CLI_8cpp_source.html b/doxygen/html/CLI_8cpp_source.html deleted file mode 100644 index 7819f10..0000000 --- a/doxygen/html/CLI_8cpp_source.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/CLI.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
CLI.cpp
-
-
-
1 #include "CLI.h"
-
2 #include "config.h"
-
3 #include "serial_output.h"
-
4 #include "tools.h"
-
5 #include "Settings.h"
-
6 #include "Radio.h"
-
7 #include "OOKwiz.h"
-
8 
-
9 #define COMMAND(c)
-
10  tmp = c;
-
11  if (cmd.startsWith(tmp)) {
-
12  args = cmd.substring(tmp.length() + 1);
-
13  tools::trim(args);
-
14 
-
15 #define END_CMD return; }
-
16 
-
17 
-
18 namespace CLI {
-
19 
-
20  bool cli_start_msg_printed = false;
-
21  String serial_buffer;
-
22  void parse(String cmd);
-
23 
-
24  void loop() {
-
25  if (!cli_start_msg_printed) {
-
26  INFO("CLI started on Serial. Type 'help' for list of commands.\n");
-
27  cli_start_msg_printed = true;
-
28  }
-
29  while (Serial.available()) {
-
30  char inp = Serial.read();
-
31  if (inp == char(13) || inp == char(10) || inp == ';') {
-
32  tools::trim(serial_buffer);
-
33  if (serial_buffer != "") {
-
34  parse(serial_buffer);
-
35  }
-
36  serial_buffer = "";
-
37  } else {
-
38  serial_buffer += inp;
-
39  }
-
40  }
-
41  }
-
42 
-
43  void parse(String cmd) {
-
44 
-
45  String args;
-
46  String tmp;
-
47 
-
48  INFO("\nCLI: %s\n", cmd.c_str());
-
49 
-
50  COMMAND("help")
-
51 INFO(R"(
-
52 OOKwiz version %s Command Line Interpreter help.
-
53 
-
54 Available commands:
-
55 
-
56 help - prints this message
-
57 set - shows current configuration settings
-
58 set x - sets configuration flag x
-
59 set x y - sets configuration value x to y
-
60 unset x - unsets a flag or variable
-
61 load [<file>] - loads the default saved settings, or from a named file in flash
-
62 save - saves to a file named 'default', which is what is used at boot time.
-
63 save [<file>] - saves the settings to a named file in SPIFFS flash
-
64 ls - lists stored configuration files in SPIFFS flash
-
65 rm <file> - deletes a configuration file
-
66 reboot - reboot using the saved defaults
-
67 standby - set radio to standby mode
-
68 receive - set radio to receive mode
-
69 sim <string> - Takes a RawTimings, Pulsetrain or Meaning string representation and
-
70  acts like it just came in off the air.
-
71 transmit <string> - Takes a RawTimings, Pulsetrain or Meaning string representation and
-
72  transmits it.
-
73 
-
74 rm default;reboot - restore factory settings
-
75 sr - shorthand for "save;reboot"
-
76 
-
77 
-
78 See the OOKwiz README.md on GitHub for a quick-start guide and full documentation
-
79 
-
80 )", OOKWIZ_VERSION);
-
81  END_CMD
-
82 
-
83  COMMAND("set")
-
84  if (args == "") {
-
85  INFO("%s\n", Settings::list().c_str());
-
86  return;
-
87  }
-
88  SPLIT(args, " ", name, value);
-
89  // Works both with 'set x y' and 'set x=y'
-
90  if (value == "") {
-
91  tools::split(args, "=", name, value);
-
92  }
-
93  if (Settings::set(name, value)) {
-
94  if (value != "") {
-
95  INFO("'%s' set to '%s'\n", name.c_str(), value.c_str());
-
96  } else {
-
97  INFO("'%s' set\n", name.c_str());
-
98  }
-
99  }
-
100  END_CMD
-
101 
-
102  COMMAND("unset")
-
103  if (Settings::unset(args)) {
-
104  INFO("Setting '%s' removed.\n", args.c_str());
-
105  }
-
106  END_CMD
-
107 
-
108  COMMAND("load")
-
109  if (args == "") {
-
110  args = "default";
-
111  }
-
112  Settings::load(args);
-
113  END_CMD
-
114 
-
115  COMMAND("save")
-
116  if (args == "") {
-
117  args = "default";
-
118  }
-
119  Settings::save(args);
-
120  END_CMD
-
121 
-
122  COMMAND("ls")
- -
124  END_CMD
-
125 
-
126  COMMAND("rm")
-
127  Settings::rm(args);
-
128  END_CMD
-
129 
-
130  COMMAND("reboot")
-
131  ESP.restart();
-
132  END_CMD
-
133 
-
134  COMMAND("receive")
-
135  if (OOKwiz::receive()) {
-
136  INFO("Receiver active, waiting for pulses.\n");
-
137  }
-
138  END_CMD
-
139 
-
140  COMMAND("standby")
-
141  if (OOKwiz::standby()) {
-
142  INFO("Transceiver placed in standby mode.\n");
-
143  }
-
144  END_CMD
-
145 
-
146  COMMAND("transmit")
-
147  OOKwiz::transmit(args);
-
148  END_CMD
-
149 
-
150  COMMAND("sim")
-
151  OOKwiz::simulate(args);
-
152  END_CMD
-
153 
-
154  COMMAND("sr")
-
155  if (Settings::save("default")) {
-
156  ESP.restart();
-
157  }
-
158  END_CMD
-
159 
-
160  INFO("Unknown command '%s'. Enter 'help' for a list of commands.\n", cmd.c_str());
-
161  }
-
162 
-
163 }
-
- - - - diff --git a/doxygen/html/CLI_8h_source.html b/doxygen/html/CLI_8h_source.html deleted file mode 100644 index 46c284e..0000000 --- a/doxygen/html/CLI_8h_source.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/CLI.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
CLI.h
-
-
-
1 #ifndef _CLI_H_
-
2 #define _CLI_H_
-
3 
-
4 #include <Arduino.h>
-
5 
-
6 namespace CLI {
-
7  void loop();
-
8 }
-
9 
-
10 #endif
-
- - - - diff --git a/doxygen/html/Device_8cpp_source.html b/doxygen/html/Device_8cpp_source.html deleted file mode 100644 index 1f37800..0000000 --- a/doxygen/html/Device_8cpp_source.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Device.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Device.cpp
-
-
-
1 #include "Device.h"
-
2 #include "serial_output.h"
-
3 #include "device_plugins/DEVICE_INDEX"
-
4 #include "tools.h"
-
5 #include "Settings.h"
-
6 
-
7 
-
8 // static members
-
9 decltype(Device::store) Device::store;
-
10 int Device::len = 0;
-
11 
-
12 bool Device::setup() {
-
13  INFO("Device plugins loaded: %s\n", list().c_str());
-
14  return true;
-
15 }
-
16 
-
17 bool Device::new_packet(RawTimings &raw, Pulsetrain &train, Meaning &meaning) {
-
18  for (int n = 0; n < len; n++) {
-
19  String name = store[n].name;
-
20  if (!Settings::isSet("device_" + name + "_disable")) {
-
21  DEBUG("Trying device plugin '%s'.\n", name.c_str());
-
22  if(store[n].pointer->receive(raw, train, meaning)) {
-
23  DEBUG("Device plugin '%s' understood it!\n", name.c_str());
-
24  return true;
-
25  }
-
26  }
-
27  }
-
28  return false;
-
29 }
-
30 
-
31 // Uses char*, and does not DEBUG or INFO because this is ran by the contructor
-
32 // of the AutoRegister trick, so String and Serial are not available yet.
-
33 bool Device::add(const char* name, Device *pointer) {
-
34  if (len == MAX_DEVICES) {
-
35  return false;
-
36  }
-
37  strncpy(store[len].name, name, MAX_DEVICE_NAME_LEN);
-
38  store[len].name[MAX_DEVICE_NAME_LEN] = 0; // just in case
-
39  store[len].pointer = pointer;
-
40  len++;
-
41  return true;
-
42 }
-
43 
-
44 String Device::list(String separator) {
-
45  String ret;
-
46  for (int n = 0; n < len; n++) {
-
47  ret += store[n].name;
-
48  String disable_key;
-
49  snprintf_append(disable_key, 50, "device_%s_disable", store[n].name);
-
50  if (Settings::isSet(disable_key)) {
-
51  ret += " [disabled]";
-
52  }
-
53  if (n < len - 1) {
-
54  ret += separator;
-
55  }
-
56  }
-
57  return ret;
-
58 }
-
59 
-
60 bool Device::transmit(const String &plugin_name, const String &toTransmit) {
-
61  for (int n = 0; n < len; n++) {
-
62  if (String(store[n].name) == plugin_name) {
-
63  return store[n].pointer->transmit(toTransmit);
-
64  }
-
65  }
-
66  return false;
-
67 }
-
68 
-
69 bool Device::receive(const RawTimings &raw, const Pulsetrain &train, const Meaning &meaning) {
-
70  return false;
-
71 }
-
72 
-
73 bool Device::transmit(const String &toTransmit) {
-
74  return false;
-
75 }
-
- - - - diff --git a/doxygen/html/Device_8h_source.html b/doxygen/html/Device_8h_source.html deleted file mode 100644 index de0e3ab..0000000 --- a/doxygen/html/Device_8h_source.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Device.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Device.h
-
-
-
1 #ifndef _DEVICE_H_
-
2 #define _DEVICE_H_
-
3 
-
4 #include <Arduino.h>
-
5 #include "config.h"
-
6 #include "RawTimings.h"
-
7 #include "Pulsetrain.h"
-
8 #include "Meaning.h"
-
9 #include "tools.h"
-
10 
-
11 #define DEVICE_PLUGIN_START(name)
-
12  namespace ook {
-
13  namespace device_ ## name {
-
14  class DevicePlugin : public Device {
-
15  public:
-
16 
-
17 #define DEVICE_PLUGIN_END(name)
-
18  };
-
19  struct AutoRegister {
-
20  AutoRegister() {
-
21  static DevicePlugin devicePlugin;
-
22  Device::add(#name, static_cast<Device*>(&devicePlugin));
-
23  }
-
24  } autoRegister;
-
25 
-
26  }
-
27  }
-
28 
-
29 
-
30 // Device::store cannot become an std::vector because of the auto-register trick.
-
31 
-
32 class Device {
-
33 public:
-
34  static struct {
-
35  Device* pointer;
-
36  char name[MAX_DEVICE_NAME_LEN];
-
37  } store[MAX_DEVICES];
-
38  static int len;
-
39  static bool setup();
-
40  static bool add(const char* name, Device *pointer);
-
41  static String list(String separator = ", ");
-
42  static bool new_packet(RawTimings &raw, Pulsetrain &train, Meaning &meaning);
-
43  static bool transmit(const String &plugin_name, const String &toTransmit);
-
44  virtual bool receive(const RawTimings &raw, const Pulsetrain &train, const Meaning &meaning);
-
45  virtual bool transmit(const String &toTransmit);
-
46 };
-
47 
-
48 
-
49 #endif
-
- - - - diff --git a/doxygen/html/Meaning_8cpp_source.html b/doxygen/html/Meaning_8cpp_source.html deleted file mode 100644 index d6316e4..0000000 --- a/doxygen/html/Meaning_8cpp_source.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Meaning.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Meaning.cpp
-
-
-
1 #include "config.h"
-
2 #include "Meaning.h"
-
3 #include "Pulsetrain.h"
-
4 #include "RawTimings.h"
-
5 #include "serial_output.h"
-
6 #include "tools.h"
-
7 
-
8 
-
9 // Helpful URL: https://gabor.heja.hu/blog/2020/03/16/receiving-and-decoding-433-mhz-radio-signals-from-wireless-devices/
-
10 
-
11 /// @brief See if String might be a representation of Maening. No guarantees until you try to convert it, but silent.
-
12 /// @param str String that we are curious about
-
13 /// @return `true` if it might be a Meaning String, `false` if not.
-
14 bool Meaning::maybe(String str) {
-
15  if (str.indexOf("(") != -1) {
-
16  DEBUG("Meaning::maybe() returns true.\n");
-
17  return true;
-
18  }
-
19  return false;
-
20 }
-
21 
-
22 /// @brief If you try to evaluate the instance as a bool, for instance in `if (myMeaning) ...`, it will be `true` if this holds Meaning elements.
-
23 Meaning::operator bool() {
-
24  return (elements.size() > 0);
-
25 }
-
26 
-
27 /// @brief empty out all Meaning elements
-
28 void Meaning::zap() {
-
29  elements.clear();
-
30  suspected_incomplete = false;
-
31 }
-
32 
-
33 
-
34 /// @brief Convert Pulsetrain to Meaning
-
35 /// @param train Pulsetrain we want to convert
-
36 /// @return `true` if there was data found, `false` otherwise.
- -
38  // Clear out current Meaning
-
39  zap();
-
40  // Easy stuff, just copy
-
41  repeats = train.repeats;
-
42  gap = train.gap;
-
43  // Copy the bins from the Pulsetrain in prevalence
-
44  typedef struct prevalence_t {
-
45  int bin;
-
46  int count;
-
47  } prevalence_t;
-
48  prevalence_t prevalence[train.bins.size()];
-
49  for (int n = 0; n < train.bins.size(); n++) {
-
50  prevalence[n].bin = n;
-
51  prevalence[n].count = train.bins[n].count;
-
52  }
-
53  // bubblesort by .count, i.e. the number of times that length occurred.
-
54  prevalence_t temp;
-
55  for (int i = 0; i < train.bins.size(); i++) {
-
56  for (int j = 0; j < train.bins.size() - i - 1; j++) {
-
57  if (prevalence[j].count < prevalence[j + 1].count) {
-
58  temp = prevalence[j];
-
59  prevalence[j] = prevalence[j + 1];
-
60  prevalence[j + 1] = temp;
-
61  }
-
62  }
-
63  }
-
64  // If the two most prevalent pulse lengths are most of the signal, it's likely PWM
-
65  bool likely_PWM = false;
-
66  if (
-
67  train.bins.size() >= 2 &&
-
68  abs(prevalence[0].count - prevalence[1].count) <= 2 // &&
-
69  // train.transitions.size() - (prevalence[0].count + prevalence[1].count) <= 5
-
70  ) {
-
71  likely_PWM = true;
-
72  DEBUG("likely_PWM set.\n", likely_PWM);
-
73  }
-
74  // If the three most prevalent pulse lengths are most of the signal, prevalence of #2 and
-
75  // #3 add up to the #1, and together they are most of the signal, it's likely PPM.
-
76  bool likely_PPM = false;
-
77  if (
-
78  train.bins.size() >= 3 &&
-
79  prevalence[0].count - (prevalence[1].count + prevalence[2].count) >= -2 &&
-
80  prevalence[0].count - (prevalence[1].count + prevalence[2].count) <= 4 // &&
-
81  // train.transitions.size() - (prevalence[0].count + prevalence[1].count + prevalence[2].count) <= 7
-
82  ) {
-
83  likely_PPM = true;
-
84  DEBUG("likely_PPM set.\n", likely_PPM);
-
85  }
-
86  // If we don't know the modulation, we're not going to do anything useful, so give up
-
87  if (!likely_PWM && !likely_PPM) {
-
88  DEBUG("Could not parse Pulsetrain, no likely modulation found.\n");
-
89  return false;
-
90  }
-
91  // Now we walk the train's transitions and decipher
-
92  bool something_decoded = false;
-
93  for (int n = 0; n < train.transitions.size(); n++) {
-
94  int r;
-
95  if (likely_PWM) {
-
96  r = parsePWM(train, n, train.transitions.size() - 1, prevalence[0].bin, prevalence[1].bin);
-
97  } else if (likely_PPM) {
-
98  r = parsePPM(train, n, train.transitions.size() - 1, prevalence[1].bin, prevalence[2].bin, prevalence[0].bin);
-
99  }
-
100  if (r == -1) {
-
101  return false;
-
102  } else if (r > 0) {
-
103  n += r - 1; // Minus 1 bc the next iteration will also increment 1
-
104  something_decoded = true;
-
105  continue;
-
106  }
-
107  // Otherwise add as a pulse or gap
-
108  if (n % 2 == 0) {
-
109  if (!addPulse(train.bins[train.transitions[n]].average)) {
-
110  return false;
-
111  }
-
112  } else {
-
113  if (!addGap(train.bins[train.transitions[n]].average)) {
-
114  return false;
-
115  }
-
116  }
-
117  }
-
118  if (!something_decoded) {
-
119  zap();
-
120  return false;
-
121  }
-
122  if (train.repeats > 1) {
-
123  suspected_incomplete = false;
-
124  }
-
125  return (elements.size() > 0);
-
126 }
-
127 
-
128 /// @brief Decode PWM data with specified timings from given range in Pulsetrain to a new Meaning element. Normally called by `fromPulsetrain`, but can be used from user code also.
-
129 /// @param train Pulsetrain we're reading from
-
130 /// @param from start at this interval
-
131 /// @param to end before this interval
-
132 /// @param space bin number (NOT time in µs) for space (first if bit 0)
-
133 /// @param mark bin number (NOT time in µs) for mark (first if bit 1)
-
134 /// @return Number of intervals read before read error (mark-mark, space-space or bin number not mark or space)
-
135 int Meaning::parsePWM(const Pulsetrain &train, int from, int to, int space, int mark) {
-
136  DEBUG ("Entered parsePWM with from: %i, to: %i space: %i, mark: %i\n", from, to, space, mark);
-
137  uint8_t tmp_data[MAX_MEANING_DATA] = { 0 };
-
138  int transitions_parsed = 0;
-
139  int num_bits = 0;
-
140  for (int n = from; n <= to; n += 2) {
-
141  int current = train.transitions[n];
-
142  int next = train.transitions[n + 1];
-
143  if (current == space && next == mark) {
-
144  num_bits++;
-
145  tools::shiftInBit(tmp_data, num_bits, 0);
-
146  transitions_parsed += 2;
-
147  } else if (current == mark && next == space) {
-
148  num_bits++;
-
149  tools::shiftInBit(tmp_data, num_bits, 1);
-
150  transitions_parsed += 2;
-
151  } else {
-
152  break;
-
153  }
-
154  }
-
155  if (num_bits % 4 != 0) {
-
156  suspected_incomplete = true;
-
157  }
-
158  if (num_bits >= 8) {
-
159  MeaningElement new_element;
-
160  new_element.data_len = num_bits;
-
161  int len_in_bytes = (num_bits + 7) / 8;
-
162  // Write data
-
163  for (int n = 0; n < len_in_bytes; n++) {
-
164  new_element.data.insert(new_element.data.begin(), tmp_data[n]); // reverses order
-
165  }
-
166  new_element.type = PWM;
-
167  new_element.time1 = train.bins[space].average;
-
168  new_element.time2 = train.bins[mark].average;
-
169  elements.push_back(new_element);
-
170  return transitions_parsed;
-
171  } else {
-
172  return 0;
-
173  }
-
174 }
-
175 
-
176 /// @brief Decode PPM data with specified timings from given range in Pulsetrain to a new Meaning element. Normally called by `fromPulsetrain`, but can be used from user code also.
-
177 /// @param train Pulsetrain we're reading from
-
178 /// @param from start at this interval
-
179 /// @param to end before this interval
-
180 /// @param space bin number (NOT time in µs) for space (first if bit 0)
-
181 /// @param mark bin number (NOT time in µs) for mark (first if bit 1)
-
182 /// @param filler bin number for delineator interval between the mark and space intervals
-
183 /// @return Number of intervals read before read error
-
184 int Meaning::parsePPM(const Pulsetrain &train, int from, int to, int space, int mark, int filler) {
-
185  DEBUG ("Entered parsePPM with from: %i, to: %i space: %i, mark: %i, filler: %i\n", from, to, space, mark, filler);
-
186  uint8_t tmp_data[MAX_MEANING_DATA] = { 0 };
-
187  int transitions_parsed = 0;
-
188  int num_bits = 0;
-
189  int previous = -1;
-
190  for (int n = from; n <= to; n++) {
-
191  int current = train.transitions[n];
-
192  if (current == space && previous == filler) {
-
193  num_bits++;
-
194  tools::shiftInBit(tmp_data, num_bits, 0);
-
195  transitions_parsed++;
-
196  } else if (current == mark && previous == filler) {
-
197  num_bits++;
-
198  tools::shiftInBit(tmp_data, num_bits, 1);
-
199  transitions_parsed++;
-
200  } else if (current == filler) {
-
201  if (previous == filler) {
-
202  break;
-
203  }
-
204  transitions_parsed++;
-
205  } else {
-
206  break;
-
207  }
-
208  previous = current;
-
209  }
-
210  if (num_bits % 4 != 0) {
-
211  suspected_incomplete = true;
-
212  }
-
213  if (num_bits >= 8) {
-
214  MeaningElement new_element;
-
215  new_element.data_len = num_bits;
-
216  int len_in_bytes = (num_bits + 7) / 8;
-
217  // Write data
-
218  for (int n = 0; n < len_in_bytes; n++) {
-
219  new_element.data.insert(new_element.data.begin(), tmp_data[n]); // reverses order
-
220  }
-
221  new_element.type = PPM;
-
222  new_element.time1 = train.bins[space].average;
-
223  new_element.time2 = train.bins[mark].average;
-
224  new_element.time3 = train.bins[filler].average;
-
225  elements.push_back(new_element);
-
226  return transitions_parsed;
-
227  } else {
-
228  return 0;
-
229  }
-
230 }
-
231 
-
232 /// @brief Get the String representation, which looks like `pulse(5906) + pwm(timing 190/575, 24 bits 0x1772A4)`
-
233 /// @return the String representation
- -
235  String res = "";
-
236  for (const auto& element : elements) {
-
237  switch (element.type) {
-
238  case PULSE:
-
239  snprintf_append(res, 20, "pulse(%i)", element.time1);
-
240  break;
-
241  case GAP:
-
242  snprintf_append(res, 20, "gap(%i)", element.time1);
-
243  break;
-
244  case PWM:
-
245  snprintf_append(res, 60, "pwm(timing %i/%i, %i bits 0x", element.time1, element.time2, element.data_len);
-
246  for (int m = 0; m < (element.data_len + 7) / 8; m++) {
-
247  snprintf_append(res, 5, "%02X", element.data[m]);
-
248  }
-
249  res = res + ")";
-
250  break;
-
251  case PPM:
-
252  snprintf_append(res, 60, "ppm(timing %i/%i/%i, %i bits 0x", element.time1, element.time2, element.time3, element.data_len);
-
253  for (int m = 0; m < (element.data_len + 7) / 8; m++) {
-
254  snprintf_append(res, 5, "%02X", element.data[m]);
-
255  }
-
256  res = res + ")";
-
257  break;
-
258  }
-
259  res += " + ";
-
260  }
-
261  res = res.substring(0, res.length() - 3); // cut off the last " + "
-
262  if (repeats > 1) {
-
263  snprintf_append(res, 40, " Repeated %i times with %i µs gap.", repeats, gap);
-
264  }
-
265  if (suspected_incomplete) {
-
266  res = res + " (SUSPECTED INCOMPLETE)";
-
267  }
-
268  return res;
-
269 }
-
270 
-
271 /// @brief Read a String representation like above, and store in this instance
-
272 /// @return `true` if it worked, `false` (with error message) if it didn't.
-
273 bool Meaning::fromString(String in) {
-
274  in.toLowerCase();
-
275  repeats = 1;
-
276  int rptd = in.indexOf("repeated");
-
277  if (rptd != -1) {
-
278  String str_repeats = in.substring(rptd);
-
279  repeats = tools::nthNumberFrom(str_repeats, 0);
-
280  gap = tools::nthNumberFrom(str_repeats, 1);
-
281  in = in.substring(0, rptd);
-
282  if (repeats == 0 or gap == 0) {
-
283  ERROR("ERROR: cannot convert String to Meaning: invalid values for repeats or gap.\n");
-
284  return false;
-
285  }
-
286  }
-
287  String work;
-
288  bool done = false;
-
289  while (!done) {
-
290  int plus = in.indexOf("+");
-
291  if (plus != -1) {
-
292  work = in.substring(0, plus);
-
293  in = in.substring(plus + 1);
-
294  } else {
-
295  work = in;
-
296  done = true;
-
297  }
-
298  tools::trim(work);
-
299  int open_bracket = work.indexOf("(");
-
300  int closing_bracket = work.indexOf(")");
-
301  if (open_bracket == -1 || closing_bracket == -1) {
-
302  ERROR("ERROR: cannot convert String to Meaning: incorrect element '%s'.\n", work);
-
303  return false;
-
304  }
-
305  if (work.startsWith("pulse")) {
-
306  int num = tools::nthNumberFrom(work, 0);
-
307  if (num == -1) {
-
308  ERROR("ERROR: cannot convert String to Meaning: no length found in '%s'.\n", work);
-
309  return false;
-
310  }
-
311  addPulse(num);
-
312  }
-
313  if (work.startsWith("gap")) {
-
314  int num = tools::nthNumberFrom(work, 0);
-
315  if (num == -1) {
-
316  ERROR("ERROR: cannot convert String to Meaning: no length found in '%s'.\n", work);
-
317  return false;
-
318  }
-
319  addGap(num);
-
320  }
-
321  if (work.startsWith("ppm")) {
-
322  int time1 = tools::nthNumberFrom(work, 0);
-
323  int time2 = tools::nthNumberFrom(work, 1);
-
324  int time3 = tools::nthNumberFrom(work, 2);
-
325  int bits = tools::nthNumberFrom(work, 3);
-
326  int check_zero = tools::nthNumberFrom(work, 4);
-
327  if (time1 < 1 || time2 < 1 || time3 < 1 || check_zero != 0) {
-
328  ERROR("ERROR: cannot convert String to Meaning: '%s' malformed.\n", work);
-
329  return false;
-
330  }
-
331  int data_start = work.indexOf("0x");
-
332  int data_end = work.indexOf(")");
-
333  if (data_start == -1 || data_end < data_start) {
-
334  ERROR("ERROR: cannot convert String to Meaning: '%s' malformed.\n", work);
-
335  return false;
-
336  }
-
337  String hex_data = work.substring(data_start + 2, data_end);
-
338  int bytes_expected = (bits + 7) / 8;
-
339  if (hex_data.length() != bytes_expected * 2) {
-
340  ERROR("ERROR: cannot convert String to Meaning: %i bits means %i data bytes in hex expected.\n", bits, bytes_expected);
-
341  return false;
-
342  }
-
343  uint8_t tmp_data[bytes_expected];
-
344  for (int n = 0; n < bytes_expected; n++) {
-
345  tmp_data[n] = strtoul(hex_data.substring(n * 2, (n * 2) + 2).c_str(), nullptr, 16);
-
346  }
-
347  addPPM(time1, time2, time3, bits, tmp_data);
-
348  }
-
349  if (work.startsWith("pwm")) {
-
350  int time1 = tools::nthNumberFrom(work, 0);
-
351  int time2 = tools::nthNumberFrom(work, 1);
-
352  int bits = tools::nthNumberFrom(work, 2);
-
353  int check_zero = tools::nthNumberFrom(work, 3);
-
354  if (time1 < 1 || time2 < 1 || check_zero != 0) {
-
355  ERROR("ERROR: cannot convert String to Meaning: '%s' malformed.\n", work);
-
356  return false;
-
357  }
-
358  int data_start = work.indexOf("0x");
-
359  int data_end = work.indexOf(")");
-
360  if (data_start == -1 || data_end < data_start) {
-
361  ERROR("ERROR: cannot convert String to Meaning: '%s' malformed.\n", work);
-
362  return false;
-
363  }
-
364  String hex_data = work.substring(data_start + 2, data_end);
-
365  tools::trim(hex_data);
-
366  int bytes_expected = (bits + 7) / 8;
-
367  if (hex_data.length() != bytes_expected * 2) {
-
368  ERROR("ERROR: cannot convert String to Meaning: %i bits means %i data bytes in hex expected.\n", bits, bytes_expected);
-
369  return false;
-
370  }
-
371  uint8_t tmp_data[bytes_expected];
-
372  for (int n = 0; n < bytes_expected; n++) {
-
373  tmp_data[n] = strtoul(hex_data.substring(n * 2, (n * 2) + 2).c_str(), nullptr, 16);
-
374  }
-
375  addPWM(time1, time2, bits, tmp_data);
-
376  }
-
377  }
-
378  return true;
-
379 }
-
380 
-
381 /// @brief Adds a "pulse" Meaning element
-
382 /// @param pulse_time time in µs
-
383 /// @return `true`
-
384 bool Meaning::addPulse(uint16_t pulse_time) {
-
385  MeaningElement new_element;
-
386  new_element.type = PULSE;
-
387  new_element.time1 = pulse_time;
-
388  elements.push_back(new_element);
-
389  return true;
-
390 }
-
391 
-
392 /// @brief Adds a "gap"" Meaning element
-
393 /// @param gap_time time in µs
-
394 /// @return `true`
-
395 bool Meaning::addGap(uint16_t gap_time) {
-
396  MeaningElement new_element;
-
397  new_element.type = GAP;
-
398  new_element.time1 = gap_time;
-
399  elements.push_back(new_element);
-
400  return true;
-
401 }
-
402 
-
403 /// @brief Adds a new meaning element with the specified PPM-encoded data
-
404 /// @param space time in µs
-
405 /// @param mark time in µs
-
406 /// @param filler time in µs
-
407 /// @param bits Length of data at tmp_data IN BITS, not bytes
-
408 /// @param tmp_data pointer to `uint8_t` array with the data
-
409 /// @return `true`
-
410 bool Meaning::addPPM(int space, int mark, int filler, int bits, uint8_t* tmp_data) {
-
411  MeaningElement new_element;
-
412  int len_in_bytes = (bits + 7) / 8;
-
413  new_element.data_len = bits;
-
414  for (int n = 0; n < len_in_bytes; n++) {
-
415  new_element.data.push_back(tmp_data[n]);
-
416  }
-
417  new_element.type = PPM;
-
418  new_element.time1 = space;
-
419  new_element.time2 = mark;
-
420  new_element.time3 = filler;
-
421  elements.push_back(new_element);
-
422  return true;
-
423 }
-
424 
-
425 /// @brief Adds a new meaning element with the specified PWM-encoded data
-
426 /// @param space time in µs
-
427 /// @param mark time in µs
-
428 /// @param bits Length of data at tmp_data IN BITS, not bytes
-
429 /// @param tmp_data pointer to `uint8_t` array with the data
-
430 /// @return `true`
-
431 bool Meaning::addPWM(int space, int mark, int bits, uint8_t* tmp_data) {
-
432  MeaningElement new_element;
-
433  int len_in_bytes = (bits + 7) / 8;
-
434  new_element.data_len = bits;
-
435  for (int n = 0; n < len_in_bytes; n++) {
-
436  new_element.data.push_back(tmp_data[n]);
-
437  }
-
438  new_element.type = PWM;
-
439  new_element.time1 = space;
-
440  new_element.time2 = mark;
-
441  elements.push_back(new_element);
-
442  return true;
-
443 }
-
- - - - diff --git a/doxygen/html/Meaning_8h_source.html b/doxygen/html/Meaning_8h_source.html deleted file mode 100644 index fff1b66..0000000 --- a/doxygen/html/Meaning_8h_source.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Meaning.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Meaning.h
-
-
-
1 #ifndef _MEANING_H_
-
2 #define _MEANING_H_
-
3 
-
4 #include <vector>
-
5 #include <Arduino.h>
-
6 #include "config.h"
-
7 
-
8 class Pulsetrain;
-
9 
-
10 /// @brief Encodes type of modulation for a MeaningElement
-
11 typedef enum modulation {
-
12  UNKNOWN,
-
13  PULSE,
-
14  GAP,
-
15  PWM,
-
16  PPM
-
17 } modulation;
-
18 
-
19 /// @brief Chunks of parsed packet. Either a pulse, a gap or a block of decoded data
-
20 typedef struct MeaningElement {
-
21  modulation type;
-
22  std::vector<uint8_t> data;
-
23  uint16_t data_len; // in bits
-
24  uint16_t time1;
-
25  uint16_t time2;
-
26  uint16_t time3;
-
27 } MeaningElement;
-
28 
-
29 /// @brief Holds the parsed packet as a collection of MeaningElements
-
30 class Meaning {
-
31 public:
-
32  /// @brief The MeaningElement structs that make up the parsed packet
- -
34  /// @brief Set when there were no repetitions and the number of bits detected is not divisible by 4
-
35  bool suspected_incomplete = false;
-
36  /// @brief Number of repeats of the signal
- -
38  /// @brief Shortest time between two repetitions
- -
40 
-
41  static bool maybe(String str);
-
42  operator bool();
-
43  void zap();
-
44  bool fromPulsetrain(Pulsetrain &train);
-
45  bool addPulse(uint16_t pulse_time);
-
46  bool addGap(uint16_t pulse_time);
-
47  bool addPWM(int space, int mark, int bits, uint8_t* tmp_data);
-
48  bool addPPM(int space, int mark, int filler, int bits, uint8_t* tmp_data);
-
49  String toString();
-
50  bool fromString(String in);
-
51  int parsePWM(const Pulsetrain &train, int from, int to, int space, int mark);
-
52  int parsePPM(const Pulsetrain &train, int from, int to, int space, int mark, int filler);
-
53 };
-
54 
-
55 #endif
-
- - - - diff --git a/doxygen/html/OOKwiz_8cpp_source.html b/doxygen/html/OOKwiz_8cpp_source.html deleted file mode 100644 index 48755aa..0000000 --- a/doxygen/html/OOKwiz_8cpp_source.html +++ /dev/null @@ -1,669 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/OOKwiz.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
OOKwiz.cpp
-
-
-
1 #include "OOKwiz.h"
-
2 #include "CLI.h"
-
3 #include "serial_output.h"
-
4 
-
5 volatile OOKwiz::Rx_State OOKwiz::rx_state = OOKwiz::RX_OFF;
-
6 bool OOKwiz::serial_cli_disable = false;
-
7 int OOKwiz::first_pulse_min_len;
-
8 int OOKwiz::pulse_gap_min_len;
-
9 int OOKwiz::min_nr_pulses;
-
10 int OOKwiz::max_nr_pulses;
-
11 int OOKwiz::pulse_gap_len_new_packet;
-
12 int OOKwiz::noise_penalty;
-
13 int OOKwiz::noise_threshold;
-
14 int OOKwiz::noise_score;
-
15 bool OOKwiz::no_noise_fix = false;
-
16 int64_t OOKwiz::last_transition;
-
17 hw_timer_t* OOKwiz::transitionTimer = nullptr;
-
18 hw_timer_t* OOKwiz::repeatTimer = nullptr;
-
19 long OOKwiz::repeat_timeout;
-
20 bool OOKwiz::rx_active_high;
-
21 bool OOKwiz::tx_active_high;
-
22 BufferPair OOKwiz::isr_in;
-
23 BufferPair OOKwiz::isr_compare;
-
24 BufferPair OOKwiz::isr_out;
-
25 RawTimings OOKwiz::loop_raw;
-
26 Pulsetrain OOKwiz::loop_train;
-
27 Meaning OOKwiz::loop_meaning;
-
28 int64_t OOKwiz::last_periodic = 0;
-
29 void (*OOKwiz::callback)(RawTimings, Pulsetrain, Meaning) = nullptr;
-
30 
-
31 /// @brief Starts OOKwiz. Loads settings, initializes the radio and starts receiving if it finds the appropriate settings.
-
32 /**
-
33  * If you set the GPIO pin for a button on your ESP32 in 'pin_rescue' and press it during boot, OOKwiz will not
-
34  * initialize SPI and the radio, possibly breaking an endless boot loop. Set 'rescue_active_high' if the button
-
35  * connects to VCC instead of GND.
-
36  *
-
37  * Normally, OOKwiz will start up in receive mode. If you set 'start_in_standby', it will start in standby mode instead.
-
38 */
-
39 /// @param skip_saved_defaults The settings in the SPIFFS file 'defaults' are not read when this
-
40 /// is true, leaving only the factory defaults from config.cpp.
-
41 /// @return true if setup succeeded, false if it could not complete, e.g. because the radio is not configured yet.
-
42 bool OOKwiz::setup(bool skip_saved_defaults) {
-
43 
-
44  // Make sure nothing is missed when we paste raw data to 'sim' or 'transmit' CLI commands.
-
45  Serial.setRxBufferSize(SERIAL_RX_BUFFER_SIZE);
-
46 
-
47  // Sometimes USB needs to wake up, and we want to see what OOKwiz does
-
48  // right after it is woken up with OOKwiz::setup().
-
49  delay(1000);
-
50 
-
51  // Tada !
-
52  INFO("\n\nOOKwiz version %s (built %s %s) initializing.\n", OOKWIZ_VERSION, __DATE__, __TIME__);
-
53 
-
54  // The factory defaults are loaded pre-main by Settings object constructor
-
55  if (skip_saved_defaults == true) {
-
56  INFO("OOKwiz::setup(true) called: not loading user defaults, factory settings only.\n");
-
57  } else {
-
58  // Try to get the runtime settings from SPIFFS
-
59  if (!Settings::fileExists("default") || !Settings::load("default")) {
-
60  INFO("No saved settings found, using factory settings.\n");
-
61  }
-
62  }
-
63 
-
64  // Skip the rest of OOKwiz::setup() by returning false when recue button pressed
-
65  int pin_rescue;
-
66  SETTING_WITH_DEFAULT(pin_rescue, -1);
-
67  if (pin_rescue != -1) {
-
68  PIN_INPUT(pin_rescue);
-
69  if (digitalRead(pin_rescue) == Settings::isSet("rescue_active_high")) {
-
70  INFO("Rescue button pressed at boot, skipping initialization.\n");
-
71  Settings::unset("serial_cli_disable");
-
72  return false;
-
73  }
-
74  }
-
75 
-
76  if (!Radio::setup()) {
-
77  ERROR("ERROR: Your radio doesn't set up correctly. Make sure you set the correct\n radio and pins, save settings and reboot.\n");
-
78  return false;
-
79  }
-
80 
-
81  Device::setup();
-
82 
-
83  // These settings determine what a valid transmission is
-
84  SETTING_OR_ERROR(pulse_gap_len_new_packet);
-
85  SETTING_OR_ERROR(repeat_timeout);
-
86  SETTING_OR_ERROR(first_pulse_min_len);
-
87  SETTING_OR_ERROR(pulse_gap_min_len);
-
88  SETTING_OR_ERROR(min_nr_pulses);
-
89  SETTING_OR_ERROR(max_nr_pulses);
-
90  SETTING_OR_ERROR(noise_penalty);
-
91  SETTING_OR_ERROR(noise_threshold);
-
92  no_noise_fix = Settings::isSet("no_noise_fix");
-
93  rx_active_high = Settings::isSet("rx_active_high");
-
94  tx_active_high = Settings::isSet("tx_active_high");
-
95 
-
96  // Timer for pulse_gap_len_new_packet
-
97  transitionTimer = timerBegin(0, 80, true);
-
98  timerAttachInterrupt(transitionTimer, &ISR_transitionTimeout, false);
-
99  timerAlarmWrite(transitionTimer, pulse_gap_len_new_packet, true);
-
100  timerAlarmEnable(transitionTimer);
-
101  timerStart(transitionTimer);
-
102 
-
103  // Timer for repeat_timeout
-
104  repeatTimer = timerBegin(1, 80, true);
-
105  timerAttachInterrupt(repeatTimer, &ISR_repeatTimeout, false);
-
106  timerAlarmWrite(repeatTimer, repeat_timeout, true);
-
107  timerAlarmEnable(repeatTimer);
-
108  timerStart(repeatTimer);
-
109 
-
110  // The ISR that actually reads the data
-
111  attachInterrupt(Radio::pin_rx, ISR_transition, CHANGE);
-
112 
-
113  if (Settings::isSet("start_in_standby")) {
-
114  return standby();
-
115  } else {
-
116  return receive();
-
117  }
-
118 
-
119 }
-
120 
-
121 /// @brief To be called from your own `loop()` function.
-
122 /**
-
123  * Does the high-level processing of packets as soon as they are received and
-
124  * processed by the ISR functions. Handles the serial port output of each packet
-
125  * as well as calling the user's own callback function and the various device
-
126  * plugins.
-
127 */
-
128 /// @return always returns `true`
-
129 bool OOKwiz::loop() {
-
130  // Stuff that happens only once a seccond
-
131  if (esp_timer_get_time() - last_periodic > 1000000) {
-
132  // If any of the core parameters have changed in settings,
-
133  // update their variables.
-
134  SETTING(repeat_timeout);
-
135  SETTING(first_pulse_min_len);
-
136  SETTING(pulse_gap_min_len);
-
137  SETTING(min_nr_pulses);
-
138  SETTING(max_nr_pulses);
-
139  no_noise_fix = Settings::isSet("no_noise_fix");
-
140  serial_cli_disable = Settings::isSet("serial_cli_disable");
-
141  // The timers are a bit more involved as their new values need to be written
-
142  int new_p_g_l_n_p = Settings::getInt("pulse_gap_len_new_packet", -1);
-
143  if (new_p_g_l_n_p != pulse_gap_len_new_packet) {
-
144  pulse_gap_len_new_packet = new_p_g_l_n_p;
-
145  timerAlarmWrite(transitionTimer, pulse_gap_len_new_packet, true);
-
146  }
-
147  int new_r_t = Settings::getInt("repeat_timeout", -1);
-
148  if (new_r_t != repeat_timeout) {
-
149  repeat_timeout = new_r_t;
-
150  timerAlarmWrite(repeatTimer, repeat_timeout, true);
-
151  }
-
152  last_periodic = esp_timer_get_time();
-
153  }
-
154  // Have CLI's loop check the serial port for data
-
155  if (!serial_cli_disable) {
-
156  CLI::loop();
-
157  }
-
158  // If there was not a packet received, we can end OOKwiz::loop() now.
-
159  if (!isr_out.train) {
-
160  return true;
-
161  }
-
162  // OK, so there's a new packet...
-
163  // Copy away the isr output and allow isr machinery to fill with new
-
164  loop_train = isr_out.train;
-
165  loop_raw = isr_out.raw;
-
166  isr_out.zap();
-
167  // Print to Serial what needs to be printed
-
168  if (Settings::isSet("print_raw") ||
-
169  Settings::isSet("print_visualizer") ||
-
170  Settings::isSet("print_summary") ||
-
171  Settings::isSet("print_pulsetrain") ||
-
172  Settings::isSet("print_binlist") ||
-
173  Settings::isSet("print_meaning")
-
174  ) {
-
175  INFO("\n\n");
-
176  }
-
177  if (Settings::isSet("print_raw") && loop_raw) {
-
178  INFO("%s\n", loop_raw.toString().c_str());
-
179  }
-
180  if (Settings::isSet("print_visualizer")) {
-
181  // If we simulate a Pulsetrain, the raw buffer will be empty still,
-
182  // so we visualize the Pulsetrain instead.
-
183  if (loop_raw) {
-
184  INFO("%s\n", loop_raw.visualizer().c_str());
-
185  } else {
-
186  INFO("%s\n", loop_train.visualizer().c_str());
-
187  }
-
188  }
-
189  if (Settings::isSet("print_summary")) {
-
190  INFO("%s\n", loop_train.summary().c_str());
-
191  }
-
192  if (Settings::isSet("print_pulsetrain")) {
-
193  INFO("%s\n", loop_train.toString().c_str());
-
194  }
-
195  if (Settings::isSet("print_binlist")) {
-
196  INFO("%s\n", loop_train.binList().c_str());
-
197  }
-
198  // Process the received pulsetrain for meaning
-
199  // (Done here so errors and debug output ends up in logical spot)
-
200  loop_meaning.fromPulsetrain(loop_train);
-
201  if (loop_meaning && Settings::isSet("print_meaning")) {
-
202  INFO("%s\n", loop_meaning.toString().c_str());
-
203  }
-
204  // Pass what was received to all the device plugins, making their output show up
-
205  // at the right spot underneath the meaning output.
-
206  Device::new_packet(loop_raw, loop_train, loop_meaning);
-
207  // received() can take it now.
-
208  if (callback != nullptr) {
-
209  callback(loop_raw, loop_train, loop_meaning);
-
210  }
-
211  return true;
-
212 }
-
213 
-
214 void IRAM_ATTR OOKwiz::ISR_transition() {
-
215  int64_t t = esp_timer_get_time() - last_transition;
-
216  if (rx_state == RX_WAIT_PREAMBLE) {
-
217  // Set the state machine to put the transitions in isr_in
-
218  if (t > first_pulse_min_len && digitalRead(Radio::pin_rx) != rx_active_high) {
-
219  noise_score = 0;
-
220  isr_in.zap();
-
221  isr_in.raw.intervals.reserve((max_nr_pulses * 2) + 1);
-
222  rx_state = RX_RECEIVING_DATA;
-
223  }
-
224  }
-
225  if (rx_state == RX_RECEIVING_DATA) {
-
226  // t < pulse_gap_min_len means it's noise
-
227  if (t < pulse_gap_min_len) {
-
228  noise_score += noise_penalty;
-
229  if (noise_score >= noise_threshold) {
-
230  process_raw();
-
231  return;
-
232  }
-
233  } else {
-
234  noise_score -= noise_score > 0;
-
235  }
-
236  isr_in.raw.intervals.push_back(t);
-
237  // Longer would be too long: stop and process what we have
-
238  if (isr_in.raw.intervals.size() == (max_nr_pulses * 2) + 1) {
-
239  process_raw();
-
240  }
-
241 
-
242  }
-
243  last_transition = esp_timer_get_time();
-
244  timerRestart(transitionTimer);
-
245 }
-
246 
-
247 void IRAM_ATTR OOKwiz::ISR_transitionTimeout() {
-
248  if (rx_state != RX_OFF) {
-
249  process_raw();
-
250  }
-
251 }
-
252 
-
253 void IRAM_ATTR OOKwiz::ISR_repeatTimeout() {
-
254  if (isr_compare.train && !isr_out.train) {
-
255  isr_out = isr_compare;
-
256  isr_compare.zap();
-
257  }
-
258 }
-
259 
-
260 void IRAM_ATTR OOKwiz::process_raw() {
-
261  // reject if not the required minimum number of pulses
-
262  if (isr_in.raw.intervals.size() < (min_nr_pulses * 2) + 1) {
-
263  rx_state = RX_WAIT_PREAMBLE;
-
264  return;
-
265  }
-
266  // Remove last transition if number is even because in that case the
-
267  // last transition is the off state, which is not part of a train.
-
268  if (isr_in.raw.intervals.size() % 2 == 0) {
-
269  isr_in.raw.intervals.pop_back();
-
270  }
-
271  if (!no_noise_fix) {
-
272  // fix noise: too-short transitions found are merged into one with transitions before and after.
-
273  bool noisy = true;
-
274  while (noisy) {
-
275  noisy = false;
-
276  for (int n = 1; n < isr_in.raw.intervals.size() - 1; n++) {
-
277  if (isr_in.raw.intervals[n] < pulse_gap_min_len) {
-
278  int new_interval = isr_in.raw.intervals[n - 1] + isr_in.raw.intervals[n] + isr_in.raw.intervals[n + 1];
-
279  isr_in.raw.intervals.erase(isr_in.raw.intervals.begin() + n - 1, isr_in.raw.intervals.begin() + n + 2);
-
280  isr_in.raw.intervals.insert(isr_in.raw.intervals.begin() + n - 1, new_interval);
-
281  noisy = true;
-
282  break;
-
283  }
-
284  }
-
285  }
-
286  // Simply cut off last pulse and preceding gap if pulse too short.
-
287  if (isr_in.raw.intervals.back() < pulse_gap_min_len) {
-
288  isr_in.raw.intervals.pop_back();
-
289  isr_in.raw.intervals.pop_back();
-
290  }
-
291  // Check we still meet the required minimum number of pulses after noise removal.
-
292  if (isr_in.raw.intervals.size() < (min_nr_pulses * 2) + 1) {
-
293  rx_state = RX_WAIT_PREAMBLE;
-
294  return;
-
295  }
-
296  }
-
297  // Release excess reserved memory
-
298  isr_in.raw.intervals.shrink_to_fit();
-
299  // And then go to normalizing, comparing, etc.
-
300  isr_in.train.fromRawTimings(isr_in.raw);
-
301  process_train();
-
302 }
-
303 
-
304 void IRAM_ATTR OOKwiz::process_train() {
-
305  rx_state = RX_PROCESSING;
-
306  // If there is no packet in the middle buffer, just put the new one there
-
307  if (!isr_compare.train) {
-
308  isr_compare = isr_in;
-
309  isr_in.zap();
-
310  // Start the timer on it expiring and being handed to the user
-
311  timerRestart(repeatTimer);
-
312  // Otherwise check if it's a duplicate
-
313  } else if (isr_in.train && isr_in.train.sameAs(isr_compare.train)) {
-
314  // If so just add to number of repeats
-
315  isr_compare.train.repeats++;
-
316  // Check if the observed gap is smaller than what we had and if so store.
-
317  int64_t gap = (esp_timer_get_time() - isr_compare.train.last_at) - isr_compare.train.duration;
-
318  if (gap < isr_compare.train.gap || isr_compare.train.gap == 0) {
-
319  isr_compare.train.gap = gap;
-
320  }
-
321  isr_compare.train.last_at = esp_timer_get_time();
-
322  isr_in.zap();
-
323  // Restart the repeat timer
-
324  timerRestart(repeatTimer);
-
325  } else {
-
326  // Only move waiting train to output if the previous one was taken.
-
327  if (!isr_out.train) {
-
328  isr_out = isr_compare;
-
329  }
-
330  isr_compare = isr_in;
-
331  isr_in.zap();
-
332  timerRestart(repeatTimer);
-
333  }
-
334  rx_state = RX_WAIT_PREAMBLE;
-
335 }
-
336 
-
337 /// @brief Use this to supply your own function that will be called every time a packet is received.
-
338 /**
-
339  * The callback_function parameter has to be the function name of a function that takes the three
-
340  * packet representations as arguments and does not return anything. Here's an example sketch:
-
341  *
-
342  * ```
-
343  * setup() {
-
344  * Serial.begin(115200);
-
345  * OOKwiz::setup();
-
346  * OOKwiz::onReceive(myReceiveFunction);
-
347  * }
-
348  *
-
349  * loop() {
-
350  * OOKwiz::loop();
-
351  * }
-
352  *
-
353  * void myReceiveFunction(RawTimings raw, Pulsetrain train, Meaning meaning) {
-
354  * Serial.println("A packet was received and myReceiveFunction was called.");
-
355  * }
-
356  * ```
-
357  *
-
358  * Make sure your own function is defined exactly as like this, even if you don't need all the
-
359  * parameters. You may change the names of the function and the parameters, but nothing else.
-
360 */
-
361 /// @param callback_function The name of your own function, without parenthesis () after it.
-
362 /// @return always returns `true`
-
363 bool OOKwiz::onReceive(void (*callback_function)(RawTimings, Pulsetrain, Meaning)) {
-
364  callback = callback_function;
-
365  return true;
-
366 }
-
367 
-
368 /// @brief Tell OOKwiz to start receiving and processing packets.
-
369 /**
-
370  * OOKwiz starts in receive mode normally, so you would only need to call this if your
-
371  * code has turned off reception (with `standby()`) or if you configured OOKwiz to not
-
372  * start in receive mode by setting `start_in_standby`.
-
373 */
-
374 /// @return `true` if receive mode could be activated, `false` if not.
-
375 bool OOKwiz::receive() {
-
376  if (!Radio::radio_rx()) {
-
377  return false;
-
378  }
-
379  // Turns on the state machine
-
380  rx_state = RX_WAIT_PREAMBLE;
-
381  return true;
-
382 }
-
383 
-
384 bool OOKwiz::tryToBeNice(int ms) {
-
385  // Try and wait for max ms for current reception to end
-
386  // return false if it doesn't end, true if it does
-
387  long start = millis();
-
388  while (millis() - start < 500) {
-
389  if (rx_state == RX_WAIT_PREAMBLE) {
-
390  return true;
-
391  }
-
392  }
-
393  return false;
-
394 }
-
395 
-
396 /// @brief Pretends this string representation of a `RawTimings`, `Pulsetrain` or `Meaning` instance was just received by the radio.
-
397 /// @param str The string representation of what needs to be simulated
-
398 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
399 bool OOKwiz::simulate(String &str) {
-
400  if (RawTimings::maybe(str)) {
-
401  RawTimings raw;
-
402  if (raw.fromString(str)) {
-
403  return simulate(raw);
-
404  }
-
405  } else if (Pulsetrain::maybe(str)) {
-
406  Pulsetrain train;
-
407  if (train.fromString(str)) {
-
408  return simulate(train);
-
409  }
-
410  } else if (Meaning::maybe(str)) {
-
411  Meaning meaning;
-
412  Pulsetrain train;
-
413  if (meaning.fromString(str)) {
-
414  return simulate(meaning);
-
415  }
-
416  } else {
-
417  ERROR("ERROR: string does not look like RawTimings, Pulsetrain or Meaning.\n");
-
418  }
-
419  return false;
-
420 }
-
421 
-
422 /// @brief Pretends this `RawTimings` instance was just received by the radio.
-
423 /// @param raw the instance to be simulated
-
424 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
425 bool OOKwiz::simulate(RawTimings &raw) {
-
426  tryToBeNice(500);
-
427  isr_in.raw = raw;
-
428  process_raw();
-
429  return true;
-
430 }
-
431 
-
432 /// @brief Pretends this `Pulsetrain` instance was just received by the radio.
-
433 /// @param train the instance to be simulated
-
434 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
435 bool OOKwiz::simulate(Pulsetrain &train) {
-
436  tryToBeNice(500);
-
437  isr_in.train = train;
-
438  isr_in.raw.zap();
-
439  process_train();
-
440  return true;
-
441 }
-
442 
-
443 /// @brief Pretends this `Meaning` instance was just received by the radio.
-
444 /// @param meaning the instance to be simulated
-
445 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
446 bool OOKwiz::simulate(Meaning &meaning) {
-
447  Pulsetrain train;
-
448  if (train.fromMeaning(meaning)) {
-
449  return simulate(train);
-
450  }
-
451  return false;
-
452 }
-
453 
-
454 /// @brief Transmits this string representation of a `RawTimings`, `Pulsetrain` or `Meaning` instance.
-
455 /// @param str The string representation of what needs to be simulated
-
456 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
457 bool OOKwiz::transmit(String &str) {
-
458  if (RawTimings::maybe(str)) {
-
459  RawTimings raw;
-
460  if (raw.fromString(str)) {
-
461  return transmit(raw);
-
462  }
-
463  } else if (Pulsetrain::maybe(str)) {
-
464  Pulsetrain train;
-
465  if (train.fromString(str)) {
-
466  return transmit(train);
-
467  }
-
468  } else if (Meaning::maybe(str)) {
-
469  Meaning meaning;
-
470  if (meaning.fromString(str)) {
-
471  return transmit(meaning);
-
472  }
-
473  } else {
-
474  ERROR("ERROR: string does not look like RawTimings, Pulsetrain or Meaning.\n");
-
475  }
-
476  return false;
-
477 }
-
478 
-
479 /// @brief Transmits this `RawTimings` instance.
-
480 /// @param raw the instance to be transmitted
-
481 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
482 bool OOKwiz::transmit(RawTimings &raw) {
-
483  bool rx_was_on = (rx_state != RX_OFF);
-
484  // Set receiver state machine off, remove any incomplete packet in buffer
-
485  if (rx_was_on) {
-
486  tryToBeNice(500);
-
487  rx_state = RX_OFF;
-
488  isr_in.zap();
-
489  }
-
490  if (!Radio::radio_tx()) {
-
491  ERROR("ERROR: Transceiver could not be set to transmit.\n");
-
492  return false;
-
493  }
-
494  INFO("Transmitting: %s\n", raw.toString().c_str());
-
495  INFO(" %s\n", raw.visualizer().c_str());
-
496  delay(100); // So INFO prints before we turn off interrupts
-
497  int64_t tx_timer = esp_timer_get_time();
-
498  noInterrupts();
-
499  {
-
500  bool bit = tx_active_high;
-
501  PIN_WRITE(Radio::pin_tx, bit);
-
502  for (uint16_t interval: raw.intervals) {
-
503  delayMicroseconds(interval);
-
504  bit = !bit;
-
505  PIN_WRITE(Radio::pin_tx, bit);
-
506  }
-
507  PIN_WRITE(Radio::pin_tx, !tx_active_high); // Just to make sure we end with TX off
-
508  }
-
509  interrupts();
-
510  tx_timer = esp_timer_get_time() - tx_timer;
-
511  INFO("Transmission done, took %i µs.\n", tx_timer);
-
512  delayMicroseconds(400);
-
513  // return to state it was in before transmit
-
514  if (rx_was_on) {
-
515  receive();
-
516  } else {
-
517  standby();
-
518  }
-
519  return true;
-
520 }
-
521 
-
522 /// @brief Transmits this `Pulsetrain` instance.
-
523 /// @param train the instance to be transmitted
-
524 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
525 bool OOKwiz::transmit(Pulsetrain &train) {
-
526  bool rx_was_on = (rx_state != RX_OFF);
-
527  // Set receiver state machine off, remove any incomplete packet in buffer
-
528  if (rx_was_on) {
-
529  tryToBeNice(500);
-
530  rx_state = RX_OFF;
-
531  isr_in.zap();
-
532  }
-
533  if (!Radio::radio_tx()) {
-
534  ERROR("ERROR: Transceiver could not be set to transmit.\n");
-
535  return false;
-
536  }
-
537  INFO("Transmitting %s\n", train.toString().c_str());
-
538  INFO(" %s\n", train.visualizer().c_str());
-
539  delay(100); // So INFO prints before we turn off interrupts
-
540  int64_t tx_timer = esp_timer_get_time();
-
541  for (int repeat = 0; repeat < train.repeats; repeat++) {
-
542  noInterrupts();
-
543  {
-
544  bool bit = tx_active_high;
-
545  PIN_WRITE(Radio::pin_tx, bit);
-
546  for (int transition : train.transitions) {
-
547  uint16_t t = train.bins[transition].average;
-
548  delayMicroseconds(t);
-
549  bit = !bit;
-
550  PIN_WRITE(Radio::pin_tx, bit);
-
551  }
-
552  PIN_WRITE(Radio::pin_tx, !tx_active_high); // Just to make sure we end with TX off
-
553  }
-
554  interrupts();
-
555  delayMicroseconds(train.gap);
-
556  }
-
557  tx_timer = esp_timer_get_time() - tx_timer;
-
558  INFO("Transmission done, took %i µs.\n", tx_timer);
-
559  delayMicroseconds(400);
-
560  // return to state it was in before transmit
-
561  if (rx_was_on) {
-
562  receive();
-
563  } else {
-
564  standby();
-
565  }
-
566  return true;
-
567 }
-
568 
-
569 /// @brief Transmits this `Meaning` instance.
-
570 /// @param meaning the instance to be transmitted
-
571 /// @return `true` if it worked, `false` if not. Will show error message telling you why it didn't work in latter case.
-
572 bool OOKwiz::transmit(Meaning &meaning) {
-
573  Pulsetrain train;
-
574  if (train.fromMeaning(meaning)) {
-
575  return transmit(train);
-
576  }
-
577  return false;
-
578 }
-
579 
-
580 /// @brief Sets radio standby mode, turning off reception
-
581 /// @return The counterpart to `receive()`, turns off reception.
-
582 bool OOKwiz::standby() {
-
583  if (rx_state != RX_OFF) {
-
584  tryToBeNice(500);
-
585  isr_in.zap();
-
586  rx_state = RX_OFF;
-
587  Radio::radio_standby();
-
588  }
-
589  return true;
-
590 }
-
- - - - diff --git a/doxygen/html/OOKwiz_8h_source.html b/doxygen/html/OOKwiz_8h_source.html deleted file mode 100644 index 05cef50..0000000 --- a/doxygen/html/OOKwiz_8h_source.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/OOKwiz.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
OOKwiz.h
-
-
-
1 #ifndef _OOKWIZ_H_
-
2 #define _OOKWIZ_H_
-
3 
-
4 #include <Arduino.h>
-
5 
-
6 #include "config.h"
-
7 #include "Radio.h"
-
8 #include "RawTimings.h"
-
9 #include "Pulsetrain.h"
-
10 #include "Meaning.h"
-
11 #include "Settings.h"
-
12 #include "Device.h"
-
13 #include "tools.h"
-
14 #include "serial_output.h"
-
15 
-
16 /**
-
17  * In the ISR handling of packets, we want to operate on three sets of RawTimings and Pulsetrain
-
18  * (isr_in, isr_compare and isr_out), hence this struct.
-
19 */
-
20 typedef struct BufferPair {
-
21  RawTimings raw;
-
22  Pulsetrain train;
-
23  void zap() {
-
24  raw.zap();
-
25  train.zap();
-
26  }
-
27 } BufferPair;
-
28 
-
29 /**
-
30  * \brief The static functions in the OOKwiz class provide the main controls for OOKwiz' functionality.
-
31  * Prefix them with `OOKwiz::` to use them from your own code.
-
32  *
-
33  * Example use of functions from the OOKwiz class
-
34  * ```cpp
-
35  * void setup() {
-
36  * OOKwiz::setup();
-
37  * }
-
38  *
-
39  * void loop() {
-
40  * OOKwiz::loop();
-
41  * }
-
42  * ```
-
43 */
-
44 class OOKwiz {
-
45 
-
46 public:
-
47  static bool setup(bool skip_saved_defaults = false);
-
48  static bool loop();
-
49  static bool receive();
-
50  static bool onReceive(void (*callback_function)(RawTimings, Pulsetrain, Meaning));
-
51  static bool standby();
-
52  static bool simulate(String &str);
-
53  static bool simulate(RawTimings &raw);
-
54  static bool simulate(Pulsetrain &train);
-
55  static bool simulate(Meaning &meaning);
-
56  static bool transmit(String &str);
-
57  static bool transmit(RawTimings &raw);
-
58  static bool transmit(Pulsetrain &train);
-
59  static bool transmit(Meaning &meaning);
-
60 
-
61 private:
-
62  static volatile enum Rx_State{
-
63  RX_OFF,
-
64  RX_WAIT_PREAMBLE,
-
65  RX_RECEIVING_DATA,
-
66  RX_PROCESSING
-
67  } rx_state;
-
68  static bool serial_cli_disable;
-
69  static int first_pulse_min_len;
-
70  static int pulse_gap_min_len;
-
71  static int pulse_gap_len_new_packet;
-
72  static int min_nr_pulses;
-
73  static int max_nr_pulses;
-
74  static int noise_penalty;
-
75  static int noise_threshold;
-
76  static int noise_score;
-
77  static bool no_noise_fix;
-
78  static int64_t last_transition;
-
79  static hw_timer_t *transitionTimer;
-
80  static hw_timer_t *repeatTimer;
-
81  static long repeat_timeout;
-
82  static bool rx_active_high;
-
83  static bool tx_active_high;
-
84  static BufferPair isr_in;
-
85  static BufferPair isr_compare;
-
86  static BufferPair isr_out;
-
87  static RawTimings loop_raw;
-
88  static Pulsetrain loop_train;
-
89  static Meaning loop_meaning;
-
90  static int64_t last_periodic;
-
91  static void (*callback)(RawTimings, Pulsetrain, Meaning);
-
92  static void IRAM_ATTR process_raw();
-
93  static void IRAM_ATTR process_train();
-
94  static void IRAM_ATTR ISR_transition();
-
95  static void IRAM_ATTR ISR_transitionTimeout();
-
96  static void IRAM_ATTR ISR_repeatTimeout();
-
97  static bool IRAM_ATTR sameAs(const Pulsetrain &train1, const Pulsetrain &train2);
-
98  static bool tryToBeNice(int ms);
-
99 
-
100 };
-
101 
-
102 #endif
-
- - - - diff --git a/doxygen/html/Pulsetrain_8cpp_source.html b/doxygen/html/Pulsetrain_8cpp_source.html deleted file mode 100644 index 13eb36a..0000000 --- a/doxygen/html/Pulsetrain_8cpp_source.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Pulsetrain.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Pulsetrain.cpp
-
-
-
1 #include <algorithm> // for std::sort
-
2 #include "Pulsetrain.h"
-
3 #include "RawTimings.h"
-
4 #include "Meaning.h"
-
5 #include "Settings.h"
-
6 #include "serial_output.h"
-
7 #include "tools.h"
-
8 
-
9 // Note that anything marked IRAM_ATTR is used by the ISRs in OOKwiz.cpp and
-
10 // SHALL NOT have Serial output
-
11 
-
12 /// @brief See if String might be a representation of Pulsetrain. No guarantees until you try to convert it, but silent.
-
13 /// @param str String that we are curious about
-
14 /// @return `true` if it might be a Pulsetrain String, `false` if not.
-
15 bool Pulsetrain::maybe(String str) {
-
16  if (str.length() < 10) {
-
17  return false;
-
18  }
-
19  for (int n = 0; n < 10; n++) {
-
20  if (!isDigit(str.charAt(n))) {
-
21  return false;
-
22  }
-
23  }
-
24  DEBUG("Pulsetrain::maybe() returns true.\n");
-
25  return true;
-
26 }
-
27 
-
28 /// @brief If you try to evaluate the instance as a bool (e.g. `if (myPulsetrain) ...`) this will be `true` if there's transitions stored.
-
29 IRAM_ATTR Pulsetrain::operator bool() {
-
30  return (transitions.size() > 0);
-
31 }
-
32 
-
33 /// @brief empty out all information about the stored pulses
-
34 void IRAM_ATTR Pulsetrain::zap() {
-
35  transitions.clear();
-
36  bins.clear();
-
37  gap = 0;
-
38  repeats = 0;
-
39  last_at = 0;
-
40 }
-
41 
-
42 /// @brief Compare to other Pulsetrains to see if same packet. Ignores minor timing differences. Used internally by ISR processing to see if packet is a repeat.
-
43 /// @param other_train Pulsetrain we're comparing this one to
-
44 /// @return `true` if same, `false` if not
-
45 bool IRAM_ATTR Pulsetrain::sameAs(const Pulsetrain &other_train) {
-
46  if (transitions.size() != other_train.transitions.size()) {
-
47  return false;
-
48  }
-
49  if (bins.size() != other_train.bins.size()) {
-
50  return false;
-
51  }
-
52  for (int n = 0; n < transitions.size(); n++) {
-
53  if (transitions[n] != other_train.transitions[n]) {
-
54  return false;
-
55  }
-
56  }
-
57  for (int m = 0; m < bins.size(); m++) {
-
58  if (abs(bins[m].average - abs(other_train.bins[m].average)) > 100) {
-
59  return false;
-
60  }
-
61  }
-
62  return true;
-
63 }
-
64 
-
65 /// @brief Get the String representation, which looks like `2010101100110101001101010010110011001100101100101,190,575,5906*6@132`
-
66 /// @return the String representation
-
67 String Pulsetrain::toString() const {
-
68  if (transitions.size() == 0) {
-
69  return "<empty Pulsetrain>";
-
70  }
-
71  String res = "";
-
72  for (int transition: transitions) {
-
73  res += transition;
-
74  }
-
75  for (auto bin : bins) {
-
76  res += ",";
-
77  res += bin.average;
-
78  }
-
79  if (repeats > 1) {
-
80  snprintf_append(res, 20, "*%i@%i", repeats, gap);
-
81  }
-
82  return res;
-
83 }
-
84 
-
85 /// @brief Read a String representation like above, and store in this instance
-
86 /// @return `true` if it worked, `false` (with error message) if it didn't.
-
87 bool Pulsetrain::fromString(String in) {
-
88  zap();
-
89  int first_comma = in.indexOf(",");
-
90  if (first_comma == -1) {
-
91  ERROR("ERROR: cannot convert String to Pulsetrain, no commas present.\n");
-
92  return false;
-
93  }
-
94  // fill transitions and deduce number of bins
-
95  int num_bins = 0;
-
96  for (int n = 0; n < first_comma; n++) {
-
97  int digit = in.charAt(n);
-
98  if (!isDigit(digit)) {
-
99  zap();
-
100  ERROR("ERROR: cannot convert String to Pulsetrain, non-digits in wrong place.\n");
-
101  return false;
-
102  }
-
103  digit -= 48; // "0" is 48 in ASCII
-
104  transitions.push_back(digit);
-
105  if (digit > num_bins) {
-
106  num_bins = digit;
-
107  }
-
108  }
-
109  num_bins++;
-
110  int end_binlist = in.indexOf("*");
-
111  if (end_binlist == -1) {
-
112  end_binlist = in.length();
-
113  repeats = 1;
-
114  } else {
-
115  int at_sign = in.indexOf("@");
-
116  if (at_sign == -1) {
-
117  zap();
-
118  ERROR("ERROR: cannot convert String to Pulsetrain, * but no @ found.\n");
-
119  return false;
-
120  }
-
121  repeats = in.substring(end_binlist + 1, at_sign).toInt();
-
122  gap = in.substring(at_sign + 1).toInt();
-
123  if (gap == 0 || repeats == 0) {
-
124  zap();
-
125  ERROR("ERROR: cannot convert String to Pulsetrain, invalid values for repeats or gap.\n");
-
126  return false;
-
127  }
-
128  }
-
129  int bin_start = first_comma + 1;
-
130  for (int n = 0; n < num_bins; n++) {
-
131  pulseBin new_bin;
-
132  int next_comma = in.indexOf(",", bin_start);
-
133  if (next_comma == -1) {
-
134  next_comma = in.length();
-
135  }
-
136  new_bin.average = in.substring(bin_start, next_comma).toInt();
-
137  new_bin.min = new_bin.average;
-
138  new_bin.max = new_bin.average;
-
139  if (new_bin.average == 0) {
-
140  zap();
-
141  ERROR("ERROR: cannot convert String to Pulsetrain, invalid bin value found.\n");
-
142  return false;
-
143  }
-
144  bin_start = next_comma + 1;
-
145  bins.push_back(new_bin);
-
146  }
-
147  for (int transition : transitions) {
-
148  bins[transition].count++;
-
149  duration += bins[transition].average;
-
150  }
-
151  return true;
-
152 }
-
153 
-
154 /// @brief Summary String a la `25 pulses over 24287 µs, repeated 6 times with gaps of 132 µs`
-
155 /// @return the String in question
-
156 String Pulsetrain::summary() const {
-
157  String res = "";
-
158  snprintf_append(res, 80, "%i pulses over %i µs", (transitions.size() + 1) / 2, duration);
-
159  if (repeats > 1) {
-
160  snprintf_append(res, 80, ", repeated %i times with gaps of %i µs", repeats, gap);
-
161  }
-
162  return res;
-
163 }
-
164 
-
165 /// @brief Convert RawTimings to Pulsetrain
-
166 /// @param raw the RawTimings instance to convert from
-
167 /// @return Always `true`
-
168 bool IRAM_ATTR Pulsetrain::fromRawTimings(const RawTimings &raw) {
-
169  int bin_width;
-
170  SETTING_WITH_DEFAULT(bin_width, 150);
-
171  std::vector<uint16_t> sorted = raw.intervals;
-
172  // Create the bins
-
173  std::sort(sorted.begin(), sorted.end());
-
174  bool just_begun = true;
-
175  for (auto interval : sorted) {
-
176  if (just_begun || interval > bins.back().min + bin_width) {
-
177  just_begun = false;
-
178  pulseBin new_bin;
-
179  new_bin.min = interval;
-
180  bins.push_back(new_bin);
-
181  }
-
182  bins.back().max = interval;
-
183  }
-
184  // Walk intervals, add bin number to transitions, update count in its bin, find total duration
-
185  duration = 0;
-
186  for (auto interval : raw.intervals) {
-
187  duration += interval;
-
188  for (int m = 0; m < bins.size(); m++) {
-
189  if (interval >= bins[m].min && interval <= bins[m].max) {
-
190  transitions.push_back(m);
-
191  bins[m].average += interval; // use average for total first, which is why .average is a long
-
192  bins[m].count++;
-
193  break;
-
194  }
-
195  }
-
196  }
-
197  // Averages
-
198  for (auto& bin : bins) {
-
199  if (bin.count > 0) {
-
200  bin.average = bin.average / bin.count;
-
201  }
-
202  }
-
203  // Set other metadata about this Pulsetrain
-
204  first_at = esp_timer_get_time();
-
205  last_at = esp_timer_get_time();
-
206  repeats = 1;
-
207  return true;
-
208 }
-
209 
-
210 /// @brief Get information about the bins in this Pulsetrain, such as lowest, average and highest interval as well as number of pulses in each bin.
-
211 /// @return multi-line String with bin information, 5 columns with header
-
212 String Pulsetrain::binList() {
-
213  String res = "";
-
214  snprintf_append(res, 50, " bin min avg max count");
-
215  for (int m = 0; m < bins.size(); m++) {
-
216  snprintf_append(res, 50, "\n%4i %7i %7i %7i %6i", m, bins[m].min, bins[m].average, bins[m].max, bins[m].count);
-
217  }
-
218  return res;
-
219 }
-
220 
-
221 /// @brief Returns the viasualizer (the blocky time-graph) for the pulses in this Pulsetrain instance
-
222 /// @param base µs per (half-character) block. Every interval gets at least one block so all pulses are guaranteed visible
-
223 /// @return visualizer String
-
224 String Pulsetrain::visualizer() {
-
225  int visualizer_pixel;
-
226  SETTING_WITH_DEFAULT(visualizer_pixel, 200);
-
227  return visualizer(visualizer_pixel);
-
228 }
-
229 
-
230 /// @brief The visualizer like above, with base taken from `visualizer_pixel` setting.
-
231 /// @return visualizer String
-
232 String Pulsetrain::visualizer(int base) {
-
233  if (base == 0) {
-
234  return "";
-
235  }
-
236  uint8_t multiples[bins.size()];
-
237  for (int m = 0; m < bins.size(); m++) {
-
238  multiples[m] = max(((int)bins[m].average + (base / 2)) / base, 1);
-
239  }
-
240  String ones_and_zeroes;
-
241  String curstate;
-
242  for (int n = 0; n < transitions.size(); n++) {
-
243  curstate = (n % 2 == 0) ? "1" : "0";
-
244  for (int m = 0; m < multiples[transitions[n]]; m++) {
-
245  ones_and_zeroes += curstate;
-
246  }
-
247  }
-
248  ones_and_zeroes += "0";
-
249  String output;
-
250  for (int n = 0; n < ones_and_zeroes.length(); n += 2) {
-
251  String chunk = ones_and_zeroes.substring(n, n + 2);
-
252  if (chunk == "11") {
-
253  output += "▀";
-
254  } else if (chunk == "00") {
-
255  output += " ";
-
256  } else if (chunk == "01") {
-
257  output += "▝";
-
258  } else if (chunk == "10") {
-
259  output += "▘";
-
260  }
-
261  }
-
262  return output;
-
263 }
-
264 
-
265 bool Pulsetrain::fromMeaning(const Meaning &meaning) {
-
266  zap();
-
267  // First make bins for all the different timings found
-
268  for (const auto& el : meaning.elements) {
-
269  if (el.type == PULSE || el.type == GAP) {
-
270  addToBins(el.time1);
-
271  }
-
272  if (el.type == PWM) {
-
273  addToBins(el.time1);
-
274  addToBins(el.time2);
-
275  }
-
276  if (el.type == PPM) {
-
277  addToBins(el.time1);
-
278  addToBins(el.time2);
-
279  addToBins(el.time3);
-
280  }
-
281  }
-
282  // sort bins by average interval
-
283  std::sort(bins.begin(), bins.end(), [](pulseBin a, pulseBin b) {
-
284  return a.average < b.average;
-
285  });
-
286  // Now traverse the elements again, filling in the transitions
-
287  for (int n = 0; n < meaning.elements.size(); n++) {
-
288  MeaningElement el = meaning.elements[n];
-
289  if (el.type == PULSE) {
-
290  // If we're about to write a low-state time, we need to fill the space before
-
291  if (transitions.size() % 2) {
-
292  // Which we use the prevous datablock's timing for, if applicable
-
293  if (n > 0 && meaning.elements[n - 1].type == PPM) {
-
294  transitions.push_back(binFromTime(meaning.elements[n - 1].time3));
-
295  } else if (n > 0 && meaning.elements[n - 1].type == PWM) {
-
296  transitions.push_back(binFromTime(meaning.elements[n - 1].time1));
-
297  } else {
-
298  zap();
-
299  ERROR("ERROR: cannot have a pulse where a gap is expected at element %i.\n", n);
-
300  return false;
-
301  }
-
302  }
-
303  transitions.push_back(binFromTime(el.time1));
-
304  }
-
305  if (el.type == GAP) {
-
306  if (transitions.size() % 2 == 0) {
-
307  zap();
-
308  ERROR("ERROR: cannot have a gap where a pulse is expected at element %i.\n", n);
-
309  return false;
-
310  }
-
311  transitions.push_back(binFromTime(el.time1));
-
312  }
-
313  if (el.type == PWM || el.type == PPM) {
-
314  // Create a copy of el's data in tmp_data
-
315  int data_bytes = (el.data_len + 7) / 8;
-
316  uint8_t tmp_data[data_bytes];
-
317  for (int m = 0; m < data_bytes; m++) {
-
318  tmp_data[m] = el.data[m];
-
319  }
-
320  // Shift left until the first bit that went in is
-
321  // aligned in the MSB of the first byte.
-
322  int shift_left_by = (8 - (el.data_len % 8)) % 8;
-
323  for (int j = 0; j < shift_left_by; j++) {
-
324  tools::shiftOutBit(tmp_data, el.data_len);
-
325  }
-
326  if (el.type == PWM) {
-
327  for (int m = 0; m < el.data_len; m++) {
-
328  if (tools::shiftOutBit(tmp_data, el.data_len)) {
-
329  transitions.push_back(binFromTime(el.time2));
-
330  transitions.push_back(binFromTime(el.time1));
-
331  } else {
-
332  transitions.push_back(binFromTime(el.time1));
-
333  transitions.push_back(binFromTime(el.time2));
-
334  }
-
335  }
-
336  }
-
337  if (el.type == PPM) {
-
338  if (transitions.size() % 2) {
-
339  transitions.push_back(binFromTime(el.time3));
-
340  }
-
341  for (int m = 0; m < el.data_len; m++) {
-
342  if (tools::shiftOutBit(tmp_data, el.data_len)) {
-
343  transitions.push_back(binFromTime(el.time2));
-
344  transitions.push_back(binFromTime(el.time3));
-
345  } else {
-
346  transitions.push_back(binFromTime(el.time1));
-
347  transitions.push_back(binFromTime(el.time3));
-
348  }
-
349  }
-
350  transitions.pop_back(); // retract last filler, as this may be the end
-
351  }
-
352  }
-
353  }
-
354  // Now update bin counts, duration, repeats, gap.
-
355  for (int transition : transitions) {
-
356  bins[transition].count++;
-
357  duration += bins[transition].average;
-
358  }
-
359  repeats = meaning.repeats;
-
360  gap = meaning.gap;
-
361  return true;
-
362 }
-
363 
-
364 void Pulsetrain::addToBins(int time) {
-
365  for (auto bin : bins) {
-
366  if (bin.average == time || bins.size() == MAX_BINS) {
-
367  return;
-
368  }
-
369  }
-
370  pulseBin new_bin;
-
371  new_bin.min = time;
-
372  new_bin.max = time;
-
373  new_bin.average = time;
-
374  bins.push_back(new_bin);
-
375  return;
-
376 }
-
377 
-
378 int Pulsetrain::binFromTime(int time) {
-
379  for (int m = 0; m < bins.size(); m++) {
-
380  if (bins[m].average == time) {
-
381  return m;
-
382  }
-
383  }
-
384  return -1;
-
385 }
-
- - - - diff --git a/doxygen/html/Pulsetrain_8h_source.html b/doxygen/html/Pulsetrain_8h_source.html deleted file mode 100644 index 6f59a74..0000000 --- a/doxygen/html/Pulsetrain_8h_source.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Pulsetrain.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Pulsetrain.h
-
-
-
1 #ifndef _PULSETRAIN_H_
-
2 #define _PULSETRAIN_H_
-
3 
-
4 #include <Arduino.h>
-
5 #include <vector>
-
6 #include "config.h"
-
7 
-
8 class RawTimings;
-
9 class Meaning;
-
10 
-
11 /// @brief Struct that holds information about a 'bin' in a Pulsetrain, a range of timings that are lumped together when converting RawTimings to a Pulsetrain.
-
12 typedef struct pulseBin {
-
13  /// @brief shortest time in bin in µs
-
14  uint16_t min = 65535;
-
15  /// @brief longest time in bin in µs
- -
17  /// @brief average time in bin in µs
-
18  long average = 0; // long bc used to store total time before averaging
-
19  /// @brief Number of intervals in this bin in Pulsetrain
- -
21 } pulseBin;
-
22 
-
23 /// @brief Instances of Pulsetrain represent packets in a normalized way, meaning all intervals of similar length are made equal.
-
24 class Pulsetrain {
-
25 public:
-
26  static bool maybe(String str);
-
27 
-
28  /// @brief std::vector with the bins, each a PulseBin struct
- -
30  /// @brief std::vector with the transitions, each merely the pulsebin that transition is in
- -
32  /// @brief Total duration of this Pulsetrain in µs
- -
34  /// @brief First seen at this time, in system microseconds
- -
36  /// @brief Last seen at this time, in system microseconds
- -
38  /// @brief Number of repetitions detected before either another packet came or `repeat_timeout` µs elapsed
- -
40  /// @brief Smallest gap between repeated transmissions
- -
42 
-
43  IRAM_ATTR operator bool();
-
44  void IRAM_ATTR zap();
- - -
47  bool fromMeaning(const Meaning &meaning);
-
48  String summary() const;
-
49  bool fromString(String in);
-
50  String toString() const;
-
51  String binList();
- -
53  String visualizer(int base);
-
54 
-
55 private:
-
56  void addToBins(int time);
-
57  int binFromTime(int time);
-
58 };
-
59 
-
60 #endif
-
- - - - diff --git a/doxygen/html/Radio_8cpp_source.html b/doxygen/html/Radio_8cpp_source.html deleted file mode 100644 index a5a1302..0000000 --- a/doxygen/html/Radio_8cpp_source.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Radio.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Radio.cpp
-
-
-
1 #include "Radio.h"
-
2 #include "serial_output.h"
-
3 #include "tools.h"
-
4 #include "radio_plugins/RADIO_INDEX"
-
5 
-
6 
-
7 // static members
-
8 decltype(Radio::store) Radio::store;
-
9 int Radio::len = 0;
-
10 Radio* Radio::current = nullptr;
-
11 int Radio::pin_rx;
-
12 int Radio::pin_tx;
-
13 
-
14 // Uses char*, and does not DEBUG or INFO because this is ran pre-main by the
-
15 // constructor of the AutoRegister trick: String and Serial are not available yet.
-
16 bool Radio::add(const char* name, Radio *pointer) {
-
17  if (len == MAX_RADIOS) {
-
18  return false;
-
19  }
-
20  strncpy(store[len].name, name, MAX_RADIO_NAME_LEN);
-
21  store[len].name[MAX_RADIO_NAME_LEN] = 0; // just in case
-
22  store[len].pointer = pointer;
-
23  len++;
-
24  return true;
-
25 }
-
26 
-
27 bool Radio::setup() {
-
28  MANDATORY(radio);
-
29  INFO("Radio plugins loaded: %s\n", list().c_str());
-
30  if (select(Settings::getString("radio"))) {
-
31  return radio_init();
-
32  }
-
33  return false;
-
34 }
-
35 
-
36 bool Radio::select(const String &name) {
-
37  for (int n = 0; n < len; n++) {
-
38  if (strcmp(store[n].name, name.c_str()) == 0) {
-
39  current = store[n].pointer;
-
40  INFO("Radio %s selected.\n", name);
-
41  return true;
-
42  }
-
43  }
-
44  ERROR("No such radio: '%s'.\n", name.c_str());
-
45  return false;
-
46 }
-
47 
-
48 String Radio::list(String separator) {
-
49  String ret;
-
50  for (int n = 0; n < len; n++) {
-
51  ret += store[n].name;
-
52  if (n < len - 1) {
-
53  ret += separator;
-
54  }
-
55  }
-
56  return ret;
-
57 }
-
58 
-
59 String Radio::name() {
-
60  for (int n = 0; n < len; n++) {
-
61  if (store[n].pointer == this) {
-
62  return String(store[n].name);
-
63  }
-
64  }
-
65 }
-
66 
-
67 bool Radio::radio_init() {
- -
69  INFO("Initializing radio.\n");
-
70  pin_rx = Settings::getInt("pin_rx");
-
71  pin_tx = Settings::getInt("pin_tx");
-
72  return current->init();
-
73 }
-
74 
-
75 bool Radio::radio_rx() {
- -
77  DEBUG("Configuring radio for receiving.\n");
-
78  if (pin_rx < 0) {
-
79  ERROR("ERROR: pin_rx needs to be set receive.\n");
-
80  return false;
-
81  }
-
82  PIN_MODE(pin_rx, INPUT);
-
83  return current->rx();
-
84 }
-
85 
-
86 bool Radio::radio_tx() {
- -
88  DEBUG("Configuring radio for transmission.\n");
-
89  if (pin_tx < 0) {
-
90  ERROR("ERROR: pin_tx needs to be set for transmit.\n");
-
91  return false;
-
92  }
-
93  PIN_MODE(pin_tx, OUTPUT);
-
94  PIN_WRITE(pin_tx, !Settings::isSet("tx_active_high"));
-
95  return current->tx();
-
96 }
-
97 
-
98 bool Radio::radio_standby() {
- -
100  DEBUG("Radio entering standby mode.\n");
-
101  return current->standby();
-
102 }
-
103 
-
104 bool Radio::init() {
-
105  return false;
-
106 }
-
107 
-
108 bool Radio::rx() {
-
109  return false;
-
110 }
-
111 
-
112 bool Radio::tx() {
-
113  return false;
-
114 }
-
115 
-
116 bool Radio::standby() {
-
117  return false;
-
118 }
-
119 
-
120 // RadioLib-specific
-
121 
-
122 void Radio::radiolibInit() {
-
123  int pin_sck;
-
124  SETTING_WITH_DEFAULT(pin_sck, -1);
-
125  int pin_miso;
-
126  SETTING_WITH_DEFAULT(pin_miso, -1);
-
127  int pin_mosi;
-
128  SETTING_WITH_DEFAULT(pin_mosi, -1);
-
129  int pin_reset;
-
130  SETTING_WITH_DEFAULT(pin_reset, -1);
-
131  String spi_port;
-
132  SETTING_WITH_DEFAULT(spi_port, "HSPI");
-
133  int spi_port_int = -1;
-
134  if (spi_port == "HSPI") {
-
135  spi_port_int = HSPI;
-
136  } else if (spi_port == "FSPI") {
-
137  spi_port_int = FSPI;
-
138  }
-
139  #ifdef VSPI
-
140  else if (spi_port == "VSPI") {
-
141  spi_port_int = VSPI;
-
142  }
-
143  #endif
-
144  else {
-
145  ERROR("SPI port '%s' unknown, trying default SPI.\n", spi_port.c_str());
-
146  }
-
147  if (spi_port_int != -1 && pin_miso != -1 && pin_mosi != -1 && pin_sck != -1) {
-
148  INFO("Radio %s: SPI port %s, SCK %i, MISO %i, MOSI %i, CS %i, RESET %i, RX %i, TX %i\n", name().c_str(), spi_port.c_str(), pin_sck, pin_miso, pin_mosi, pin_cs, pin_reset, pin_rx, pin_tx);
-
149  spi = new SPIClass(spi_port_int);
-
150  spi->begin(pin_sck, pin_miso, pin_mosi, pin_cs);
-
151  radioLibModule = new Module(pin_cs, -1, pin_reset, -1, *spi);
-
152  } else {
-
153  INFO("Radio %s: default SPI, SCK %i, MISO %i, MOSI %i, CS %i, RESET %i, RX %i, TX %i\n", name().c_str(), SCK, MISO, MOSI, pin_cs, pin_reset, pin_rx, pin_tx);
-
154  radioLibModule = new Module(pin_cs, -1, pin_reset, -1);
-
155  }
-
156  INFO("%s: Frequency: %.2f Mhz, bandwidth %.1f kHz, bitrate %.3f kbps\n", name().c_str(), frequency, bandwidth, bitrate);
-
157 }
-
158 
-
159 void Radio::showRadiolibResult(const int result, const char* action) {
-
160  switch (result) {
-
161  case 0:
-
162  DEBUG("%s: %s returned 0 (OK)\n", name().c_str(), action);
-
163  break;
-
164  case -2:
-
165  ERROR("%s ERROR: %s returned -2 (CHIP NOT FOUND)\n", name().c_str(), action);
-
166  break;
-
167  default:
-
168  ERROR("%s ERROR: %s returned %i\n%s\n", name().c_str(), action, result,
-
169  "(See https://github.com/jgromes/RadioLib/blob/master/src/TypeDef.h for Meaning of RadioLib error codes.)");
-
170  break;
-
171  }
-
172 }
-
173 
-
174 int Radio::thresholdSetup(const int fixed, const int average, const int peak) {
-
175  String threshold_type;
-
176  SETTING_WITH_DEFAULT(threshold_type, "peak");
-
177  SETTING_WITH_DEFAULT(threshold_level, 6);
-
178  INFO("%s: Threshold type %s, level %i\n", name().c_str(), threshold_type.c_str(), threshold_level);
-
179  if (threshold_type == "fixed") {
-
180  return fixed;
-
181  } else if (threshold_type == "average") {
-
182  return average;
-
183  } else {
-
184  return peak;
-
185  }
-
186 }
-
- - - - diff --git a/doxygen/html/Radio_8h_source.html b/doxygen/html/Radio_8h_source.html deleted file mode 100644 index 68ae481..0000000 --- a/doxygen/html/Radio_8h_source.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Radio.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Radio.h
-
-
-
1 #ifndef _RADIO_H_
-
2 #define _RADIO_H_
-
3 
-
4 #include <Arduino.h>
-
5 #include <RadioLib.h>
-
6 #include <SPI.h>
-
7 #include "config.h"
-
8 #include "tools.h"
-
9 
-
10 #define RADIO_PLUGIN_START
-
11  namespace ook {
-
12  namespace CONCAT(radio_, PLUGIN_NAME) {
-
13  class RadioPlugin : public Radio {
-
14  public:
-
15 
-
16 #define RADIO_PLUGIN_END
-
17  };
-
18  struct AutoRegister {
-
19  AutoRegister() {
-
20  static RadioPlugin radioPlugin;
-
21  Radio::add(QUOTE(PLUGIN_NAME), static_cast<Radio*>(&radioPlugin));
-
22  }
-
23  } autoRegister;
-
24  }
-
25  }
-
26 
-
27 #define CHECK_RADIO_SET
-
28  if (current == nullptr) {
-
29  ERROR("ERROR: No radio selected.\n");
-
30  return false;
-
31  }
-
32 
-
33 #define PIN_MODE(x, y) if (x != -1) pinMode(x, y);
-
34 #define PIN_WRITE(x, y) if (x != -1) digitalWrite(x, y);
-
35 #define PIN_INPUT(x) if (x != -1) pinMode(x, INPUT)
-
36 #define PIN_OUTPUT(x) if (x != -1) pinMode(x, OUTPUT)
-
37 #define PIN_HIGH(x) if (x != -1) { pinMode(x, OUTPUT); digitalWrite(x, HIGH); }
-
38 #define PIN_LOW(x) if (x != -1) { pinMode(x, OUTPUT); digitalWrite(x, LOW); }
-
39 
-
40 
-
41 #define RADIO_DO(action) {
-
42  int res = radio->action;
-
43  showRadiolibResult(res, #action);
-
44  if (res != 0) return false;
-
45  }
-
46 
-
47 #define MODULE_DO(action) {
-
48  int res = radioLibModule->action;
-
49  showRadiolibResult(res, #action);
-
50  if (res != 0) return false;
-
51  }
-
52 
-
53 
-
54 // Device::store cannot become an std::vector because of the auto-register trick.
-
55 
-
56 class Radio {
-
57 public:
-
58  static struct {
-
59  Radio* pointer;
-
60  char name[MAX_RADIO_NAME_LEN];
-
61  } store[MAX_RADIOS];
-
62  static Radio* current;
-
63  static int len;
-
64  static int pin_rx;
-
65  static int pin_tx;
-
66  static bool add(const char* name, Radio *pointer);
-
67  static bool setup();
-
68  static bool select(const String &name);
-
69  static String list(String separator = ", ");
-
70  static bool radio_init();
-
71  static bool radio_rx();
-
72  static bool radio_tx();
-
73  static bool radio_standby();
-
74  String name();
-
75  virtual bool init();
-
76  virtual bool rx();
-
77  virtual bool tx();
-
78  virtual bool standby();
-
79 
-
80  // radiolib-specific
-
81  Module* radioLibModule;
-
82  SPIClass* spi;
-
83  int pin_cs;
-
84  float frequency;
-
85  float bandwidth;
-
86  float bitrate;
-
87  int threshold_type_fixed;
-
88  int threshold_type_peak;
-
89  int threshold_type_average;
-
90  int threshold_type_int;
-
91  int threshold_level;
-
92  void radiolibInit();
-
93  void showRadiolibResult(const int result, const char* action);
-
94  int thresholdSetup(const int fixed, const int average, const int peak);
-
95 };
-
96 
-
97 #endif
-
- - - - diff --git a/doxygen/html/RawTimings_8cpp_source.html b/doxygen/html/RawTimings_8cpp_source.html deleted file mode 100644 index 3dd47b4..0000000 --- a/doxygen/html/RawTimings_8cpp_source.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/RawTimings.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
RawTimings.cpp
-
-
-
1 #include "RawTimings.h"
-
2 #include "Pulsetrain.h"
-
3 #include "serial_output.h"
-
4 #include "Settings.h"
-
5 
-
6 
-
7 /// @brief Static method to see if String might be a representation of RawTimings. No guarantees until you try to convert it, but silent.
-
8 /// @param str String that we are curious about
-
9 /// @return `true` if it might be a RawTimings String, `false` if not.
-
10 /**
-
11  * Static, so not called on any particular RawTimings instance but instead like:
-
12  * ```cpp
-
13  * if (RawTimings::maybe(someString)) {
-
14  * ....
-
15  * }
-
16  * ```
-
17 */
-
18 
-
19 bool RawTimings::maybe(String str) {
-
20  int comma = 0;
-
21  for (int n = 0; n < str.length(); n++) {
-
22  if (!isDigit(str.charAt(n)) && str.charAt(n) != ',') {
-
23  return false;
-
24  }
-
25  if (str.charAt(n) == ',') {
-
26  comma++;
-
27  }
-
28  }
-
29  if (comma > 15) {
-
30  DEBUG("RawTimings::maybe() returns true.\n");
-
31  return true;
-
32  }
-
33  return false;
-
34 }
-
35 
-
36 /// @brief If you try to evaluate the instance as a bool, for instance in `if (myRawTimings) ...`, it will be `true` if there's intervals stored.
- -
38  return (intervals.size() > 0);
-
39 }
-
40 
-
41 /// @brief empty out the stored intervals
-
42 void RawTimings::zap() {
-
43  intervals.clear();
-
44 }
-
45 
-
46 /// @brief Get the String representation, which is a comma-separated list of intervals
-
47 /// @return the String representation
- -
49  String res = "";
-
50  for (int count = 0; count < intervals.size(); count++) {
-
51  res += intervals[count];
-
52  if (count != intervals.size() - 1) {
-
53  res += ",";
-
54  }
-
55  }
-
56  return res;
-
57 }
-
58 
-
59 /// @brief Read a String representation, which is a comma-separated list of intervals, and store in this instance
-
60 /// @return `true` if it worked, `false` (with error message) if it didn't.
-
61 bool RawTimings::fromString(const String &in) {
-
62  bool error = false;
-
63  intervals.clear();
-
64  int pos = 0;
-
65  int nextSemicolon = in.indexOf(",", pos);
-
66  do {
-
67  int value = in.substring(pos, nextSemicolon).toInt();
-
68  if (value == 0) {
-
69  error = true;
-
70  break;
-
71  }
-
72  intervals.push_back(value);
-
73  pos = nextSemicolon + 1;
-
74  nextSemicolon = in.indexOf(",", pos);
-
75  } while (nextSemicolon != -1);
-
76  int value = in.substring(pos).toInt();
-
77  if (value == 0 || error) {
-
78  ERROR("Conversion to RawTimings failed at position %i in String '%s'\n", pos, in.c_str());
-
79  return false;
-
80  }
-
81  intervals.push_back(value);
-
82  return true;
-
83 }
-
84 
-
85 /// @brief Convert Pulsetrain into RawTimings. Loses stats about bins as well as information about repeats.
-
86 /// @param train the Puksetrain you want to convert from
-
87 /// @return Always `true`
- -
89  for (int transition : train.transitions) {
-
90  intervals.push_back(train.bins[transition].average);
-
91  }
-
92  return true;
-
93 }
-
94 
-
95 /// @brief Returns the viasualizer (the blocky time-graph) for the pulses in this RawTimings instance
-
96 /// @param base µs per (half-character) block. Every interval gets at least one block so all pulses are guaranteed visible
-
97 /// @return visualizer String
- -
99  if (base == 0) {
-
100  return "";
-
101  }
-
102  String ones_and_zeroes;
-
103  String curstate;
-
104  for (int n = 0; n < intervals.size(); n++) {
-
105  curstate = (n % 2 == 0) ? "1" : "0";
-
106  for (int m = 0; m < max((intervals[n] + (base / 2)) / base, 1); m++) {
-
107  ones_and_zeroes += curstate;
-
108  }
-
109  }
-
110  ones_and_zeroes += "0";
-
111  String output;
-
112  for (int n = 0; n < ones_and_zeroes.length(); n += 2) {
-
113  String chunk = ones_and_zeroes.substring(n, n + 2);
-
114  if (chunk == "11") {
-
115  output += "▀";
-
116  } else if (chunk == "00") {
-
117  output += " ";
-
118  } else if (chunk == "01") {
-
119  output += "▝";
-
120  } else if (chunk == "10") {
-
121  output += "▘";
-
122  }
-
123  }
-
124  return output;
-
125 }
-
126 
-
127 /// @brief The visualizer like above, with base taken from `visualizer_pixel` setting.
-
128 /// @return visualizer String
- -
130  int visualizer_pixel;
-
131  SETTING_WITH_DEFAULT(visualizer_pixel, 200);
-
132  return visualizer(visualizer_pixel);
-
133 }
-
- - - - diff --git a/doxygen/html/RawTimings_8h_source.html b/doxygen/html/RawTimings_8h_source.html deleted file mode 100644 index 87b1f0d..0000000 --- a/doxygen/html/RawTimings_8h_source.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/RawTimings.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
RawTimings.h
-
-
-
1 #ifndef _RAWTIMINGS_H_
-
2 #define _RAWTIMINGS_H_
-
3 
-
4 #include <Arduino.h>
-
5 #include <vector>
-
6 #include "config.h"
-
7 
-
8 class Pulsetrain;
-
9 
-
10 /// @brief RawTimings instances store the time in µs of each interval
-
11 class RawTimings {
-
12 public:
-
13  static bool maybe(String str);
-
14 
-
15  /// @brief std::vector of uint16_t times in µs for each interval
- -
17 
-
18  operator bool();
-
19  void zap();
-
20  String toString();
-
21  bool fromString(const String &in);
-
22  bool fromPulsetrain(Pulsetrain &train);
- -
24  String visualizer(int base);
-
25 };
-
26 
-
27 #endif
-
- - - - diff --git a/doxygen/html/Settings_8cpp_source.html b/doxygen/html/Settings_8cpp_source.html deleted file mode 100644 index 75abc7e..0000000 --- a/doxygen/html/Settings_8cpp_source.html +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Settings.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Settings.cpp
-
-
-
1 #include "Settings.h"
-
2 #include "config.h" // provides factorySettings()
-
3 #include "serial_output.h"
-
4 #include "FS.h"
-
5 #include "SPIFFS.h"
-
6 #include "tools.h"
-
7 
-
8 std::map<String, String> Settings::store;
-
9 
-
10 // Constructor sets the defaults, see 'dummy' at end
-
11 Settings::Settings() {
-
12  factorySettings();
-
13 }
-
14 
-
15 /// @brief Save settings to file in SPIFFS
-
16 /// @param filename The actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
17 /// @return `true` if it worked, displays error and returns `false` if not.
-
18 bool Settings::save(const String filename) {
-
19  if (!validName(filename)) {
-
20  return false;
-
21  }
-
22  String actual_filename = QUOTE(SPIFFS_PREFIX/) + filename;
-
23  if (!SPIFFS.begin(true)) {
-
24  ERROR("ERROR: Could not open SPIFFS filesystem.\n");
-
25  return false;
-
26  }
-
27  File file = SPIFFS.open(actual_filename, FILE_WRITE);
-
28  if (!file) {
-
29  ERROR("ERROR: Could not open file '%s' for writing.\n", filename.c_str(), FILE_WRITE);
-
30  return false;
-
31  }
-
32  String contents = list() + "\n";
-
33  if (!file.print(contents)) {
-
34  ERROR("ERROR: Could not save settings to flash.\n");
-
35  return false;
-
36  }
-
37  INFO("Saved settings to file '%s'.\n", filename.c_str());
-
38  return true;
-
39 }
-
40 
-
41 /// @brief Load settings from file in SPIFFS
-
42 /// @param filename The actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
43 /// @return `true` if it worked, displays error and returns `false` if not.
-
44 bool Settings::load(const String filename) {
-
45  if (!validName(filename)) {
-
46  return false;
-
47  }
-
48  String actual_filename = QUOTE(SPIFFS_PREFIX/) + filename;
-
49  if (!SPIFFS.begin(true)) {
-
50  ERROR("ERROR: Could not open SPIFFS filesystem.\n");
-
51  return false;
-
52  }
-
53  File file = SPIFFS.open(actual_filename);
-
54  if (!file || !SPIFFS.exists(actual_filename)) {
-
55  ERROR("ERROR: Could not open file '%s'.\n", filename.c_str());
-
56  return false;
-
57  }
-
58  String contents;
-
59  while(file.available()) {
-
60  contents += char(file.read());
-
61  }
-
62  INFO ("Loaded settings from file '%s'.\n", filename.c_str());
-
63  return fromList(contents);
-
64 }
-
65 
-
66 /// @brief Shows all files in the location SPIFFS_PREFIX in SPIFFS.
-
67 /// @return `true` if it worked, displays error and returns `false` if not.
-
68 bool Settings::ls() {
-
69  if (!SPIFFS.begin(true)) {
-
70  ERROR("ERROR: Could not open SPIFFS filesystem.\n");
-
71  return false;
-
72  }
-
73  File root = SPIFFS.open(QUOTE(SPIFFS_PREFIX));
-
74  File file = root.openNextFile();
-
75  while(file){
-
76  INFO("%s\n", file.name());
-
77  file = root.openNextFile();
-
78  }
-
79  return true;
-
80 }
-
81 
-
82 /// @brief Deletes file from SPIFFS
-
83 /// @param filename The actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
84 /// @return `true` if it worked, displays error and returns `false` if not.
-
85 bool Settings::rm(const String filename) {
-
86  String actual_filename = QUOTE(SPIFFS_PREFIX/) + filename;
-
87  if (!SPIFFS.begin(true)) {
-
88  ERROR("ERROR: Could not open SPIFFS filesystem.\n");
-
89  return false;
-
90  }
-
91  if (SPIFFS.remove(actual_filename)) {
-
92  INFO("File '%s' deleted.\r\n", filename.c_str());
-
93  return true;
-
94  }
-
95  ERROR("ERROR: rm '%s': file not found.\n", filename);
-
96  return false;
-
97 }
-
98 
-
99 /// @brief See if given file exists in SPIFFS
-
100 /// @param filename The actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
101 /// @return `true` if file exists, `false` if not.
-
102 bool Settings::fileExists(const String filename) {
-
103  String actual_filename = QUOTE(SPIFFS_PREFIX/) + filename;
-
104  if (!validName(filename)) {
-
105  return false;
-
106  }
-
107  if (!SPIFFS.begin(true)) {
-
108  ERROR("ERROR: Could not open SPIFFS filesystem. On Arduino IDE, check Tools/Partition Scheme to make sure\n you are set up to have SPIFFS.\n");
-
109  return false;
-
110  }
-
111  return SPIFFS.exists(actual_filename);
-
112 }
-
113 
-
114 /// @brief Deletes all settings from memory
-
115 void Settings::zap() {
-
116  store.clear();
-
117 }
-
118 
-
119 /// @brief Stores all settings from a String into memory
-
120 /// @param in String that contains name=value<lf>name=value<lf>...
-
121 /// @return `true` if it worked, displays error and returns `false` if not.
-
122 bool Settings::fromList(String in) {
-
123  zap();
-
124  while (true) {
-
125  int lf = in.indexOf("\n");
-
126  if (lf == -1) {
-
127  break;
-
128  }
-
129  String this_one = in.substring(0, lf);
-
130  int equals_sign = in.indexOf("=");
-
131  if (equals_sign != -1) {
-
132  store[this_one.substring(0, equals_sign)] = this_one.substring(equals_sign + 1);
-
133  }
-
134  in = in.substring(lf + 1);
-
135  }
-
136  return true;
-
137 }
-
138 
-
139 
-
140 /// @brief `true` if name is a valid name for a setting.
-
141 bool Settings::validName(const String &name) {
-
142  if (name.length() == 0) {
-
143  ERROR("ERROR: name cannot be empty.\n");
-
144  return false;
-
145  }
-
146  for (int n = 0; n < name.length(); n++) {
-
147  if (!isAlphaNumeric(name.charAt(n)) && name.charAt(n) != '_') {
-
148  ERROR("ERROR: name '%s' contains illegal character.\n", name.c_str());
-
149  return false;
-
150  }
-
151  }
-
152  return true;
-
153 }
-
154 
-
155 /// @brief List of values in memory
-
156 /// @return String with name=value<lf>name=value<lf>...
-
157 String Settings::list() {
-
158  String res;
-
159  for (const auto& pair: store) {
-
160  // Remove the ending '=' for settings that are merely set, no value.
-
161  if (pair.second == "") {
-
162  res += pair.first;
-
163  } else {
-
164  res += pair.first;
-
165  res += "=";
-
166  res += pair.second;
-
167  }
-
168  res += "\n";
-
169  }
-
170  // cut off last lf
-
171  res = res.substring(0, res.length() - 1);
-
172  return res;
-
173 }
-
174 
-
175 /// @brief Find out if a key with given name exists in memory
-
176 /// @param name Setting name
-
177 /// @return `true` if that name is set
-
178 bool Settings::isSet(const String &name) {
-
179  return store.count(name);
-
180 }
-
181 
-
182 /// @brief Set a value
-
183 /// @param name name of the key to be set
-
184 /// @param value value to be set as an Arduino String
-
185 /// @return
-
186 bool Settings::set(const String &name, const String &value) {
-
187  if (!validName(name)) {
-
188  return false;
-
189  }
-
190  store[name] = value;
-
191  return true;
-
192 }
-
193 
-
194 /// @brief Removes key with given name from memory
-
195 /// @param name name of key
-
196 /// @return `true` if removed, `false` if name not valid or key not set.
-
197 bool Settings::unset(const String &name) {
-
198  if (!validName(name) || !isSet(name)) {
-
199  return false;
-
200  }
-
201  store.erase(name);
-
202  return true;
-
203 }
-
204 
-
205 /// @brief Get a value from memory as String
-
206 /// @param name name of the key
-
207 /// @param value String variable that will hold the value on return
-
208 /// @return `true` if value found, `false` if not
-
209 bool Settings::get(const String &name, String &value) {
-
210  if (isSet(name)) {
-
211  value = store[name];
-
212  return true;
-
213  }
-
214  return false;
-
215 }
-
216 
-
217 /// @brief Get a value from memory as float
-
218 /// @param name name of the key
-
219 /// @param value `float` variable that will hold the value on return
-
220 /// @return `true` if value found, `false` if not
-
221 bool Settings::get(const String &name, float &value) {
-
222  String val_string;
-
223  if (get(name, val_string)) {
-
224  value = val_string.toFloat();
-
225  return true;
-
226  } else {
-
227  return false;
-
228  }
-
229 }
-
230 
-
231 /// @brief Get a value from memory as int
-
232 /// @param name name of the key
-
233 /// @param value `int` variable that will hold the value on return
-
234 /// @return `true` if value found, `false` if not
-
235 bool Settings::get(const String &name, int &value) {
-
236  String val_string;
-
237  if (get(name, val_string)) {
-
238  value = val_string.toInt();
-
239  return true;
-
240  } else {
-
241  return false;
-
242  }
-
243 }
-
244 
-
245 /// @brief Get a value from memory as long
-
246 /// @param name name of the key
-
247 /// @param value `long` variable that will hold the value on return
-
248 /// @return `true` if value found, `false` if not
-
249 bool Settings::get(const String &name, long &value) {
-
250  String val_string;
-
251  if (get(name, val_string)) {
-
252  value = val_string.toInt(); // String's .toInt() actually returns a long
-
253  return true;
-
254  } else {
-
255  return false;
-
256  }
-
257 }
-
258 
-
259 /// @brief Get a value from memory as String with default
-
260 /// @param name name of the key
-
261 /// @param dflt [optional] Default returned if key not found in memory or "" if no default specified.
-
262 /// @return String with value found, or default
-
263 String Settings::getString(const String &name, const String dflt) {
-
264  if (isSet(name)) {
-
265  return store[name];
-
266  }
-
267  return dflt;
-
268 }
-
269 
-
270 /// @brief Get a value from memory as int with default
-
271 /// @param name name of the key
-
272 /// @param dflt [optional] Default returned if key not found in memory or -1 if no default specified.
-
273 /// @return int with value found, or default
-
274 int Settings::getInt(const String &name, const long dflt) {
-
275  if (isSet(name)) {
-
276  return store[name].toInt();
-
277  }
-
278  return dflt;
-
279 }
-
280 
-
281 /// @brief Get a value from memory as long with default
-
282 /// @param name name of the key
-
283 /// @param dflt [optional] Default returned if key not found in memory or -1 if no default specified.
-
284 /// @return long with value found, or default
-
285 long Settings::getLong(const String &name, const long dflt) {
-
286  if (isSet(name)) {
-
287  return store[name].toInt();
-
288  }
-
289  return dflt;
-
290 }
-
291 
-
292 /// @brief Get a value from memory as float with default
-
293 /// @param name name of the key
-
294 /// @param dflt [optional] Default returned if key not found in memory or -1 if no default specified.
-
295 /// @return float with value found, or default
-
296 float Settings:: getFloat(const String &name, const float dflt) {
-
297  if (isSet(name)) {
-
298  return store[name].toFloat();
-
299  }
-
300  return dflt;
-
301 }
-
302 
-
303 Settings dummy; // so the constructor runs once for the default settings
-
- - - - diff --git a/doxygen/html/Settings_8h_source.html b/doxygen/html/Settings_8h_source.html deleted file mode 100644 index 7f20c3a..0000000 --- a/doxygen/html/Settings_8h_source.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/Settings.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Settings.h
-
-
-
1 #ifndef _SETTINGS_H_
-
2 #define _SETTINGS_H_
-
3 
-
4 #include <map>
-
5 #include <Arduino.h>
-
6 #include "serial_output.h"
-
7 #include "config.h"
-
8 
-
9 // Update same-named variable only if setting exists
-
10 #define SETTING(name) Settings::get(#name, name);
-
11 
-
12 // Same but now sets the already existing variable to the
-
13 // default if setting doesn't exist.
-
14 #define SETTING_WITH_DEFAULT(name, default) if (!Settings::get(#name, name)) name = default;
-
15 
-
16 // For use in functions that return a bool. Assumes there is
-
17 // a variable (int, long, String or float) of the same name
-
18 // as the setting, and sets that variable to the value in the
-
19 // setting. If no such setting found, will show ERROR and then
-
20 // will "return false;" out of the function you call this from.
-
21 #define SETTING_OR_ERROR(name) if (!Settings::get(#name, name)) {
-
22  ERROR("Mandatory setting '%s' missing.\n", #name);
-
23  return false;\
-
24 }
-
25 
-
26 #define MANDATORY(name) if (!Settings::isSet(#name)) {
-
27  ERROR("Mandatory setting '%s' missing.\n", #name);
-
28  return false;\
-
29 }
-
30 
-
31 class Settings {
-
32 
-
33 public:
-
34  Settings();
-
35  static bool set(const String &name, const String &value = "");
-
36 
-
37  template <typename T>
-
38  static bool set(const String &name, const T &value = "") {
-
39  return set(name, String(value));
-
40  }
-
41 
-
42  static bool unset(const String &name);
-
43  static bool get(const String &name, String &value);
-
44  static bool get(const String &name, float &value);
-
45  static bool get(const String &name, int &value);
-
46  static bool get(const String &name, long &value);
-
47  static String getString(const String &name, const String dflt = "");
-
48  static int getInt(const String &name, const long dflt = -1);
-
49  static long getLong(const String &name, const long dflt = -1);
-
50  static float getFloat(const String &name, const float dflt = -1);
-
51  static bool validName(const String &name);
-
52  static String list();
-
53  static bool fromList(String in);
-
54  static bool save(const String filename);
-
55  static bool load(const String filename);
-
56  static bool ls();
-
57  static bool rm(const String filename);
-
58  static bool fileExists(String filename);
-
59  static void zap();
-
60  static bool isSet(const String &name);
-
61 
-
62 private:
-
63  static std::map<String, String> store;
-
64 
-
65 };
-
66 
-
67 #endif
-
- - - - diff --git a/doxygen/html/annotated.html b/doxygen/html/annotated.html deleted file mode 100644 index 156ab21..0000000 --- a/doxygen/html/annotated.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -OOKwiz: Class List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Class List
-
-
-
Here are the classes, structs, unions and interfaces with brief descriptions:
- - - - - - - - - - -
 CDevice
 CMeaningHolds the parsed packet as a collection of MeaningElements
 CMeaningElementChunks of parsed packet. Either a pulse, a gap or a block of decoded data
 COOKwizThe static functions in the OOKwiz class provide the main controls for OOKwiz' functionality. Prefix them with OOKwiz:: to use them from your own code
 CpulseBinStruct that holds information about a 'bin' in a Pulsetrain, a range of timings that are lumped together when converting RawTimings to a Pulsetrain
 CPulsetrainInstances of Pulsetrain represent packets in a normalized way, meaning all intervals of similar length are made equal
 CRadio
 CRawTimingsRawTimings instances store the time in µs of each interval
 CSettings
-
-
- - - - diff --git a/doxygen/html/bc_s.png b/doxygen/html/bc_s.png deleted file mode 100644 index 224b29a..0000000 Binary files a/doxygen/html/bc_s.png and /dev/null differ diff --git a/doxygen/html/bdwn.png b/doxygen/html/bdwn.png deleted file mode 100644 index 940a0b9..0000000 Binary files a/doxygen/html/bdwn.png and /dev/null differ diff --git a/doxygen/html/classDevice-members.html b/doxygen/html/classDevice-members.html deleted file mode 100644 index 51edb4c..0000000 --- a/doxygen/html/classDevice-members.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
Device Member List
-
-
- -

This is the complete list of members for Device, including all inherited members.

- - - - - - - - - - - - -
add(const char *name, Device *pointer) (defined in Device)Devicestatic
len (defined in Device)Devicestatic
list(String separator=", ") (defined in Device)Devicestatic
name (defined in Device)Device
new_packet(RawTimings &raw, Pulsetrain &train, Meaning &meaning) (defined in Device)Devicestatic
pointer (defined in Device)Device
receive(const RawTimings &raw, const Pulsetrain &train, const Meaning &meaning) (defined in Device)Devicevirtual
setup() (defined in Device)Devicestatic
store (defined in Device)Devicestatic
transmit(const String &plugin_name, const String &toTransmit) (defined in Device)Devicestatic
transmit(const String &toTransmit) (defined in Device)Devicevirtual
- - - - diff --git a/doxygen/html/classDevice.html b/doxygen/html/classDevice.html deleted file mode 100644 index 84ac496..0000000 --- a/doxygen/html/classDevice.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -OOKwiz: Device Class Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-Public Member Functions | -Static Public Member Functions | -Static Public Attributes | -List of all members
-
-
Device Class Reference
-
-
- - - - - - -

-Public Member Functions

-virtual bool receive (const RawTimings &raw, const Pulsetrain &train, const Meaning &meaning)
 
-virtual bool transmit (const String &toTransmit)
 
- - - - - - - - - - - -

-Static Public Member Functions

-static bool setup ()
 
-static bool add (const char *name, Device *pointer)
 
-static String list (String separator=", ")
 
-static bool new_packet (RawTimings &raw, Pulsetrain &train, Meaning &meaning)
 
-static bool transmit (const String &plugin_name, const String &toTransmit)
 
- - - - - - - - - - -

-Static Public Attributes

-struct {
-   Device *   pointer
 
-   char   name [MAX_DEVICE_NAME_LEN]
 
store [MAX_DEVICES]
 
-static int len = 0
 
-

Detailed Description

-
-

Definition at line 32 of file Device.h.

-

The documentation for this class was generated from the following files: -
- - - - diff --git a/doxygen/html/classMeaning-members.html b/doxygen/html/classMeaning-members.html deleted file mode 100644 index 78aa66a..0000000 --- a/doxygen/html/classMeaning-members.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
Meaning Member List
-
-
- -

This is the complete list of members for Meaning, including all inherited members.

- - - - - - - - - - - - - - - - - -
addGap(uint16_t pulse_time)Meaning
addPPM(int space, int mark, int filler, int bits, uint8_t *tmp_data)Meaning
addPulse(uint16_t pulse_time)Meaning
addPWM(int space, int mark, int bits, uint8_t *tmp_data)Meaning
elementsMeaning
fromPulsetrain(Pulsetrain &train)Meaning
fromString(String in)Meaning
gapMeaning
maybe(String str)Meaningstatic
operator bool()Meaning
parsePPM(const Pulsetrain &train, int from, int to, int space, int mark, int filler)Meaning
parsePWM(const Pulsetrain &train, int from, int to, int space, int mark)Meaning
repeatsMeaning
suspected_incompleteMeaning
toString()Meaning
zap()Meaning
- - - - diff --git a/doxygen/html/classMeaning.html b/doxygen/html/classMeaning.html deleted file mode 100644 index 57d86ae..0000000 --- a/doxygen/html/classMeaning.html +++ /dev/null @@ -1,571 +0,0 @@ - - - - - - - -OOKwiz: Meaning Class Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-Public Member Functions | -Static Public Member Functions | -Public Attributes | -List of all members
-
-
Meaning Class Reference
-
-
- -

Holds the parsed packet as a collection of MeaningElements. - More...

- -

#include <Meaning.h>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

operator bool ()
 If you try to evaluate the instance as a bool, for instance in if (myMeaning) ..., it will be true if this holds Meaning elements.
 
-void zap ()
 empty out all Meaning elements
 
bool fromPulsetrain (Pulsetrain &train)
 Convert Pulsetrain to Meaning. More...
 
bool addPulse (uint16_t pulse_time)
 Adds a "pulse" Meaning element. More...
 
bool addGap (uint16_t pulse_time)
 Adds a "gap"" Meaning element. More...
 
bool addPWM (int space, int mark, int bits, uint8_t *tmp_data)
 Adds a new meaning element with the specified PWM-encoded data. More...
 
bool addPPM (int space, int mark, int filler, int bits, uint8_t *tmp_data)
 Adds a new meaning element with the specified PPM-encoded data. More...
 
String toString ()
 Get the String representation, which looks like pulse(5906) + pwm(timing 190/575, 24 bits 0x1772A4) More...
 
bool fromString (String in)
 Read a String representation like above, and store in this instance. More...
 
int parsePWM (const Pulsetrain &train, int from, int to, int space, int mark)
 Decode PWM data with specified timings from given range in Pulsetrain to a new Meaning element. Normally called by fromPulsetrain, but can be used from user code also. More...
 
int parsePPM (const Pulsetrain &train, int from, int to, int space, int mark, int filler)
 Decode PPM data with specified timings from given range in Pulsetrain to a new Meaning element. Normally called by fromPulsetrain, but can be used from user code also. More...
 
- - - - -

-Static Public Member Functions

static bool maybe (String str)
 See if String might be a representation of Maening. No guarantees until you try to convert it, but silent. More...
 
- - - - - - - - - - - - - -

-Public Attributes

-std::vector< MeaningElementelements
 The MeaningElement structs that make up the parsed packet.
 
-bool suspected_incomplete = false
 Set when there were no repetitions and the number of bits detected is not divisible by 4.
 
-uint16_t repeats = 0
 Number of repeats of the signal.
 
-uint16_t gap = 0
 Shortest time between two repetitions.
 
-

Detailed Description

-

Holds the parsed packet as a collection of MeaningElements.

- -

Definition at line 30 of file Meaning.h.

-

Member Function Documentation

- -

◆ maybe()

- -
-
- - - - - -
- - - - - - - - -
bool Meaning::maybe (String str)
-
-static
-
- -

See if String might be a representation of Maening. No guarantees until you try to convert it, but silent.

-
Parameters
- - -
strString that we are curious about
-
-
-
Returns
true if it might be a Meaning String, false if not.
- -

Definition at line 14 of file Meaning.cpp.

- -
-
- -

◆ fromPulsetrain()

- -
-
- - - - - - - - -
bool Meaning::fromPulsetrain (Pulsetraintrain)
-
- -

Convert Pulsetrain to Meaning.

-
Parameters
- - -
trainPulsetrain we want to convert
-
-
-
Returns
true if there was data found, false otherwise.
- -

Definition at line 37 of file Meaning.cpp.

- -
-
- -

◆ addPulse()

- -
-
- - - - - - - - -
bool Meaning::addPulse (uint16_t pulse_time)
-
- -

Adds a "pulse" Meaning element.

-
Parameters
- - -
pulse_timetime in µs
-
-
-
Returns
true
- -

Definition at line 384 of file Meaning.cpp.

- -
-
- -

◆ addGap()

- -
-
- - - - - - - - -
bool Meaning::addGap (uint16_t gap_time)
-
- -

Adds a "gap"" Meaning element.

-
Parameters
- - -
gap_timetime in µs
-
-
-
Returns
true
- -

Definition at line 395 of file Meaning.cpp.

- -
-
- -

◆ addPWM()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Meaning::addPWM (int space,
int mark,
int bits,
uint8_t * tmp_data 
)
-
- -

Adds a new meaning element with the specified PWM-encoded data.

-
Parameters
- - - - - -
spacetime in µs
marktime in µs
bitsLength of data at tmp_data IN BITS, not bytes
tmp_datapointer to uint8_t array with the data
-
-
-
Returns
true
- -

Definition at line 431 of file Meaning.cpp.

- -
-
- -

◆ addPPM()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Meaning::addPPM (int space,
int mark,
int filler,
int bits,
uint8_t * tmp_data 
)
-
- -

Adds a new meaning element with the specified PPM-encoded data.

-
Parameters
- - - - - - -
spacetime in µs
marktime in µs
fillertime in µs
bitsLength of data at tmp_data IN BITS, not bytes
tmp_datapointer to uint8_t array with the data
-
-
-
Returns
true
- -

Definition at line 410 of file Meaning.cpp.

- -
-
- -

◆ toString()

- -
-
- - - - - - - -
String Meaning::toString ()
-
- -

Get the String representation, which looks like pulse(5906) + pwm(timing 190/575, 24 bits 0x1772A4)

-
Returns
the String representation
- -

Definition at line 234 of file Meaning.cpp.

- -
-
- -

◆ fromString()

- -
-
- - - - - - - - -
bool Meaning::fromString (String in)
-
- -

Read a String representation like above, and store in this instance.

-
Returns
true if it worked, false (with error message) if it didn't.
- -

Definition at line 273 of file Meaning.cpp.

- -
-
- -

◆ parsePWM()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Meaning::parsePWM (const Pulsetraintrain,
int from,
int to,
int space,
int mark 
)
-
- -

Decode PWM data with specified timings from given range in Pulsetrain to a new Meaning element. Normally called by fromPulsetrain, but can be used from user code also.

-
Parameters
- - - - - - -
trainPulsetrain we're reading from
fromstart at this interval
toend before this interval
spacebin number (NOT time in µs) for space (first if bit 0)
markbin number (NOT time in µs) for mark (first if bit 1)
-
-
-
Returns
Number of intervals read before read error (mark-mark, space-space or bin number not mark or space)
- -

Definition at line 135 of file Meaning.cpp.

- -
-
- -

◆ parsePPM()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Meaning::parsePPM (const Pulsetraintrain,
int from,
int to,
int space,
int mark,
int filler 
)
-
- -

Decode PPM data with specified timings from given range in Pulsetrain to a new Meaning element. Normally called by fromPulsetrain, but can be used from user code also.

-
Parameters
- - - - - - - -
trainPulsetrain we're reading from
fromstart at this interval
toend before this interval
spacebin number (NOT time in µs) for space (first if bit 0)
markbin number (NOT time in µs) for mark (first if bit 1)
fillerbin number for delineator interval between the mark and space intervals
-
-
-
Returns
Number of intervals read before read error
- -

Definition at line 184 of file Meaning.cpp.

- -
-
-
The documentation for this class was generated from the following files: -
- - - - diff --git a/doxygen/html/classOOKwiz-members.html b/doxygen/html/classOOKwiz-members.html deleted file mode 100644 index ad3dfdb..0000000 --- a/doxygen/html/classOOKwiz-members.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
OOKwiz Member List
-
-
- -

This is the complete list of members for OOKwiz, including all inherited members.

- - - - - - - - - - - - - - -
loop()OOKwizstatic
onReceive(void(*callback_function)(RawTimings, Pulsetrain, Meaning))OOKwizstatic
receive()OOKwizstatic
setup(bool skip_saved_defaults=false)OOKwizstatic
simulate(String &str)OOKwizstatic
simulate(RawTimings &raw)OOKwizstatic
simulate(Pulsetrain &train)OOKwizstatic
simulate(Meaning &meaning)OOKwizstatic
standby()OOKwizstatic
transmit(String &str)OOKwizstatic
transmit(RawTimings &raw)OOKwizstatic
transmit(Pulsetrain &train)OOKwizstatic
transmit(Meaning &meaning)OOKwizstatic
- - - - diff --git a/doxygen/html/classOOKwiz.html b/doxygen/html/classOOKwiz.html deleted file mode 100644 index eafef89..0000000 --- a/doxygen/html/classOOKwiz.html +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - -OOKwiz: OOKwiz Class Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-Static Public Member Functions | -List of all members
-
-
OOKwiz Class Reference
-
-
- -

The static functions in the OOKwiz class provide the main controls for OOKwiz' functionality. Prefix them with OOKwiz:: to use them from your own code. - More...

- -

#include <OOKwiz.h>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Member Functions

static bool setup (bool skip_saved_defaults=false)
 Starts OOKwiz. Loads settings, initializes the radio and starts receiving if it finds the appropriate settings. More...
 
static bool loop ()
 To be called from your own loop() function. More...
 
static bool receive ()
 Tell OOKwiz to start receiving and processing packets. More...
 
static bool onReceive (void(*callback_function)(RawTimings, Pulsetrain, Meaning))
 Use this to supply your own function that will be called every time a packet is received. More...
 
static bool standby ()
 Sets radio standby mode, turning off reception. More...
 
static bool simulate (String &str)
 Pretends this string representation of a RawTimings, Pulsetrain or Meaning instance was just received by the radio. More...
 
static bool simulate (RawTimings &raw)
 Pretends this RawTimings instance was just received by the radio. More...
 
static bool simulate (Pulsetrain &train)
 Pretends this Pulsetrain instance was just received by the radio. More...
 
static bool simulate (Meaning &meaning)
 Pretends this Meaning instance was just received by the radio. More...
 
static bool transmit (String &str)
 Transmits this string representation of a RawTimings, Pulsetrain or Meaning instance. More...
 
static bool transmit (RawTimings &raw)
 Transmits this RawTimings instance. More...
 
static bool transmit (Pulsetrain &train)
 Transmits this Pulsetrain instance. More...
 
static bool transmit (Meaning &meaning)
 Transmits this Meaning instance. More...
 
-

Detailed Description

-

The static functions in the OOKwiz class provide the main controls for OOKwiz' functionality. Prefix them with OOKwiz:: to use them from your own code.

-

Example use of functions from the OOKwiz class

void setup() {
- -
}
-
-
void loop() {
- -
}
-
static bool loop()
To be called from your own loop() function.
Definition: OOKwiz.cpp:129
-
static bool setup(bool skip_saved_defaults=false)
Starts OOKwiz. Loads settings, initializes the radio and starts receiving if it finds the appropriate...
Definition: OOKwiz.cpp:42
-
-

Definition at line 44 of file OOKwiz.h.

-

Member Function Documentation

- -

◆ setup()

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::setup (bool skip_saved_defaults = false)
-
-static
-
- -

Starts OOKwiz. Loads settings, initializes the radio and starts receiving if it finds the appropriate settings.

-

If you set the GPIO pin for a button on your ESP32 in 'pin_rescue' and press it during boot, OOKwiz will not initialize SPI and the radio, possibly breaking an endless boot loop. Set 'rescue_active_high' if the button connects to VCC instead of GND.

-

Normally, OOKwiz will start up in receive mode. If you set 'start_in_standby', it will start in standby mode instead.

Parameters
- - -
skip_saved_defaultsThe settings in the SPIFFS file 'defaults' are not read when this is true, leaving only the factory defaults from config.cpp.
-
-
-
-
Returns
true if setup succeeded, false if it could not complete, e.g. because the radio is not configured yet.
- -

Definition at line 42 of file OOKwiz.cpp.

- -
-
- -

◆ loop()

- -
-
- - - - - -
- - - - - - - -
bool OOKwiz::loop ()
-
-static
-
- -

To be called from your own loop() function.

-

Does the high-level processing of packets as soon as they are received and processed by the ISR functions. Handles the serial port output of each packet as well as calling the user's own callback function and the various device plugins.

Returns
always returns true
- -

Definition at line 129 of file OOKwiz.cpp.

- -
-
- -

◆ receive()

- -
-
- - - - - -
- - - - - - - -
bool OOKwiz::receive ()
-
-static
-
- -

Tell OOKwiz to start receiving and processing packets.

-

OOKwiz starts in receive mode normally, so you would only need to call this if your code has turned off reception (with standby()) or if you configured OOKwiz to not start in receive mode by setting start_in_standby.

Returns
true if receive mode could be activated, false if not.
- -

Definition at line 375 of file OOKwiz.cpp.

- -
-
- -

◆ onReceive()

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::onReceive (void(*)(RawTimings, Pulsetrain, Meaningcallback_function)
-
-static
-
- -

Use this to supply your own function that will be called every time a packet is received.

-

The callback_function parameter has to be the function name of a function that takes the three packet representations as arguments and does not return anything. Here's an example sketch:

-
setup() {
-
Serial.begin(115200);
- -
OOKwiz::onReceive(myReceiveFunction);
-
}
-
-
loop() {
- -
}
-
-
void myReceiveFunction(RawTimings raw, Pulsetrain train, Meaning meaning) {
-
Serial.println("A packet was received and myReceiveFunction was called.");
-
}
-
Holds the parsed packet as a collection of MeaningElements.
Definition: Meaning.h:30
-
static bool onReceive(void(*callback_function)(RawTimings, Pulsetrain, Meaning))
Use this to supply your own function that will be called every time a packet is received.
Definition: OOKwiz.cpp:363
-
Instances of Pulsetrain represent packets in a normalized way, meaning all intervals of similar lengt...
Definition: Pulsetrain.h:24
-
RawTimings instances store the time in µs of each interval.
Definition: RawTimings.h:11
-

Make sure your own function is defined exactly as like this, even if you don't need all the parameters. You may change the names of the function and the parameters, but nothing else.

Parameters
- - -
callback_functionThe name of your own function, without parenthesis () after it.
-
-
-
Returns
always returns true
- -

Definition at line 363 of file OOKwiz.cpp.

- -
-
- -

◆ standby()

- -
-
- - - - - -
- - - - - - - -
bool OOKwiz::standby ()
-
-static
-
- -

Sets radio standby mode, turning off reception.

-
Returns
The counterpart to receive(), turns off reception.
- -

Definition at line 582 of file OOKwiz.cpp.

- -
-
- -

◆ simulate() [1/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::simulate (String & str)
-
-static
-
- -

Pretends this string representation of a RawTimings, Pulsetrain or Meaning instance was just received by the radio.

-
Parameters
- - -
strThe string representation of what needs to be simulated
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 399 of file OOKwiz.cpp.

- -
-
- -

◆ simulate() [2/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::simulate (RawTimingsraw)
-
-static
-
- -

Pretends this RawTimings instance was just received by the radio.

-
Parameters
- - -
rawthe instance to be simulated
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 425 of file OOKwiz.cpp.

- -
-
- -

◆ simulate() [3/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::simulate (Pulsetraintrain)
-
-static
-
- -

Pretends this Pulsetrain instance was just received by the radio.

-
Parameters
- - -
trainthe instance to be simulated
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 435 of file OOKwiz.cpp.

- -
-
- -

◆ simulate() [4/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::simulate (Meaningmeaning)
-
-static
-
- -

Pretends this Meaning instance was just received by the radio.

-
Parameters
- - -
meaningthe instance to be simulated
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 446 of file OOKwiz.cpp.

- -
-
- -

◆ transmit() [1/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::transmit (String & str)
-
-static
-
- -

Transmits this string representation of a RawTimings, Pulsetrain or Meaning instance.

-
Parameters
- - -
strThe string representation of what needs to be simulated
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 457 of file OOKwiz.cpp.

- -
-
- -

◆ transmit() [2/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::transmit (RawTimingsraw)
-
-static
-
- -

Transmits this RawTimings instance.

-
Parameters
- - -
rawthe instance to be transmitted
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 482 of file OOKwiz.cpp.

- -
-
- -

◆ transmit() [3/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::transmit (Pulsetraintrain)
-
-static
-
- -

Transmits this Pulsetrain instance.

-
Parameters
- - -
trainthe instance to be transmitted
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 525 of file OOKwiz.cpp.

- -
-
- -

◆ transmit() [4/4]

- -
-
- - - - - -
- - - - - - - - -
bool OOKwiz::transmit (Meaningmeaning)
-
-static
-
- -

Transmits this Meaning instance.

-
Parameters
- - -
meaningthe instance to be transmitted
-
-
-
Returns
true if it worked, false if not. Will show error message telling you why it didn't work in latter case.
- -

Definition at line 572 of file OOKwiz.cpp.

- -
-
-
The documentation for this class was generated from the following files: -
- - - - diff --git a/doxygen/html/classPulsetrain-members.html b/doxygen/html/classPulsetrain-members.html deleted file mode 100644 index 6abcf4d..0000000 --- a/doxygen/html/classPulsetrain-members.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
Pulsetrain Member List
-
-
- -

This is the complete list of members for Pulsetrain, including all inherited members.

- - - - - - - - - - - - - - - - - - - - -
binList()Pulsetrain
binsPulsetrain
durationPulsetrain
first_atPulsetrain
fromMeaning(const Meaning &meaning) (defined in Pulsetrain)Pulsetrain
fromRawTimings(const RawTimings &raw)Pulsetrain
fromString(String in)Pulsetrain
gapPulsetrain
last_atPulsetrain
maybe(String str)Pulsetrainstatic
operator bool()Pulsetrain
repeatsPulsetrain
sameAs(const Pulsetrain &other_train)Pulsetrain
summary() constPulsetrain
toString() constPulsetrain
transitionsPulsetrain
visualizer()Pulsetrain
visualizer(int base)Pulsetrain
zap()Pulsetrain
- - - - diff --git a/doxygen/html/classPulsetrain.html b/doxygen/html/classPulsetrain.html deleted file mode 100644 index 0875a8a..0000000 --- a/doxygen/html/classPulsetrain.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - -OOKwiz: Pulsetrain Class Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-Public Member Functions | -Static Public Member Functions | -Public Attributes | -List of all members
-
-
Pulsetrain Class Reference
-
-
- -

Instances of Pulsetrain represent packets in a normalized way, meaning all intervals of similar length are made equal. - More...

- -

#include <Pulsetrain.h>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

-IRAM_ATTR operator bool ()
 If you try to evaluate the instance as a bool (e.g. if (myPulsetrain) ...) this will be true if there's transitions stored.
 
-void IRAM_ATTR zap ()
 empty out all information about the stored pulses
 
bool IRAM_ATTR sameAs (const Pulsetrain &other_train)
 Compare to other Pulsetrains to see if same packet. Ignores minor timing differences. Used internally by ISR processing to see if packet is a repeat. More...
 
bool IRAM_ATTR fromRawTimings (const RawTimings &raw)
 Convert RawTimings to Pulsetrain. More...
 
-bool fromMeaning (const Meaning &meaning)
 
String summary () const
 Summary String a la 25 pulses over 24287 µs, repeated 6 times with gaps of 132 µs More...
 
bool fromString (String in)
 Read a String representation like above, and store in this instance. More...
 
String toString () const
 Get the String representation, which looks like 2010101100110101001101010010110011001100101100101,190,575,5906*6@132 More...
 
String binList ()
 Get information about the bins in this Pulsetrain, such as lowest, average and highest interval as well as number of pulses in each bin. More...
 
String visualizer ()
 Returns the viasualizer (the blocky time-graph) for the pulses in this Pulsetrain instance. More...
 
String visualizer (int base)
 The visualizer like above, with base taken from visualizer_pixel setting. More...
 
- - - - -

-Static Public Member Functions

static bool maybe (String str)
 See if String might be a representation of Pulsetrain. No guarantees until you try to convert it, but silent. More...
 
- - - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

-std::vector< pulseBinbins
 std::vector with the bins, each a PulseBin struct
 
-std::vector< uint8_t > transitions
 std::vector with the transitions, each merely the pulsebin that transition is in
 
-uint32_t duration = 0
 Total duration of this Pulsetrain in µs.
 
-int64_t first_at = 0
 First seen at this time, in system microseconds.
 
-int64_t last_at = 0
 Last seen at this time, in system microseconds.
 
-uint16_t repeats = 0
 Number of repetitions detected before either another packet came or repeat_timeout µs elapsed.
 
-uint16_t gap = 0
 Smallest gap between repeated transmissions.
 
-

Detailed Description

-

Instances of Pulsetrain represent packets in a normalized way, meaning all intervals of similar length are made equal.

- -

Definition at line 24 of file Pulsetrain.h.

-

Member Function Documentation

- -

◆ maybe()

- -
-
- - - - - -
- - - - - - - - -
bool Pulsetrain::maybe (String str)
-
-static
-
- -

See if String might be a representation of Pulsetrain. No guarantees until you try to convert it, but silent.

-
Parameters
- - -
strString that we are curious about
-
-
-
Returns
true if it might be a Pulsetrain String, false if not.
- -

Definition at line 15 of file Pulsetrain.cpp.

- -
-
- -

◆ sameAs()

- -
-
- - - - - - - - -
bool IRAM_ATTR Pulsetrain::sameAs (const Pulsetrainother_train)
-
- -

Compare to other Pulsetrains to see if same packet. Ignores minor timing differences. Used internally by ISR processing to see if packet is a repeat.

-
Parameters
- - -
other_trainPulsetrain we're comparing this one to
-
-
-
Returns
true if same, false if not
- -

Definition at line 45 of file Pulsetrain.cpp.

- -
-
- -

◆ fromRawTimings()

- -
-
- - - - - - - - -
bool IRAM_ATTR Pulsetrain::fromRawTimings (const RawTimingsraw)
-
- -

Convert RawTimings to Pulsetrain.

-
Parameters
- - -
rawthe RawTimings instance to convert from
-
-
-
Returns
Always true
- -

Definition at line 168 of file Pulsetrain.cpp.

- -
-
- -

◆ summary()

- -
-
- - - - - - - -
String Pulsetrain::summary () const
-
- -

Summary String a la 25 pulses over 24287 µs, repeated 6 times with gaps of 132 µs

-
Returns
the String in question
- -

Definition at line 156 of file Pulsetrain.cpp.

- -
-
- -

◆ fromString()

- -
-
- - - - - - - - -
bool Pulsetrain::fromString (String in)
-
- -

Read a String representation like above, and store in this instance.

-
Returns
true if it worked, false (with error message) if it didn't.
- -

Definition at line 87 of file Pulsetrain.cpp.

- -
-
- -

◆ toString()

- -
-
- - - - - - - -
String Pulsetrain::toString () const
-
- -

Get the String representation, which looks like 2010101100110101001101010010110011001100101100101,190,575,5906*6@132

-
Returns
the String representation
- -

Definition at line 67 of file Pulsetrain.cpp.

- -
-
- -

◆ binList()

- -
-
- - - - - - - -
String Pulsetrain::binList ()
-
- -

Get information about the bins in this Pulsetrain, such as lowest, average and highest interval as well as number of pulses in each bin.

-
Returns
multi-line String with bin information, 5 columns with header
- -

Definition at line 212 of file Pulsetrain.cpp.

- -
-
- -

◆ visualizer() [1/2]

- -
-
- - - - - - - -
String Pulsetrain::visualizer ()
-
- -

Returns the viasualizer (the blocky time-graph) for the pulses in this Pulsetrain instance.

-
Parameters
- - -
baseµs per (half-character) block. Every interval gets at least one block so all pulses are guaranteed visible
-
-
-
Returns
visualizer String
- -

Definition at line 224 of file Pulsetrain.cpp.

- -
-
- -

◆ visualizer() [2/2]

- -
-
- - - - - - - - -
String Pulsetrain::visualizer (int base)
-
- -

The visualizer like above, with base taken from visualizer_pixel setting.

-
Returns
visualizer String
- -

Definition at line 232 of file Pulsetrain.cpp.

- -
-
-
The documentation for this class was generated from the following files: -
- - - - diff --git a/doxygen/html/classRadio-members.html b/doxygen/html/classRadio-members.html deleted file mode 100644 index bd2f72d..0000000 --- a/doxygen/html/classRadio-members.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
Radio Member List
-
-
- -

This is the complete list of members for Radio, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
add(const char *name, Radio *pointer) (defined in Radio)Radiostatic
bandwidth (defined in Radio)Radio
bitrate (defined in Radio)Radio
current (defined in Radio)Radiostatic
frequency (defined in Radio)Radio
init() (defined in Radio)Radiovirtual
len (defined in Radio)Radiostatic
list(String separator=", ") (defined in Radio)Radiostatic
name (defined in Radio)Radio
name() (defined in Radio)Radio
pin_cs (defined in Radio)Radio
pin_rx (defined in Radio)Radiostatic
pin_tx (defined in Radio)Radiostatic
pointer (defined in Radio)Radio
radio_init() (defined in Radio)Radiostatic
radio_rx() (defined in Radio)Radiostatic
radio_standby() (defined in Radio)Radiostatic
radio_tx() (defined in Radio)Radiostatic
radiolibInit() (defined in Radio)Radio
radioLibModule (defined in Radio)Radio
rx() (defined in Radio)Radiovirtual
select(const String &name) (defined in Radio)Radiostatic
setup() (defined in Radio)Radiostatic
showRadiolibResult(const int result, const char *action) (defined in Radio)Radio
spi (defined in Radio)Radio
standby() (defined in Radio)Radiovirtual
store (defined in Radio)Radiostatic
threshold_level (defined in Radio)Radio
threshold_type_average (defined in Radio)Radio
threshold_type_fixed (defined in Radio)Radio
threshold_type_int (defined in Radio)Radio
threshold_type_peak (defined in Radio)Radio
thresholdSetup(const int fixed, const int average, const int peak) (defined in Radio)Radio
tx() (defined in Radio)Radiovirtual
- - - - diff --git a/doxygen/html/classRadio.html b/doxygen/html/classRadio.html deleted file mode 100644 index 38cf8f3..0000000 --- a/doxygen/html/classRadio.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - -OOKwiz: Radio Class Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-Public Member Functions | -Static Public Member Functions | -Public Attributes | -Static Public Attributes | -List of all members
-
-
Radio Class Reference
-
-
- - - - - - - - - - - - - - - - - - -

-Public Member Functions

-String name ()
 
-virtual bool init ()
 
-virtual bool rx ()
 
-virtual bool tx ()
 
-virtual bool standby ()
 
-void radiolibInit ()
 
-void showRadiolibResult (const int result, const char *action)
 
-int thresholdSetup (const int fixed, const int average, const int peak)
 
- - - - - - - - - - - - - - - - - -

-Static Public Member Functions

-static bool add (const char *name, Radio *pointer)
 
-static bool setup ()
 
-static bool select (const String &name)
 
-static String list (String separator=", ")
 
-static bool radio_init ()
 
-static bool radio_rx ()
 
-static bool radio_tx ()
 
-static bool radio_standby ()
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

-Module * radioLibModule
 
-SPIClass * spi
 
-int pin_cs
 
-float frequency
 
-float bandwidth
 
-float bitrate
 
-int threshold_type_fixed
 
-int threshold_type_peak
 
-int threshold_type_average
 
-int threshold_type_int
 
-int threshold_level
 
-Radiopointer
 
-char name [MAX_RADIO_NAME_LEN]
 
- - - - - - - - - - - - - - - - -

-Static Public Attributes

-struct {
-   Radio *   pointer
 
-   char   name [MAX_RADIO_NAME_LEN]
 
store [MAX_RADIOS]
 
-static Radiocurrent = nullptr
 
-static int len = 0
 
-static int pin_rx
 
-static int pin_tx
 
-

Detailed Description

-
-

Definition at line 56 of file Radio.h.

-

The documentation for this class was generated from the following files: -
- - - - diff --git a/doxygen/html/classRawTimings-members.html b/doxygen/html/classRawTimings-members.html deleted file mode 100644 index afd9ee5..0000000 --- a/doxygen/html/classRawTimings-members.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
RawTimings Member List
-
-
- -

This is the complete list of members for RawTimings, including all inherited members.

- - - - - - - - - - -
fromPulsetrain(Pulsetrain &train)RawTimings
fromString(const String &in)RawTimings
intervalsRawTimings
maybe(String str)RawTimingsstatic
operator bool()RawTimings
toString()RawTimings
visualizer()RawTimings
visualizer(int base)RawTimings
zap()RawTimings
- - - - diff --git a/doxygen/html/classRawTimings.html b/doxygen/html/classRawTimings.html deleted file mode 100644 index 2a35c1a..0000000 --- a/doxygen/html/classRawTimings.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - -OOKwiz: RawTimings Class Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-Public Member Functions | -Static Public Member Functions | -Public Attributes | -List of all members
-
-
RawTimings Class Reference
-
-
- -

RawTimings instances store the time in µs of each interval. - More...

- -

#include <RawTimings.h>

- - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

operator bool ()
 If you try to evaluate the instance as a bool, for instance in if (myRawTimings) ..., it will be true if there's intervals stored.
 
-void zap ()
 empty out the stored intervals
 
String toString ()
 Get the String representation, which is a comma-separated list of intervals. More...
 
bool fromString (const String &in)
 Read a String representation, which is a comma-separated list of intervals, and store in this instance. More...
 
bool fromPulsetrain (Pulsetrain &train)
 Convert Pulsetrain into RawTimings. Loses stats about bins as well as information about repeats. More...
 
String visualizer ()
 The visualizer like above, with base taken from visualizer_pixel setting. More...
 
String visualizer (int base)
 Returns the viasualizer (the blocky time-graph) for the pulses in this RawTimings instance. More...
 
- - - - -

-Static Public Member Functions

static bool maybe (String str)
 Static method to see if String might be a representation of RawTimings. No guarantees until you try to convert it, but silent. More...
 
- - - - -

-Public Attributes

-std::vector< uint16_t > intervals
 std::vector of uint16_t times in µs for each interval
 
-

Detailed Description

-

RawTimings instances store the time in µs of each interval.

- -

Definition at line 11 of file RawTimings.h.

-

Member Function Documentation

- -

◆ maybe()

- -
-
- - - - - -
- - - - - - - - -
bool RawTimings::maybe (String str)
-
-static
-
- -

Static method to see if String might be a representation of RawTimings. No guarantees until you try to convert it, but silent.

-
Parameters
- - -
strString that we are curious about
-
-
-
Returns
true if it might be a RawTimings String, false if not. Static, so not called on any particular RawTimings instance but instead like:
if (RawTimings::maybe(someString)) {
-
....
-
}
-
static bool maybe(String str)
Static method to see if String might be a representation of RawTimings. No guarantees until you try t...
Definition: RawTimings.cpp:19
-
- -

Definition at line 19 of file RawTimings.cpp.

- -
-
- -

◆ toString()

- -
-
- - - - - - - -
String RawTimings::toString ()
-
- -

Get the String representation, which is a comma-separated list of intervals.

-
Returns
the String representation
- -

Definition at line 48 of file RawTimings.cpp.

- -
-
- -

◆ fromString()

- -
-
- - - - - - - - -
bool RawTimings::fromString (const String & in)
-
- -

Read a String representation, which is a comma-separated list of intervals, and store in this instance.

-
Returns
true if it worked, false (with error message) if it didn't.
- -

Definition at line 61 of file RawTimings.cpp.

- -
-
- -

◆ fromPulsetrain()

- -
-
- - - - - - - - -
bool RawTimings::fromPulsetrain (Pulsetraintrain)
-
- -

Convert Pulsetrain into RawTimings. Loses stats about bins as well as information about repeats.

-
Parameters
- - -
trainthe Puksetrain you want to convert from
-
-
-
Returns
Always true
- -

Definition at line 88 of file RawTimings.cpp.

- -
-
- -

◆ visualizer() [1/2]

- -
-
- - - - - - - -
String RawTimings::visualizer ()
-
- -

The visualizer like above, with base taken from visualizer_pixel setting.

-
Returns
visualizer String
- -

Definition at line 129 of file RawTimings.cpp.

- -
-
- -

◆ visualizer() [2/2]

- -
-
- - - - - - - - -
String RawTimings::visualizer (int base)
-
- -

Returns the viasualizer (the blocky time-graph) for the pulses in this RawTimings instance.

-
Parameters
- - -
baseµs per (half-character) block. Every interval gets at least one block so all pulses are guaranteed visible
-
-
-
Returns
visualizer String
- -

Definition at line 98 of file RawTimings.cpp.

- -
-
-
The documentation for this class was generated from the following files: -
- - - - diff --git a/doxygen/html/classSettings-members.html b/doxygen/html/classSettings-members.html deleted file mode 100644 index 0a6c99f..0000000 --- a/doxygen/html/classSettings-members.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
Settings Member List
-
-
- -

This is the complete list of members for Settings, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - -
fileExists(String filename)Settingsstatic
fromList(String in)Settingsstatic
get(const String &name, String &value)Settingsstatic
get(const String &name, float &value)Settingsstatic
get(const String &name, int &value)Settingsstatic
get(const String &name, long &value)Settingsstatic
getFloat(const String &name, const float dflt=-1)Settingsstatic
getInt(const String &name, const long dflt=-1)Settingsstatic
getLong(const String &name, const long dflt=-1)Settingsstatic
getString(const String &name, const String dflt="")Settingsstatic
isSet(const String &name)Settingsstatic
list()Settingsstatic
load(const String filename)Settingsstatic
ls()Settingsstatic
rm(const String filename)Settingsstatic
save(const String filename)Settingsstatic
set(const String &name, const String &value="")Settingsstatic
set(const String &name, const T &value="") (defined in Settings)Settingsinlinestatic
Settings() (defined in Settings)Settings
unset(const String &name)Settingsstatic
validName(const String &name)Settingsstatic
zap()Settingsstatic
- - - - diff --git a/doxygen/html/classSettings.html b/doxygen/html/classSettings.html deleted file mode 100644 index 6ec74ec..0000000 --- a/doxygen/html/classSettings.html +++ /dev/null @@ -1,914 +0,0 @@ - - - - - - - -OOKwiz: Settings Class Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-Static Public Member Functions | -List of all members
-
-
Settings Class Reference
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Member Functions

static bool set (const String &name, const String &value="")
 Set a value. More...
 
-template<typename T >
static bool set (const String &name, const T &value="")
 
static bool unset (const String &name)
 Removes key with given name from memory. More...
 
static bool get (const String &name, String &value)
 Get a value from memory as String. More...
 
static bool get (const String &name, float &value)
 Get a value from memory as float. More...
 
static bool get (const String &name, int &value)
 Get a value from memory as int. More...
 
static bool get (const String &name, long &value)
 Get a value from memory as long. More...
 
static String getString (const String &name, const String dflt="")
 Get a value from memory as String with default. More...
 
static int getInt (const String &name, const long dflt=-1)
 Get a value from memory as int with default. More...
 
static long getLong (const String &name, const long dflt=-1)
 Get a value from memory as long with default. More...
 
static float getFloat (const String &name, const float dflt=-1)
 Get a value from memory as float with default. More...
 
-static bool validName (const String &name)
 true if name is a valid name for a setting.
 
static String list ()
 List of values in memory. More...
 
static bool fromList (String in)
 Stores all settings from a String into memory. More...
 
static bool save (const String filename)
 Save settings to file in SPIFFS. More...
 
static bool load (const String filename)
 Load settings from file in SPIFFS. More...
 
static bool ls ()
 Shows all files in the location SPIFFS_PREFIX in SPIFFS. More...
 
static bool rm (const String filename)
 Deletes file from SPIFFS. More...
 
static bool fileExists (String filename)
 See if given file exists in SPIFFS. More...
 
-static void zap ()
 Deletes all settings from memory.
 
static bool isSet (const String &name)
 Find out if a key with given name exists in memory. More...
 
-

Detailed Description

-
-

Definition at line 31 of file Settings.h.

-

Member Function Documentation

- -

◆ set()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool Settings::set (const String & name,
const String & value = "" 
)
-
-static
-
- -

Set a value.

-
Parameters
- - - -
namename of the key to be set
valuevalue to be set as an Arduino String
-
-
-
Returns

-
- -

Definition at line 186 of file Settings.cpp.

- -
-
- -

◆ unset()

- -
-
- - - - - -
- - - - - - - - -
bool Settings::unset (const String & name)
-
-static
-
- -

Removes key with given name from memory.

-
Parameters
- - -
namename of key
-
-
-
Returns
true if removed, false if name not valid or key not set.
- -

Definition at line 197 of file Settings.cpp.

- -
-
- -

◆ get() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool Settings::get (const String & name,
String & value 
)
-
-static
-
- -

Get a value from memory as String.

-
Parameters
- - - -
namename of the key
valueString variable that will hold the value on return
-
-
-
Returns
true if value found, false if not
- -

Definition at line 209 of file Settings.cpp.

- -
-
- -

◆ get() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool Settings::get (const String & name,
float & value 
)
-
-static
-
- -

Get a value from memory as float.

-
Parameters
- - - -
namename of the key
valuefloat variable that will hold the value on return
-
-
-
Returns
true if value found, false if not
- -

Definition at line 221 of file Settings.cpp.

- -
-
- -

◆ get() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool Settings::get (const String & name,
int & value 
)
-
-static
-
- -

Get a value from memory as int.

-
Parameters
- - - -
namename of the key
valueint variable that will hold the value on return
-
-
-
Returns
true if value found, false if not
- -

Definition at line 235 of file Settings.cpp.

- -
-
- -

◆ get() [4/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool Settings::get (const String & name,
long & value 
)
-
-static
-
- -

Get a value from memory as long.

-
Parameters
- - - -
namename of the key
valuelong variable that will hold the value on return
-
-
-
Returns
true if value found, false if not
- -

Definition at line 249 of file Settings.cpp.

- -
-
- -

◆ getString()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
String Settings::getString (const String & name,
const String dflt = "" 
)
-
-static
-
- -

Get a value from memory as String with default.

-
Parameters
- - - -
namename of the key
dflt[optional] Default returned if key not found in memory or "" if no default specified.
-
-
-
Returns
String with value found, or default
- -

Definition at line 263 of file Settings.cpp.

- -
-
- -

◆ getInt()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int Settings::getInt (const String & name,
const long dflt = -1 
)
-
-static
-
- -

Get a value from memory as int with default.

-
Parameters
- - - -
namename of the key
dflt[optional] Default returned if key not found in memory or -1 if no default specified.
-
-
-
Returns
int with value found, or default
- -

Definition at line 274 of file Settings.cpp.

- -
-
- -

◆ getLong()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
long Settings::getLong (const String & name,
const long dflt = -1 
)
-
-static
-
- -

Get a value from memory as long with default.

-
Parameters
- - - -
namename of the key
dflt[optional] Default returned if key not found in memory or -1 if no default specified.
-
-
-
Returns
long with value found, or default
- -

Definition at line 285 of file Settings.cpp.

- -
-
- -

◆ getFloat()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
float Settings::getFloat (const String & name,
const float dflt = -1 
)
-
-static
-
- -

Get a value from memory as float with default.

-
Parameters
- - - -
namename of the key
dflt[optional] Default returned if key not found in memory or -1 if no default specified.
-
-
-
Returns
float with value found, or default
- -

Definition at line 296 of file Settings.cpp.

- -
-
- -

◆ list()

- -
-
- - - - - -
- - - - - - - -
String Settings::list ()
-
-static
-
- -

List of values in memory.

-
Returns
String with name=value<lf>name=value<lf>...
- -

Definition at line 157 of file Settings.cpp.

- -
-
- -

◆ fromList()

- -
-
- - - - - -
- - - - - - - - -
bool Settings::fromList (String in)
-
-static
-
- -

Stores all settings from a String into memory.

-
Parameters
- - -
inString that contains name=value<lf>name=value<lf>...
-
-
-
Returns
true if it worked, displays error and returns false if not.
-
- -

Definition at line 122 of file Settings.cpp.

- -
-
- -

◆ save()

- -
-
- - - - - -
- - - - - - - - -
bool Settings::save (const String filename)
-
-static
-
- -

Save settings to file in SPIFFS.

-
Parameters
- - -
filenameThe actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
-
-
Returns
true if it worked, displays error and returns false if not.
-
- -

Definition at line 18 of file Settings.cpp.

- -
-
- -

◆ load()

- -
-
- - - - - -
- - - - - - - - -
bool Settings::load (const String filename)
-
-static
-
- -

Load settings from file in SPIFFS.

-
Parameters
- - -
filenameThe actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
-
-
Returns
true if it worked, displays error and returns false if not.
-
- -

Definition at line 44 of file Settings.cpp.

- -
-
- -

◆ ls()

- -
-
- - - - - -
- - - - - - - -
bool Settings::ls ()
-
-static
-
- -

Shows all files in the location SPIFFS_PREFIX in SPIFFS.

-
Returns
true if it worked, displays error and returns false if not.
-
- -

Definition at line 68 of file Settings.cpp.

- -
-
- -

◆ rm()

- -
-
- - - - - -
- - - - - - - - -
bool Settings::rm (const String filename)
-
-static
-
- -

Deletes file from SPIFFS.

-
Parameters
- - -
filenameThe actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
-
-
Returns
true if it worked, displays error and returns false if not.
-
- -

Definition at line 85 of file Settings.cpp.

- -
-
- -

◆ fileExists()

- -
-
- - - - - -
- - - - - - - - -
bool Settings::fileExists (String filename)
-
-static
-
- -

See if given file exists in SPIFFS.

-
Parameters
- - -
filenameThe actual filename in SPIFFS will have SPIFFS_PREFIX from config.h preprended
-
-
-
Returns
true if file exists, false if not.
-
- -

Definition at line 102 of file Settings.cpp.

- -
-
- -

◆ isSet()

- -
-
- - - - - -
- - - - - - - - -
bool Settings::isSet (const String & name)
-
-static
-
- -

Find out if a key with given name exists in memory.

-
Parameters
- - -
nameSetting name
-
-
-
Returns
true if that name is set
- -

Definition at line 178 of file Settings.cpp.

- -
-
-
The documentation for this class was generated from the following files: -
- - - - diff --git a/doxygen/html/classes.html b/doxygen/html/classes.html deleted file mode 100644 index de1d09b..0000000 --- a/doxygen/html/classes.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - -OOKwiz: Class Index - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Class Index
-
-
-
D | M | O | P | R | S
-
-
-
D
-
Device
-
-
M
-
Meaning
MeaningElement
-
-
O
-
OOKwiz
-
-
P
-
pulseBin
Pulsetrain
-
-
R
-
Radio
RawTimings
-
-
S
-
Settings
-
-
- - - - diff --git a/doxygen/html/closed.png b/doxygen/html/closed.png deleted file mode 100644 index 98cc2c9..0000000 Binary files a/doxygen/html/closed.png and /dev/null differ diff --git a/doxygen/html/config_8cpp_source.html b/doxygen/html/config_8cpp_source.html deleted file mode 100644 index aea623e..0000000 --- a/doxygen/html/config_8cpp_source.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/config.cpp Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
config.cpp
-
-
-
1 #include "config.h"
-
2 #include "Settings.h"
-
3 
-
4 void factorySettings() {
-
5  Settings::set("pulse_gap_len_new_packet", 2000);
-
6  Settings::set("first_pulse_min_len", 2000);
-
7  Settings::set("pulse_gap_min_len", 30);
-
8  Settings::set("min_nr_pulses", 16);
-
9  Settings::set("max_nr_pulses", 300);
-
10  Settings::set("bin_width", 150);
-
11  Settings::set("repeat_timeout", 150000L);
-
12  Settings::set("noise_penalty", 10);
-
13  Settings::set("noise_threshold", 30);
-
14  Settings::set("visualizer_pixel", 200);
-
15  Settings::set("print_raw");
-
16  Settings::set("print_visualizer");
-
17  Settings::set("print_summary");
-
18  Settings::set("print_pulsetrain");
-
19  Settings::set("print_binlist");
-
20  Settings::set("print_meaning");
-
21 }
-
- - - - diff --git a/doxygen/html/config_8h_source.html b/doxygen/html/config_8h_source.html deleted file mode 100644 index 705dbc0..0000000 --- a/doxygen/html/config_8h_source.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/config.h Source File - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
config.h
-
-
-
1 #ifndef _CONFIG_H_
-
2 #define _CONFIG_H_
-
3 
-
4 #define ARDUINO_LOOP_TASK_STACK_SIZE (16 * 1024)
-
5 #define SERIAL_RX_BUFFER_SIZE 1024
-
6 
-
7 #define OOKWIZ_VERSION "0.1.2"
-
8 #define SPIFFS_PREFIX /OOKwiz
-
9 
-
10 #define MAX_BINS 10
-
11 #define MAX_MEANING_DATA 50
-
12 #define MAX_DEVICE_NAME_LEN 16
-
13 #define MAX_RADIO_NAME_LEN 16
-
14 
-
15 // These need to be kept larger than number of devices and radios
-
16 // you want to load in DEVICE_INDEX and RADIO_INDEX respectively.
-
17 #define MAX_DEVICES 10
-
18 #define MAX_RADIOS 10
-
19 
-
20 // The default runtime settings are in config.cpp
-
21 void factorySettings();
-
22 
-
23 #endif
-
- - - - diff --git a/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html deleted file mode 100644 index 6ff85c6..0000000 --- a/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src Directory Reference - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
src Directory Reference
-
-
-
- - - - diff --git a/doxygen/html/doc.png b/doxygen/html/doc.png deleted file mode 100644 index 17edabf..0000000 Binary files a/doxygen/html/doc.png and /dev/null differ diff --git a/doxygen/html/doxygen.css b/doxygen/html/doxygen.css deleted file mode 100644 index ffbff02..0000000 --- a/doxygen/html/doxygen.css +++ /dev/null @@ -1,1793 +0,0 @@ -/* The standard CSS for doxygen 1.9.1 */ - -body, table, div, p, dl { - font: 400 14px/22px Roboto,sans-serif; -} - -p.reference, p.definition { - font: 400 14px/22px Roboto,sans-serif; -} - -/* @group Heading Levels */ - -h1.groupheader { - font-size: 150%; -} - -.title { - font: 400 14px/28px Roboto,sans-serif; - font-size: 150%; - font-weight: bold; - margin: 10px 2px; -} - -h2.groupheader { - border-bottom: 1px solid #879ECB; - color: #354C7B; - font-size: 150%; - font-weight: normal; - margin-top: 1.75em; - padding-top: 8px; - padding-bottom: 4px; - width: 100%; -} - -h3.groupheader { - font-size: 100%; -} - -h1, h2, h3, h4, h5, h6 { - -webkit-transition: text-shadow 0.5s linear; - -moz-transition: text-shadow 0.5s linear; - -ms-transition: text-shadow 0.5s linear; - -o-transition: text-shadow 0.5s linear; - transition: text-shadow 0.5s linear; - margin-right: 15px; -} - -h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px cyan; -} - -dt { - font-weight: bold; -} - -ul.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; -} - -p.startli, p.startdd { - margin-top: 2px; -} - -th p.starttd, th p.intertd, th p.endtd { - font-size: 100%; - font-weight: 700; -} - -p.starttd { - margin-top: 0px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -p.interli { -} - -p.interdd { -} - -p.intertd { -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.navtab { - border-right: 1px solid #A3B4D7; - padding-right: 15px; - text-align: right; - line-height: 110%; -} - -div.navtab table { - border-spacing: 0; -} - -td.navtab { - padding-right: 6px; - padding-left: 6px; -} -td.navtabHL { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - padding-right: 6px; - padding-left: 6px; -} - -td.navtabHL a, td.navtabHL a:visited { - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); -} - -a.navtab { - font-weight: bold; -} - -div.qindex{ - text-align: center; - width: 100%; - line-height: 140%; - font-size: 130%; - color: #A0A0A0; -} - -dt.alphachar{ - font-size: 180%; - font-weight: bold; -} - -.alphachar a{ - color: black; -} - -.alphachar a:hover, .alphachar a:visited{ - text-decoration: none; -} - -.classindex dl { - padding: 25px; - column-count:1 -} - -.classindex dd { - display:inline-block; - margin-left: 50px; - width: 90%; - line-height: 1.15em; -} - -.classindex dl.odd { - background-color: #F8F9FC; -} - -@media(min-width: 1120px) { - .classindex dl { - column-count:2 - } -} - -@media(min-width: 1320px) { - .classindex dl { - column-count:3 - } -} - - -/* @group Link Styling */ - -a { - color: #3D578C; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #4665A2; -} - -a:hover { - text-decoration: underline; -} - -.contents a.qindexHL:visited { - color: #FFFFFF; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; -} - -a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -ul { - overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ -} - -#side-nav ul { - overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ -} - -#main-nav ul { - overflow: visible; /* reset ul rule for the navigation bar drop down lists */ -} - -.fragment { - text-align: left; - direction: ltr; - overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ - overflow-y: hidden; -} - -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; - font-family: monospace, fixed; - font-size: 105%; -} - -div.fragment { - padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ - margin: 4px 8px 4px 2px; - background-color: #FBFCFD; - border: 1px solid #C4CFE5; -} - -div.line { - font-family: monospace, fixed; - font-size: 13px; - min-height: 13px; - line-height: 1.0; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - text-indent: -53px; - padding-left: 53px; - padding-bottom: 0px; - margin: 0px; - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -div.line:after { - content:"\000A"; - white-space: pre; -} - -div.line.glow { - background-color: cyan; - box-shadow: 0 0 10px cyan; -} - - -span.lineno { - padding-right: 4px; - text-align: right; - border-right: 2px solid #0F0; - background-color: #E8E8E8; - white-space: pre; -} -span.lineno a { - background-color: #D8D8D8; -} - -span.lineno a:hover { - background-color: #C8C8C8; -} - -.lineno { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -div.ah, span.ah { - background-color: black; - font-weight: bold; - color: #FFFFFF; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); -} - -div.classindex ul { - list-style: none; - padding-left: 0; -} - -div.classindex span.ai { - display: inline-block; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background-color: white; - color: black; - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 12px; - margin-right: 8px; -} - -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; - white-space: nowrap; - vertical-align: top; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EEF1F7; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl, img.inline { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -blockquote { - background-color: #F7F8FB; - border-left: 2px solid #9CAFD4; - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; -} - -blockquote.DocNodeRTL { - border-left: 0; - border-right: 2px solid #9CAFD4; - margin: 0 4px 0 24px; - padding: 0 16px 0 12px; -} - -/* @end */ - -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A3B4D7; -} - -th.dirtab { - background: #EBEFF6; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #4A6AAA; -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.memberdecls td, .fieldtable tr { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -.memberdecls td.glow, .fieldtable tr.glow { - background-color: cyan; - box-shadow: 0 0 15px cyan; -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memSeparator { - border-bottom: 1px solid #DEE4F0; - line-height: 1px; - margin: 0px; - padding: 0px; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memItemRight, .memTemplItemRight { - width: 100%; -} - -.memTemplParams { - color: #4665A2; - white-space: nowrap; - font-size: 80%; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtitle { - padding: 8px; - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - margin-bottom: -1px; - background-image: url('nav_f.png'); - background-repeat: repeat-x; - background-color: #E2E8F2; - line-height: 1.25; - font-weight: 300; - float:left; -} - -.permalink -{ - font-size: 65%; - display: inline-block; - vertical-align: middle; -} - -.memtemplate { - font-size: 80%; - color: #4665A2; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.mempage { - width: 100%; -} - -.memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; - -webkit-transition: box-shadow 0.5s linear; - -moz-transition: box-shadow 0.5s linear; - -ms-transition: box-shadow 0.5s linear; - -o-transition: box-shadow 0.5s linear; - transition: box-shadow 0.5s linear; - display: table !important; - width: 100%; -} - -.memitem.glow { - box-shadow: 0 0 15px cyan; -} - -.memname { - font-weight: 400; - margin-left: 6px; -} - -.memname td { - vertical-align: bottom; -} - -.memproto, dl.reflist dt { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 0px 6px 0px; - color: #253555; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-color: #DFE5F1; - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 4px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 4px; - -} - -.overload { - font-family: "courier new",courier,monospace; - font-size: 65%; -} - -.memdoc, dl.reflist dd { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 10px 2px 10px; - background-color: #FBFCFD; - border-top-width: 0; - background-image:url('nav_g.png'); - background-repeat:repeat-x; - background-color: #FFFFFF; - /* opera specific markup */ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -dl.reflist dt { - padding: 5px; -} - -dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} -.paramname code { - line-height: 14px; -} - -.params, .retval, .exception, .tparams { - margin-left: 0px; - padding-left: 0px; -} - -.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype, .tparams .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir, .tparams .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; -} - -table.mlabels { - border-spacing: 0px; -} - -td.mlabels-left { - width: 100%; - padding: 0px; -} - -td.mlabels-right { - vertical-align: bottom; - padding: 0px; - white-space: nowrap; -} - -span.mlabels { - margin-left: 8px; -} - -span.mlabel { - background-color: #728DC1; - border-top:1px solid #5373B4; - border-left:1px solid #5373B4; - border-right:1px solid #C4CFE5; - border-bottom:1px solid #C4CFE5; - text-shadow: none; - color: white; - margin-right: 4px; - padding: 2px 3px; - border-radius: 3px; - font-size: 7pt; - white-space: nowrap; - vertical-align: middle; -} - - - -/* @end */ - -/* these are for tree view inside a (index) page */ - -div.directory { - margin: 10px 0px; - border-top: 1px solid #9CAFD4; - border-bottom: 1px solid #9CAFD4; - width: 100%; -} - -.directory table { - border-collapse:collapse; -} - -.directory td { - margin: 0px; - padding: 0px; - vertical-align: top; -} - -.directory td.entry { - white-space: nowrap; - padding-right: 6px; - padding-top: 3px; -} - -.directory td.entry a { - outline:none; -} - -.directory td.entry a img { - border: none; -} - -.directory td.desc { - width: 100%; - padding-left: 6px; - padding-right: 6px; - padding-top: 3px; - border-left: 1px solid rgba(0,0,0,0.05); -} - -.directory tr.even { - padding-left: 6px; - background-color: #F7F8FB; -} - -.directory img { - vertical-align: -30%; -} - -.directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt; -} - -.directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; - color: #3D578C; -} - -.arrow { - color: #9CAFD4; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - display: inline-block; - width: 16px; - height: 22px; -} - -.icon { - font-family: Arial, Helvetica; - font-weight: bold; - font-size: 12px; - height: 14px; - width: 16px; - display: inline-block; - background-color: #728DC1; - color: white; - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px; -} - -.icona { - width: 24px; - height: 22px; - display: inline-block; -} - -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('folderopen.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.iconfclosed { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('folderclosed.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('doc.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -table.directory { - font: 400 14px Roboto,sans-serif; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -address { - font-style: normal; - color: #2A3D61; -} - -table.doxtable caption { - caption-side: top; -} - -table.doxtable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -table.fieldtable { - /*width: 100%;*/ - margin-bottom: 10px; - border: 1px solid #A8B8D9; - border-spacing: 0px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); -} - -.fieldtable td, .fieldtable th { - padding: 3px 7px 2px; -} - -.fieldtable td.fieldtype, .fieldtable td.fieldname { - white-space: nowrap; - border-right: 1px solid #A8B8D9; - border-bottom: 1px solid #A8B8D9; - vertical-align: top; -} - -.fieldtable td.fieldname { - padding-top: 3px; -} - -.fieldtable td.fielddoc { - border-bottom: 1px solid #A8B8D9; - /*width: 100%;*/ -} - -.fieldtable td.fielddoc p:first-child { - margin-top: 0px; -} - -.fieldtable td.fielddoc p:last-child { - margin-bottom: 2px; -} - -.fieldtable tr:last-child td { - border-bottom: none; -} - -.fieldtable th { - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - font-size: 90%; - color: #253555; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; - font-weight: 400; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid #A8B8D9; -} - - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - background-position: 0 -5px; - height:30px; - line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#364D7C; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; - color: #283A5D; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; -} - -.navpath li.navelem a:hover -{ - color:#6884BD; -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#364D7C; - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -table.classindex -{ - margin: 10px; - white-space: nowrap; - margin-left: 3%; - margin-right: 3%; - width: 94%; - border: 0; - border-spacing: 0; - padding: 0; -} - -div.ingroups -{ - font-size: 8pt; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - margin: 0px; - border-bottom: 1px solid #C4CFE5; -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -.PageDocRTL-title div.headertitle { - text-align: right; - direction: rtl; -} - -dl { - padding: 0 0 0 0; -} - -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ -dl.section { - margin-left: 0px; - padding-left: 0px; -} - -dl.section.DocNodeRTL { - margin-right: 0px; - padding-right: 0px; -} - -dl.note { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #D0C000; -} - -dl.note.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #D0C000; -} - -dl.warning, dl.attention { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #FF0000; -} - -dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00D000; -} - -dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00D000; -} - -dl.deprecated { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #505050; -} - -dl.deprecated.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #505050; -} - -dl.todo { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00C0E0; -} - -dl.todo.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00C0E0; -} - -dl.test { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #3030E0; -} - -dl.test.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #3030E0; -} - -dl.bug { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #C08050; -} - -dl.bug.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #C08050; -} - -dl.section dd { - margin-bottom: 6px; -} - - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectalign -{ - vertical-align: middle; -} - -#projectname -{ - font: 300% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 2px 0px; -} - -#projectbrief -{ - font: 120% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font: 50% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #5373B4; -} - -.image -{ - text-align: center; -} - -.dotgraph -{ - text-align: center; -} - -.mscgraph -{ - text-align: center; -} - -.plantumlgraph -{ - text-align: center; -} - -.diagraph -{ - text-align: center; -} - -.caption -{ - font-weight: bold; -} - -div.zoom -{ - border: 1px solid #90A5CE; -} - -dl.citelist { - margin-bottom:50px; -} - -dl.citelist dt { - color:#334975; - float:left; - font-weight:bold; - margin-right:10px; - padding:5px; - text-align:right; - width:52px; -} - -dl.citelist dd { - margin:2px 0 2px 72px; - padding:5px 0; -} - -div.toc { - padding: 14px 25px; - background-color: #F4F6FA; - border: 1px solid #D8DFEE; - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 8px 10px 10px; - width: 200px; -} - -.PageDocRTL-title div.toc { - float: left !important; - text-align: right; -} - -div.toc li { - background: url("bdwn.png") no-repeat scroll 0 5px transparent; - font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; - margin-top: 5px; - padding-left: 10px; - padding-top: 2px; -} - -.PageDocRTL-title div.toc li { - background-position-x: right !important; - padding-left: 0 !important; - padding-right: 10px; -} - -div.toc h3 { - font: bold 12px/1.2 Arial,FreeSans,sans-serif; - color: #4665A2; - border-bottom: 0 none; - margin: 0; -} - -div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0px; -} - -div.toc li.level1 { - margin-left: 0px; -} - -div.toc li.level2 { - margin-left: 15px; -} - -div.toc li.level3 { - margin-left: 30px; -} - -div.toc li.level4 { - margin-left: 45px; -} - -span.emoji { - /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html - * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; - */ -} - -.PageDocRTL-title div.toc li.level1 { - margin-left: 0 !important; - margin-right: 0; -} - -.PageDocRTL-title div.toc li.level2 { - margin-left: 0 !important; - margin-right: 15px; -} - -.PageDocRTL-title div.toc li.level3 { - margin-left: 0 !important; - margin-right: 30px; -} - -.PageDocRTL-title div.toc li.level4 { - margin-left: 0 !important; - margin-right: 45px; -} - -.inherit_header { - font-weight: bold; - color: gray; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.inherit_header td { - padding: 6px 0px 2px 5px; -} - -.inherit { - display: none; -} - -tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px; -} - -/* tooltip related style info */ - -.ttc { - position: absolute; - display: none; -} - -#powerTip { - cursor: default; - white-space: nowrap; - background-color: white; - border: 1px solid gray; - border-radius: 4px 4px 4px 4px; - box-shadow: 1px 1px 7px gray; - display: none; - font-size: smaller; - max-width: 80%; - opacity: 0.9; - padding: 1ex 1em 1em; - position: absolute; - z-index: 2147483647; -} - -#powerTip div.ttdoc { - color: grey; - font-style: italic; -} - -#powerTip div.ttname a { - font-weight: bold; -} - -#powerTip div.ttname { - font-weight: bold; -} - -#powerTip div.ttdeci { - color: #006318; -} - -#powerTip div { - margin: 0px; - padding: 0px; - font: 12px/16px Roboto,sans-serif; -} - -#powerTip:before, #powerTip:after { - content: ""; - position: absolute; - margin: 0px; -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.s:after, #powerTip.s:before, -#powerTip.w:after, #powerTip.w:before, -#powerTip.e:after, #powerTip.e:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.nw:after, #powerTip.nw:before, -#powerTip.sw:after, #powerTip.sw:before { - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; -} - -#powerTip.n:after, #powerTip.s:after, -#powerTip.w:after, #powerTip.e:after, -#powerTip.nw:after, #powerTip.ne:after, -#powerTip.sw:after, #powerTip.se:after { - border-color: rgba(255, 255, 255, 0); -} - -#powerTip.n:before, #powerTip.s:before, -#powerTip.w:before, #powerTip.e:before, -#powerTip.nw:before, #powerTip.ne:before, -#powerTip.sw:before, #powerTip.se:before { - border-color: rgba(128, 128, 128, 0); -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.nw:after, #powerTip.nw:before { - top: 100%; -} - -#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: #FFFFFF; - border-width: 10px; - margin: 0px -10px; -} -#powerTip.n:before { - border-top-color: #808080; - border-width: 11px; - margin: 0px -11px; -} -#powerTip.n:after, #powerTip.n:before { - left: 50%; -} - -#powerTip.nw:after, #powerTip.nw:before { - right: 14px; -} - -#powerTip.ne:after, #powerTip.ne:before { - left: 14px; -} - -#powerTip.s:after, #powerTip.s:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.sw:after, #powerTip.sw:before { - bottom: 100%; -} - -#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: #FFFFFF; - border-width: 10px; - margin: 0px -10px; -} - -#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: #808080; - border-width: 11px; - margin: 0px -11px; -} - -#powerTip.s:after, #powerTip.s:before { - left: 50%; -} - -#powerTip.sw:after, #powerTip.sw:before { - right: 14px; -} - -#powerTip.se:after, #powerTip.se:before { - left: 14px; -} - -#powerTip.e:after, #powerTip.e:before { - left: 100%; -} -#powerTip.e:after { - border-left-color: #FFFFFF; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.e:before { - border-left-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -#powerTip.w:after, #powerTip.w:before { - right: 100%; -} -#powerTip.w:after { - border-right-color: #FFFFFF; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.w:before { - border-right-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -@media print -{ - #top { display: none; } - #side-nav { display: none; } - #nav-path { display: none; } - body { overflow:visible; } - h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } - .summary { display: none; } - .memitem { page-break-inside: avoid; } - #doc-content - { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } -} - -/* @group Markdown */ - -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.markdownTable tr { -} - -th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft, td.markdownTableBodyLeft { - text-align: left -} - -th.markdownTableHeadRight, td.markdownTableBodyRight { - text-align: right -} - -th.markdownTableHeadCenter, td.markdownTableBodyCenter { - text-align: center -} - -.DocNodeRTL { - text-align: right; - direction: rtl; -} - -.DocNodeLTR { - text-align: left; - direction: ltr; -} - -table.DocNodeRTL { - width: auto; - margin-right: 0; - margin-left: auto; -} - -table.DocNodeLTR { - width: auto; - margin-right: auto; - margin-left: 0; -} - -tt, code, kbd, samp -{ - display: inline-block; - direction:ltr; -} -/* @end */ - -u { - text-decoration: underline; -} - diff --git a/doxygen/html/doxygen.svg b/doxygen/html/doxygen.svg deleted file mode 100644 index d42dad5..0000000 --- a/doxygen/html/doxygen.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doxygen/html/dynsections.js b/doxygen/html/dynsections.js deleted file mode 100644 index 88f2c27..0000000 --- a/doxygen/html/dynsections.js +++ /dev/null @@ -1,128 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ -function toggleVisibility(linkObj) -{ - var base = $(linkObj).attr('id'); - var summary = $('#'+base+'-summary'); - var content = $('#'+base+'-content'); - var trigger = $('#'+base+'-trigger'); - var src=$(trigger).attr('src'); - if (content.is(':visible')===true) { - content.hide(); - summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); - } else { - content.show(); - summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } - return false; -} - -function updateStripes() -{ - $('table.directory tr'). - removeClass('even').filter(':visible:even').addClass('even'); -} - -function toggleLevel(level) -{ - $('table.directory tr').each(function() { - var l = this.id.split('_').length-1; - var i = $('#img'+this.id.substring(3)); - var a = $('#arr'+this.id.substring(3)); - if (l - - - - - - -OOKwiz: File List - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
File List
-
-
-
Here is a list of all documented files with brief descriptions:
-
[detail level 12]
- - - - - - - - - - - - - - - - - - - - - - - -
  src
 CLI.cpp
 CLI.h
 config.cpp
 config.h
 Device.cpp
 Device.h
 Meaning.cpp
 Meaning.h
 OOKwiz.cpp
 OOKwiz.h
 Pulsetrain.cpp
 Pulsetrain.h
 Radio.cpp
 Radio.h
 RawTimings.cpp
 RawTimings.h
 serial_output.c
 serial_output.h
 Settings.cpp
 Settings.h
 tools.cpp
 tools.h
-
-
- - - - diff --git a/doxygen/html/folderclosed.png b/doxygen/html/folderclosed.png deleted file mode 100644 index bb8ab35..0000000 Binary files a/doxygen/html/folderclosed.png and /dev/null differ diff --git a/doxygen/html/folderopen.png b/doxygen/html/folderopen.png deleted file mode 100644 index d6c7f67..0000000 Binary files a/doxygen/html/folderopen.png and /dev/null differ diff --git a/doxygen/html/functions.html b/doxygen/html/functions.html deleted file mode 100644 index 042ea9e..0000000 --- a/doxygen/html/functions.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - -OOKwiz: Class Members - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- a -

- - -

- b -

- - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- g -

- - -

- i -

- - -

- l -

- - -

- m -

- - -

- o -

- - -

- p -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- u -

- - -

- v -

- - -

- z -

-
- - - - diff --git a/doxygen/html/functions_func.html b/doxygen/html/functions_func.html deleted file mode 100644 index 49ea0a4..0000000 --- a/doxygen/html/functions_func.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - -OOKwiz: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- a -

- - -

- b -

- - -

- f -

- - -

- g -

- - -

- i -

- - -

- l -

- - -

- m -

- - -

- o -

- - -

- p -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- u -

- - -

- v -

- - -

- z -

-
- - - - diff --git a/doxygen/html/functions_vars.html b/doxygen/html/functions_vars.html deleted file mode 100644 index 27ebcb4..0000000 --- a/doxygen/html/functions_vars.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -OOKwiz: Class Members - Variables - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/doxygen/html/index.html b/doxygen/html/index.html deleted file mode 100644 index 94ecf85..0000000 --- a/doxygen/html/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - -OOKwiz: Main Page - - - - - - - - - -
-
- - - - - - -
-
OOKwiz -
-
on/off-keying for ESP32 and a variety of supported radio modules
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
OOKwiz Documentation
-
-
-
- - - - diff --git a/doxygen/html/jquery.js b/doxygen/html/jquery.js deleted file mode 100644 index 103c32d..0000000 --- a/doxygen/html/jquery.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element -},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** - * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler - * Licensed under MIT - * @author Ariel Flesler - * @version 2.1.2 - */ -;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 - * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doxygen/html/menudata.js b/doxygen/html/menudata.js deleted file mode 100644 index 3c222a2..0000000 --- a/doxygen/html/menudata.js +++ /dev/null @@ -1,67 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file -*/ -var menudata={children:[ -{text:"Main Page",url:"index.html"}, -{text:"Classes",url:"annotated.html",children:[ -{text:"Class List",url:"annotated.html"}, -{text:"Class Members",url:"functions.html",children:[ -{text:"All",url:"functions.html",children:[ -{text:"a",url:"functions.html#index_a"}, -{text:"b",url:"functions.html#index_b"}, -{text:"c",url:"functions.html#index_c"}, -{text:"d",url:"functions.html#index_d"}, -{text:"e",url:"functions.html#index_e"}, -{text:"f",url:"functions.html#index_f"}, -{text:"g",url:"functions.html#index_g"}, -{text:"i",url:"functions.html#index_i"}, -{text:"l",url:"functions.html#index_l"}, -{text:"m",url:"functions.html#index_m"}, -{text:"o",url:"functions.html#index_o"}, -{text:"p",url:"functions.html#index_p"}, -{text:"r",url:"functions.html#index_r"}, -{text:"s",url:"functions.html#index_s"}, -{text:"t",url:"functions.html#index_t"}, -{text:"u",url:"functions.html#index_u"}, -{text:"v",url:"functions.html#index_v"}, -{text:"z",url:"functions.html#index_z"}]}, -{text:"Functions",url:"functions_func.html",children:[ -{text:"a",url:"functions_func.html#index_a"}, -{text:"b",url:"functions_func.html#index_b"}, -{text:"f",url:"functions_func.html#index_f"}, -{text:"g",url:"functions_func.html#index_g"}, -{text:"i",url:"functions_func.html#index_i"}, -{text:"l",url:"functions_func.html#index_l"}, -{text:"m",url:"functions_func.html#index_m"}, -{text:"o",url:"functions_func.html#index_o"}, -{text:"p",url:"functions_func.html#index_p"}, -{text:"r",url:"functions_func.html#index_r"}, -{text:"s",url:"functions_func.html#index_s"}, -{text:"t",url:"functions_func.html#index_t"}, -{text:"u",url:"functions_func.html#index_u"}, -{text:"v",url:"functions_func.html#index_v"}, -{text:"z",url:"functions_func.html#index_z"}]}, -{text:"Variables",url:"functions_vars.html"}]}]}, -{text:"Files",url:"files.html",children:[ -{text:"File List",url:"files.html"}]}]} diff --git a/doxygen/html/nav_f.png b/doxygen/html/nav_f.png deleted file mode 100644 index 72a58a5..0000000 Binary files a/doxygen/html/nav_f.png and /dev/null differ diff --git a/doxygen/html/nav_g.png b/doxygen/html/nav_g.png deleted file mode 100644 index 2093a23..0000000 Binary files a/doxygen/html/nav_g.png and /dev/null differ diff --git a/doxygen/html/nav_h.png b/doxygen/html/nav_h.png deleted file mode 100644 index 33389b1..0000000 Binary files a/doxygen/html/nav_h.png and /dev/null differ diff --git a/doxygen/html/open.png b/doxygen/html/open.png deleted file mode 100644 index 30f75c7..0000000 Binary files a/doxygen/html/open.png and /dev/null differ diff --git a/doxygen/html/search/all_0.html b/doxygen/html/search/all_0.html deleted file mode 100644 index 1ec5b2d..0000000 --- a/doxygen/html/search/all_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_0.js b/doxygen/html/search/all_0.js deleted file mode 100644 index 100ee75..0000000 --- a/doxygen/html/search/all_0.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['addgap_0',['addGap',['../classMeaning.html#aa18b44e220925350d7a7ab20c8601471',1,'Meaning']]], - ['addppm_1',['addPPM',['../classMeaning.html#a738368fc7542ea1ff23c03fbe8d749c5',1,'Meaning']]], - ['addpulse_2',['addPulse',['../classMeaning.html#a8c375b49758d7eedb044f111101f13c4',1,'Meaning']]], - ['addpwm_3',['addPWM',['../classMeaning.html#a248463eb559569bdcdf8523b498a0b1e',1,'Meaning']]], - ['average_4',['average',['../structpulseBin.html#a12544c37eabcbe9ffd036d8164ca3055',1,'pulseBin']]] -]; diff --git a/doxygen/html/search/all_1.html b/doxygen/html/search/all_1.html deleted file mode 100644 index 9f80e90..0000000 --- a/doxygen/html/search/all_1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_1.js b/doxygen/html/search/all_1.js deleted file mode 100644 index dc37a6d..0000000 --- a/doxygen/html/search/all_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['binlist_5',['binList',['../classPulsetrain.html#a6bc7365d3096bf60eb469b63a5eca622',1,'Pulsetrain']]], - ['bins_6',['bins',['../classPulsetrain.html#a7ae1e45c9920ce2561a944f5ab6cdd77',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/all_10.html b/doxygen/html/search/all_10.html deleted file mode 100644 index 3bf1196..0000000 --- a/doxygen/html/search/all_10.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_10.js b/doxygen/html/search/all_10.js deleted file mode 100644 index 350ffe7..0000000 --- a/doxygen/html/search/all_10.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['validname_60',['validName',['../classSettings.html#ab9469d5d3c058412320b478cf662a103',1,'Settings']]], - ['visualizer_61',['visualizer',['../classPulsetrain.html#aefcd392c199947c4afcdd3c9de0ced3b',1,'Pulsetrain::visualizer()'],['../classPulsetrain.html#a44ca5bc980551ac7b4cb670e0224048b',1,'Pulsetrain::visualizer(int base)'],['../classRawTimings.html#abaedd23dec2455966aafbeb679575f68',1,'RawTimings::visualizer()'],['../classRawTimings.html#acc71a663684d673461ccbfda1c78011e',1,'RawTimings::visualizer(int base)']]] -]; diff --git a/doxygen/html/search/all_11.html b/doxygen/html/search/all_11.html deleted file mode 100644 index c9f79d2..0000000 --- a/doxygen/html/search/all_11.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_11.js b/doxygen/html/search/all_11.js deleted file mode 100644 index b09ced6..0000000 --- a/doxygen/html/search/all_11.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['zap_62',['zap',['../classSettings.html#a65f75ce8ff1ebba1245f99567924928d',1,'Settings::zap()'],['../classMeaning.html#a3b7af724b5c1ea315783452022a2897c',1,'Meaning::zap()'],['../classPulsetrain.html#a32f88d5064f8d52ed335aadfee36f958',1,'Pulsetrain::zap()'],['../classRawTimings.html#a6d22dd6da5edd26c7bf1b9467e16a8f1',1,'RawTimings::zap()']]] -]; diff --git a/doxygen/html/search/all_2.html b/doxygen/html/search/all_2.html deleted file mode 100644 index 02cfffc..0000000 --- a/doxygen/html/search/all_2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_2.js b/doxygen/html/search/all_2.js deleted file mode 100644 index ac3c062..0000000 --- a/doxygen/html/search/all_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['count_7',['count',['../structpulseBin.html#a4903dab9cf5565d26508a955645e8880',1,'pulseBin']]] -]; diff --git a/doxygen/html/search/all_3.html b/doxygen/html/search/all_3.html deleted file mode 100644 index 39767b8..0000000 --- a/doxygen/html/search/all_3.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_3.js b/doxygen/html/search/all_3.js deleted file mode 100644 index bef2bf8..0000000 --- a/doxygen/html/search/all_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['device_8',['Device',['../classDevice.html',1,'']]], - ['duration_9',['duration',['../classPulsetrain.html#a2e88fde3ab6db63a39c55026cdf1922a',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/all_4.html b/doxygen/html/search/all_4.html deleted file mode 100644 index fc40463..0000000 --- a/doxygen/html/search/all_4.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_4.js b/doxygen/html/search/all_4.js deleted file mode 100644 index 1e27dd1..0000000 --- a/doxygen/html/search/all_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['elements_10',['elements',['../classMeaning.html#a403c23abbe015ea1ebbcc49d136c561b',1,'Meaning']]] -]; diff --git a/doxygen/html/search/all_5.html b/doxygen/html/search/all_5.html deleted file mode 100644 index 9dd9344..0000000 --- a/doxygen/html/search/all_5.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_5.js b/doxygen/html/search/all_5.js deleted file mode 100644 index 16e1bfb..0000000 --- a/doxygen/html/search/all_5.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['fileexists_11',['fileExists',['../classSettings.html#a9c5eafb7a0c63a0c56cb82aa4fa7229f',1,'Settings']]], - ['first_5fat_12',['first_at',['../classPulsetrain.html#afab8af6fa68ec3e83a95cb3840f3c0a8',1,'Pulsetrain']]], - ['fromlist_13',['fromList',['../classSettings.html#a1690a74995e472be939f97ebe6411500',1,'Settings']]], - ['frompulsetrain_14',['fromPulsetrain',['../classMeaning.html#a0170b67144e3e7a157785c07bf1a245d',1,'Meaning::fromPulsetrain()'],['../classRawTimings.html#aaf2557983cae38cb469ac677c0f026eb',1,'RawTimings::fromPulsetrain()']]], - ['fromrawtimings_15',['fromRawTimings',['../classPulsetrain.html#af5ba87cbf7ee9bae864f70b0fa8b8062',1,'Pulsetrain']]], - ['fromstring_16',['fromString',['../classMeaning.html#a99a7817f62315ca4772ad8127ffba95a',1,'Meaning::fromString()'],['../classPulsetrain.html#a0297ffdae1f26ab35309cb0b7fba0d46',1,'Pulsetrain::fromString()'],['../classRawTimings.html#a3d4b1d20d45043e54465653b91f9eba2',1,'RawTimings::fromString()']]] -]; diff --git a/doxygen/html/search/all_6.html b/doxygen/html/search/all_6.html deleted file mode 100644 index f1e516d..0000000 --- a/doxygen/html/search/all_6.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_6.js b/doxygen/html/search/all_6.js deleted file mode 100644 index de84ac3..0000000 --- a/doxygen/html/search/all_6.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['gap_17',['gap',['../classMeaning.html#aedf73a2aa5be87d46327965ac50d56f1',1,'Meaning::gap()'],['../classPulsetrain.html#a419dc73eee693428324ad98684ee1b94',1,'Pulsetrain::gap()']]], - ['get_18',['get',['../classSettings.html#a4478403a3d9d01dac02bec3233987edb',1,'Settings::get(const String &name, String &value)'],['../classSettings.html#a43a1ce159ee74a200d5731118f54d80e',1,'Settings::get(const String &name, float &value)'],['../classSettings.html#a45fb11fee5df7c2703f23da7a3f10832',1,'Settings::get(const String &name, int &value)'],['../classSettings.html#a17f77894d972596de90a8f61aa3302c3',1,'Settings::get(const String &name, long &value)']]], - ['getfloat_19',['getFloat',['../classSettings.html#a4f29f42544eb02f5923c09a099b977de',1,'Settings']]], - ['getint_20',['getInt',['../classSettings.html#a0fbbf4882fb29d8745806b24f04c27f1',1,'Settings']]], - ['getlong_21',['getLong',['../classSettings.html#a61f86d33b643723c0bf6bed0ae4ab4e2',1,'Settings']]], - ['getstring_22',['getString',['../classSettings.html#a4a56a980c73ba58c7b32b9df3dac8aec',1,'Settings']]] -]; diff --git a/doxygen/html/search/all_7.html b/doxygen/html/search/all_7.html deleted file mode 100644 index 8ddbf6c..0000000 --- a/doxygen/html/search/all_7.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_7.js b/doxygen/html/search/all_7.js deleted file mode 100644 index c96702f..0000000 --- a/doxygen/html/search/all_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['intervals_23',['intervals',['../classRawTimings.html#aa11ce3e8127c20c97cf196b86b4caff7',1,'RawTimings']]], - ['isset_24',['isSet',['../classSettings.html#acc958f3787da63d0f50d1f3629436cf2',1,'Settings']]] -]; diff --git a/doxygen/html/search/all_8.html b/doxygen/html/search/all_8.html deleted file mode 100644 index 83c55ae..0000000 --- a/doxygen/html/search/all_8.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_8.js b/doxygen/html/search/all_8.js deleted file mode 100644 index 1e5d3ff..0000000 --- a/doxygen/html/search/all_8.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['last_5fat_25',['last_at',['../classPulsetrain.html#a22b0e19734e61765bcff78444e760785',1,'Pulsetrain']]], - ['list_26',['list',['../classSettings.html#a56df3b2d0f32ab04f4159f3124329830',1,'Settings']]], - ['load_27',['load',['../classSettings.html#a41d05becd34732ca051798d1421e5561',1,'Settings']]], - ['loop_28',['loop',['../classOOKwiz.html#a9df8d82c503e5085895123efcd0521da',1,'OOKwiz']]], - ['ls_29',['ls',['../classSettings.html#a1ab2437e8b369a66edc4c3cbbc3354c7',1,'Settings']]] -]; diff --git a/doxygen/html/search/all_9.html b/doxygen/html/search/all_9.html deleted file mode 100644 index 1e263c1..0000000 --- a/doxygen/html/search/all_9.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_9.js b/doxygen/html/search/all_9.js deleted file mode 100644 index 8dcbd95..0000000 --- a/doxygen/html/search/all_9.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['max_30',['max',['../structpulseBin.html#aa1de1a33047653624423f9afad97b108',1,'pulseBin']]], - ['maybe_31',['maybe',['../classMeaning.html#a9609c96a21b7435f55f2d883056eabf8',1,'Meaning::maybe()'],['../classPulsetrain.html#aaa4c2407873b533c771a1b5ba28f2077',1,'Pulsetrain::maybe()'],['../classRawTimings.html#a44d4a467e7e18ab3c60ea160fd693ce4',1,'RawTimings::maybe()']]], - ['meaning_32',['Meaning',['../classMeaning.html',1,'']]], - ['meaningelement_33',['MeaningElement',['../structMeaningElement.html',1,'']]], - ['min_34',['min',['../structpulseBin.html#a6a3e3bfa55b591db3517a544651b2136',1,'pulseBin']]] -]; diff --git a/doxygen/html/search/all_a.html b/doxygen/html/search/all_a.html deleted file mode 100644 index 3a6cac1..0000000 --- a/doxygen/html/search/all_a.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_a.js b/doxygen/html/search/all_a.js deleted file mode 100644 index cac2a46..0000000 --- a/doxygen/html/search/all_a.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['onreceive_35',['onReceive',['../classOOKwiz.html#af3781e60b394207ee592268ee711badb',1,'OOKwiz']]], - ['ookwiz_36',['OOKwiz',['../classOOKwiz.html',1,'']]], - ['operator_20bool_37',['operator bool',['../classMeaning.html#a8352b4d2681a5c37806f88c143729471',1,'Meaning::operator bool()'],['../classPulsetrain.html#a188cc195c879f5089db46a3bbe132b58',1,'Pulsetrain::operator bool()'],['../classRawTimings.html#a0d8dcc2f5e9182b8e22982d47227fbfb',1,'RawTimings::operator bool()']]] -]; diff --git a/doxygen/html/search/all_b.html b/doxygen/html/search/all_b.html deleted file mode 100644 index 130deb4..0000000 --- a/doxygen/html/search/all_b.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_b.js b/doxygen/html/search/all_b.js deleted file mode 100644 index 62d1eb5..0000000 --- a/doxygen/html/search/all_b.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['parseppm_38',['parsePPM',['../classMeaning.html#afbdbf229c29af852c75b6ee983c4f398',1,'Meaning']]], - ['parsepwm_39',['parsePWM',['../classMeaning.html#a3bed74584d1a9bfb297216c2f502a8b3',1,'Meaning']]], - ['pulsebin_40',['pulseBin',['../structpulseBin.html',1,'']]], - ['pulsetrain_41',['Pulsetrain',['../classPulsetrain.html',1,'']]] -]; diff --git a/doxygen/html/search/all_c.html b/doxygen/html/search/all_c.html deleted file mode 100644 index 3dd5af0..0000000 --- a/doxygen/html/search/all_c.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_c.js b/doxygen/html/search/all_c.js deleted file mode 100644 index 95c547e..0000000 --- a/doxygen/html/search/all_c.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['radio_42',['Radio',['../classRadio.html',1,'']]], - ['rawtimings_43',['RawTimings',['../classRawTimings.html',1,'']]], - ['receive_44',['receive',['../classOOKwiz.html#aee9333712dd3338bb21978c5fc542592',1,'OOKwiz']]], - ['repeats_45',['repeats',['../classMeaning.html#a325d097999f58331611b179d38fdb0d6',1,'Meaning::repeats()'],['../classPulsetrain.html#adbd908c37fcfe1215fdf72f0e238aa04',1,'Pulsetrain::repeats()']]], - ['rm_46',['rm',['../classSettings.html#a628ec51c779d0b3bba808182a74c0dec',1,'Settings']]] -]; diff --git a/doxygen/html/search/all_d.html b/doxygen/html/search/all_d.html deleted file mode 100644 index af7f2f0..0000000 --- a/doxygen/html/search/all_d.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_d.js b/doxygen/html/search/all_d.js deleted file mode 100644 index 4972e66..0000000 --- a/doxygen/html/search/all_d.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['sameas_47',['sameAs',['../classPulsetrain.html#ac300e67b167e0d0fa89e2187dc9daf86',1,'Pulsetrain']]], - ['save_48',['save',['../classSettings.html#a76af4eb6ee6c473cbb30ea96f1777fc1',1,'Settings']]], - ['set_49',['set',['../classSettings.html#ae1a8a484348337b1412c27bd0efc5eb5',1,'Settings']]], - ['settings_50',['Settings',['../classSettings.html',1,'']]], - ['setup_51',['setup',['../classOOKwiz.html#aeb6ce0192e77cd8e3f24f1aa58ff7b65',1,'OOKwiz']]], - ['simulate_52',['simulate',['../classOOKwiz.html#aac81df5dd1203d47ec6b10c6da9e9d68',1,'OOKwiz::simulate(String &str)'],['../classOOKwiz.html#a7d8b8f98a751798ade1b200b0d9faba6',1,'OOKwiz::simulate(RawTimings &raw)'],['../classOOKwiz.html#abf1ae45911195adc5b58c3c4d6107050',1,'OOKwiz::simulate(Pulsetrain &train)'],['../classOOKwiz.html#ab2d96cd1c398b0bb730c88698a74b2f1',1,'OOKwiz::simulate(Meaning &meaning)']]], - ['standby_53',['standby',['../classOOKwiz.html#a0f91668e73cf87f0c150ec230443adb0',1,'OOKwiz']]], - ['summary_54',['summary',['../classPulsetrain.html#acc6284eb8394052923e93072e0e52295',1,'Pulsetrain']]], - ['suspected_5fincomplete_55',['suspected_incomplete',['../classMeaning.html#a1909947a4fbb189178f660a8dbca3b79',1,'Meaning']]] -]; diff --git a/doxygen/html/search/all_e.html b/doxygen/html/search/all_e.html deleted file mode 100644 index e25df42..0000000 --- a/doxygen/html/search/all_e.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_e.js b/doxygen/html/search/all_e.js deleted file mode 100644 index f59f5a7..0000000 --- a/doxygen/html/search/all_e.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['tostring_56',['toString',['../classMeaning.html#a78876f76f9972bd36d004c560cfba93b',1,'Meaning::toString()'],['../classPulsetrain.html#a7977bd9f2a586a753220b70205d2eece',1,'Pulsetrain::toString()'],['../classRawTimings.html#a288f3c992411bc2a3c9437796cbf5a80',1,'RawTimings::toString()']]], - ['transitions_57',['transitions',['../classPulsetrain.html#af45b392a9a4d92c5e97917bea95a75dd',1,'Pulsetrain']]], - ['transmit_58',['transmit',['../classOOKwiz.html#aa2c44165b7223a2089afe3c8ddb5f520',1,'OOKwiz::transmit(String &str)'],['../classOOKwiz.html#a73fbcc58c795d8d2a63fe80494fa6ec1',1,'OOKwiz::transmit(RawTimings &raw)'],['../classOOKwiz.html#abdecfa9b0ac92959c135fc43c1616b05',1,'OOKwiz::transmit(Pulsetrain &train)'],['../classOOKwiz.html#a8dda306b4e5513723f8171cb5587ec15',1,'OOKwiz::transmit(Meaning &meaning)']]] -]; diff --git a/doxygen/html/search/all_f.html b/doxygen/html/search/all_f.html deleted file mode 100644 index b23da6c..0000000 --- a/doxygen/html/search/all_f.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/all_f.js b/doxygen/html/search/all_f.js deleted file mode 100644 index 96fb793..0000000 --- a/doxygen/html/search/all_f.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['unset_59',['unset',['../classSettings.html#a501274ebe4f5033ffc48a26857d59490',1,'Settings']]] -]; diff --git a/doxygen/html/search/classes_0.html b/doxygen/html/search/classes_0.html deleted file mode 100644 index af8159e..0000000 --- a/doxygen/html/search/classes_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/classes_0.js b/doxygen/html/search/classes_0.js deleted file mode 100644 index 921e11b..0000000 --- a/doxygen/html/search/classes_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['device_63',['Device',['../classDevice.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_1.html b/doxygen/html/search/classes_1.html deleted file mode 100644 index 576e916..0000000 --- a/doxygen/html/search/classes_1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/classes_1.js b/doxygen/html/search/classes_1.js deleted file mode 100644 index 381c4e3..0000000 --- a/doxygen/html/search/classes_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['meaning_64',['Meaning',['../classMeaning.html',1,'']]], - ['meaningelement_65',['MeaningElement',['../structMeaningElement.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_2.html b/doxygen/html/search/classes_2.html deleted file mode 100644 index 956405e..0000000 --- a/doxygen/html/search/classes_2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/classes_2.js b/doxygen/html/search/classes_2.js deleted file mode 100644 index 6765f85..0000000 --- a/doxygen/html/search/classes_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['ookwiz_66',['OOKwiz',['../classOOKwiz.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_3.html b/doxygen/html/search/classes_3.html deleted file mode 100644 index d33343b..0000000 --- a/doxygen/html/search/classes_3.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/classes_3.js b/doxygen/html/search/classes_3.js deleted file mode 100644 index 3edc20b..0000000 --- a/doxygen/html/search/classes_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['pulsebin_67',['pulseBin',['../structpulseBin.html',1,'']]], - ['pulsetrain_68',['Pulsetrain',['../classPulsetrain.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_4.html b/doxygen/html/search/classes_4.html deleted file mode 100644 index 8430b07..0000000 --- a/doxygen/html/search/classes_4.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/classes_4.js b/doxygen/html/search/classes_4.js deleted file mode 100644 index 937aa18..0000000 --- a/doxygen/html/search/classes_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['radio_69',['Radio',['../classRadio.html',1,'']]], - ['rawtimings_70',['RawTimings',['../classRawTimings.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_5.html b/doxygen/html/search/classes_5.html deleted file mode 100644 index c2f1b76..0000000 --- a/doxygen/html/search/classes_5.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/classes_5.js b/doxygen/html/search/classes_5.js deleted file mode 100644 index 85659f2..0000000 --- a/doxygen/html/search/classes_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['settings_71',['Settings',['../classSettings.html',1,'']]] -]; diff --git a/doxygen/html/search/close.svg b/doxygen/html/search/close.svg deleted file mode 100644 index a933eea..0000000 --- a/doxygen/html/search/close.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - diff --git a/doxygen/html/search/functions_0.html b/doxygen/html/search/functions_0.html deleted file mode 100644 index eb4c501..0000000 --- a/doxygen/html/search/functions_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_0.js b/doxygen/html/search/functions_0.js deleted file mode 100644 index c126960..0000000 --- a/doxygen/html/search/functions_0.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['addgap_72',['addGap',['../classMeaning.html#aa18b44e220925350d7a7ab20c8601471',1,'Meaning']]], - ['addppm_73',['addPPM',['../classMeaning.html#a738368fc7542ea1ff23c03fbe8d749c5',1,'Meaning']]], - ['addpulse_74',['addPulse',['../classMeaning.html#a8c375b49758d7eedb044f111101f13c4',1,'Meaning']]], - ['addpwm_75',['addPWM',['../classMeaning.html#a248463eb559569bdcdf8523b498a0b1e',1,'Meaning']]] -]; diff --git a/doxygen/html/search/functions_1.html b/doxygen/html/search/functions_1.html deleted file mode 100644 index ef4088b..0000000 --- a/doxygen/html/search/functions_1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_1.js b/doxygen/html/search/functions_1.js deleted file mode 100644 index c59b933..0000000 --- a/doxygen/html/search/functions_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['binlist_76',['binList',['../classPulsetrain.html#a6bc7365d3096bf60eb469b63a5eca622',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/functions_2.html b/doxygen/html/search/functions_2.html deleted file mode 100644 index ca5aa10..0000000 --- a/doxygen/html/search/functions_2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_2.js b/doxygen/html/search/functions_2.js deleted file mode 100644 index b79a4f4..0000000 --- a/doxygen/html/search/functions_2.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['fileexists_77',['fileExists',['../classSettings.html#a9c5eafb7a0c63a0c56cb82aa4fa7229f',1,'Settings']]], - ['fromlist_78',['fromList',['../classSettings.html#a1690a74995e472be939f97ebe6411500',1,'Settings']]], - ['frompulsetrain_79',['fromPulsetrain',['../classMeaning.html#a0170b67144e3e7a157785c07bf1a245d',1,'Meaning::fromPulsetrain()'],['../classRawTimings.html#aaf2557983cae38cb469ac677c0f026eb',1,'RawTimings::fromPulsetrain()']]], - ['fromrawtimings_80',['fromRawTimings',['../classPulsetrain.html#af5ba87cbf7ee9bae864f70b0fa8b8062',1,'Pulsetrain']]], - ['fromstring_81',['fromString',['../classMeaning.html#a99a7817f62315ca4772ad8127ffba95a',1,'Meaning::fromString()'],['../classPulsetrain.html#a0297ffdae1f26ab35309cb0b7fba0d46',1,'Pulsetrain::fromString()'],['../classRawTimings.html#a3d4b1d20d45043e54465653b91f9eba2',1,'RawTimings::fromString()']]] -]; diff --git a/doxygen/html/search/functions_3.html b/doxygen/html/search/functions_3.html deleted file mode 100644 index d79f55b..0000000 --- a/doxygen/html/search/functions_3.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_3.js b/doxygen/html/search/functions_3.js deleted file mode 100644 index 40d8069..0000000 --- a/doxygen/html/search/functions_3.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['get_82',['get',['../classSettings.html#a4478403a3d9d01dac02bec3233987edb',1,'Settings::get(const String &name, String &value)'],['../classSettings.html#a43a1ce159ee74a200d5731118f54d80e',1,'Settings::get(const String &name, float &value)'],['../classSettings.html#a45fb11fee5df7c2703f23da7a3f10832',1,'Settings::get(const String &name, int &value)'],['../classSettings.html#a17f77894d972596de90a8f61aa3302c3',1,'Settings::get(const String &name, long &value)']]], - ['getfloat_83',['getFloat',['../classSettings.html#a4f29f42544eb02f5923c09a099b977de',1,'Settings']]], - ['getint_84',['getInt',['../classSettings.html#a0fbbf4882fb29d8745806b24f04c27f1',1,'Settings']]], - ['getlong_85',['getLong',['../classSettings.html#a61f86d33b643723c0bf6bed0ae4ab4e2',1,'Settings']]], - ['getstring_86',['getString',['../classSettings.html#a4a56a980c73ba58c7b32b9df3dac8aec',1,'Settings']]] -]; diff --git a/doxygen/html/search/functions_4.html b/doxygen/html/search/functions_4.html deleted file mode 100644 index 1657cad..0000000 --- a/doxygen/html/search/functions_4.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_4.js b/doxygen/html/search/functions_4.js deleted file mode 100644 index 8f46485..0000000 --- a/doxygen/html/search/functions_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['isset_87',['isSet',['../classSettings.html#acc958f3787da63d0f50d1f3629436cf2',1,'Settings']]] -]; diff --git a/doxygen/html/search/functions_5.html b/doxygen/html/search/functions_5.html deleted file mode 100644 index 9301d6b..0000000 --- a/doxygen/html/search/functions_5.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_5.js b/doxygen/html/search/functions_5.js deleted file mode 100644 index 31ac5e2..0000000 --- a/doxygen/html/search/functions_5.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['list_88',['list',['../classSettings.html#a56df3b2d0f32ab04f4159f3124329830',1,'Settings']]], - ['load_89',['load',['../classSettings.html#a41d05becd34732ca051798d1421e5561',1,'Settings']]], - ['loop_90',['loop',['../classOOKwiz.html#a9df8d82c503e5085895123efcd0521da',1,'OOKwiz']]], - ['ls_91',['ls',['../classSettings.html#a1ab2437e8b369a66edc4c3cbbc3354c7',1,'Settings']]] -]; diff --git a/doxygen/html/search/functions_6.html b/doxygen/html/search/functions_6.html deleted file mode 100644 index 9c4f5fc..0000000 --- a/doxygen/html/search/functions_6.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_6.js b/doxygen/html/search/functions_6.js deleted file mode 100644 index b4b9e17..0000000 --- a/doxygen/html/search/functions_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['maybe_92',['maybe',['../classMeaning.html#a9609c96a21b7435f55f2d883056eabf8',1,'Meaning::maybe()'],['../classPulsetrain.html#aaa4c2407873b533c771a1b5ba28f2077',1,'Pulsetrain::maybe()'],['../classRawTimings.html#a44d4a467e7e18ab3c60ea160fd693ce4',1,'RawTimings::maybe()']]] -]; diff --git a/doxygen/html/search/functions_7.html b/doxygen/html/search/functions_7.html deleted file mode 100644 index 46b5c0f..0000000 --- a/doxygen/html/search/functions_7.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_7.js b/doxygen/html/search/functions_7.js deleted file mode 100644 index 4519494..0000000 --- a/doxygen/html/search/functions_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['onreceive_93',['onReceive',['../classOOKwiz.html#af3781e60b394207ee592268ee711badb',1,'OOKwiz']]], - ['operator_20bool_94',['operator bool',['../classMeaning.html#a8352b4d2681a5c37806f88c143729471',1,'Meaning::operator bool()'],['../classPulsetrain.html#a188cc195c879f5089db46a3bbe132b58',1,'Pulsetrain::operator bool()'],['../classRawTimings.html#a0d8dcc2f5e9182b8e22982d47227fbfb',1,'RawTimings::operator bool()']]] -]; diff --git a/doxygen/html/search/functions_8.html b/doxygen/html/search/functions_8.html deleted file mode 100644 index 31a1d95..0000000 --- a/doxygen/html/search/functions_8.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_8.js b/doxygen/html/search/functions_8.js deleted file mode 100644 index f151a6b..0000000 --- a/doxygen/html/search/functions_8.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['parseppm_95',['parsePPM',['../classMeaning.html#afbdbf229c29af852c75b6ee983c4f398',1,'Meaning']]], - ['parsepwm_96',['parsePWM',['../classMeaning.html#a3bed74584d1a9bfb297216c2f502a8b3',1,'Meaning']]] -]; diff --git a/doxygen/html/search/functions_9.html b/doxygen/html/search/functions_9.html deleted file mode 100644 index 9a8e429..0000000 --- a/doxygen/html/search/functions_9.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_9.js b/doxygen/html/search/functions_9.js deleted file mode 100644 index a8422fc..0000000 --- a/doxygen/html/search/functions_9.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['receive_97',['receive',['../classOOKwiz.html#aee9333712dd3338bb21978c5fc542592',1,'OOKwiz']]], - ['rm_98',['rm',['../classSettings.html#a628ec51c779d0b3bba808182a74c0dec',1,'Settings']]] -]; diff --git a/doxygen/html/search/functions_a.html b/doxygen/html/search/functions_a.html deleted file mode 100644 index 5ecc152..0000000 --- a/doxygen/html/search/functions_a.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_a.js b/doxygen/html/search/functions_a.js deleted file mode 100644 index b52d07a..0000000 --- a/doxygen/html/search/functions_a.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['sameas_99',['sameAs',['../classPulsetrain.html#ac300e67b167e0d0fa89e2187dc9daf86',1,'Pulsetrain']]], - ['save_100',['save',['../classSettings.html#a76af4eb6ee6c473cbb30ea96f1777fc1',1,'Settings']]], - ['set_101',['set',['../classSettings.html#ae1a8a484348337b1412c27bd0efc5eb5',1,'Settings']]], - ['setup_102',['setup',['../classOOKwiz.html#aeb6ce0192e77cd8e3f24f1aa58ff7b65',1,'OOKwiz']]], - ['simulate_103',['simulate',['../classOOKwiz.html#aac81df5dd1203d47ec6b10c6da9e9d68',1,'OOKwiz::simulate(String &str)'],['../classOOKwiz.html#a7d8b8f98a751798ade1b200b0d9faba6',1,'OOKwiz::simulate(RawTimings &raw)'],['../classOOKwiz.html#abf1ae45911195adc5b58c3c4d6107050',1,'OOKwiz::simulate(Pulsetrain &train)'],['../classOOKwiz.html#ab2d96cd1c398b0bb730c88698a74b2f1',1,'OOKwiz::simulate(Meaning &meaning)']]], - ['standby_104',['standby',['../classOOKwiz.html#a0f91668e73cf87f0c150ec230443adb0',1,'OOKwiz']]], - ['summary_105',['summary',['../classPulsetrain.html#acc6284eb8394052923e93072e0e52295',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/functions_b.html b/doxygen/html/search/functions_b.html deleted file mode 100644 index e301fed..0000000 --- a/doxygen/html/search/functions_b.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_b.js b/doxygen/html/search/functions_b.js deleted file mode 100644 index 8afde19..0000000 --- a/doxygen/html/search/functions_b.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['tostring_106',['toString',['../classMeaning.html#a78876f76f9972bd36d004c560cfba93b',1,'Meaning::toString()'],['../classPulsetrain.html#a7977bd9f2a586a753220b70205d2eece',1,'Pulsetrain::toString()'],['../classRawTimings.html#a288f3c992411bc2a3c9437796cbf5a80',1,'RawTimings::toString()']]], - ['transmit_107',['transmit',['../classOOKwiz.html#aa2c44165b7223a2089afe3c8ddb5f520',1,'OOKwiz::transmit(String &str)'],['../classOOKwiz.html#a73fbcc58c795d8d2a63fe80494fa6ec1',1,'OOKwiz::transmit(RawTimings &raw)'],['../classOOKwiz.html#abdecfa9b0ac92959c135fc43c1616b05',1,'OOKwiz::transmit(Pulsetrain &train)'],['../classOOKwiz.html#a8dda306b4e5513723f8171cb5587ec15',1,'OOKwiz::transmit(Meaning &meaning)']]] -]; diff --git a/doxygen/html/search/functions_c.html b/doxygen/html/search/functions_c.html deleted file mode 100644 index c4f3268..0000000 --- a/doxygen/html/search/functions_c.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_c.js b/doxygen/html/search/functions_c.js deleted file mode 100644 index bac6ffa..0000000 --- a/doxygen/html/search/functions_c.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['unset_108',['unset',['../classSettings.html#a501274ebe4f5033ffc48a26857d59490',1,'Settings']]] -]; diff --git a/doxygen/html/search/functions_d.html b/doxygen/html/search/functions_d.html deleted file mode 100644 index 7a1ed06..0000000 --- a/doxygen/html/search/functions_d.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_d.js b/doxygen/html/search/functions_d.js deleted file mode 100644 index 2404db4..0000000 --- a/doxygen/html/search/functions_d.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['validname_109',['validName',['../classSettings.html#ab9469d5d3c058412320b478cf662a103',1,'Settings']]], - ['visualizer_110',['visualizer',['../classPulsetrain.html#aefcd392c199947c4afcdd3c9de0ced3b',1,'Pulsetrain::visualizer()'],['../classPulsetrain.html#a44ca5bc980551ac7b4cb670e0224048b',1,'Pulsetrain::visualizer(int base)'],['../classRawTimings.html#abaedd23dec2455966aafbeb679575f68',1,'RawTimings::visualizer()'],['../classRawTimings.html#acc71a663684d673461ccbfda1c78011e',1,'RawTimings::visualizer(int base)']]] -]; diff --git a/doxygen/html/search/functions_e.html b/doxygen/html/search/functions_e.html deleted file mode 100644 index 22d2a6b..0000000 --- a/doxygen/html/search/functions_e.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/doxygen/html/search/functions_e.js b/doxygen/html/search/functions_e.js deleted file mode 100644 index 3482563..0000000 --- a/doxygen/html/search/functions_e.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['zap_111',['zap',['../classSettings.html#a65f75ce8ff1ebba1245f99567924928d',1,'Settings::zap()'],['../classMeaning.html#a3b7af724b5c1ea315783452022a2897c',1,'Meaning::zap()'],['../classPulsetrain.html#a32f88d5064f8d52ed335aadfee36f958',1,'Pulsetrain::zap()'],['../classRawTimings.html#a6d22dd6da5edd26c7bf1b9467e16a8f1',1,'RawTimings::zap()']]] -]; diff --git a/doxygen/html/search/mag_sel.svg b/doxygen/html/search/mag_sel.svg deleted file mode 100644 index 03626f6..0000000 --- a/doxygen/html/search/mag_sel.svg +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/doxygen/html/search/nomatches.html b/doxygen/html/search/nomatches.html deleted file mode 100644 index 2b9360b..0000000 --- a/doxygen/html/search/nomatches.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - -
-
No Matches
-
- - diff --git a/doxygen/html/search/search.css b/doxygen/html/search/search.css deleted file mode 100644 index 9074198..0000000 --- a/doxygen/html/search/search.css +++ /dev/null @@ -1,257 +0,0 @@ -/*---------------- Search Box */ - -#MSearchBox { - white-space : nowrap; - background: white; - border-radius: 0.65em; - box-shadow: inset 0.5px 0.5px 3px 0px #555; - z-index: 102; -} - -#MSearchBox .left { - display: inline-block; - vertical-align: middle; - height: 1.4em; -} - -#MSearchSelect { - display: inline-block; - vertical-align: middle; - height: 1.4em; - padding: 0 0 0 0.3em; - margin: 0; -} - -#MSearchField { - display: inline-block; - vertical-align: middle; - width: 7.5em; - height: 1.1em; - margin: 0 0.15em; - padding: 0; - line-height: 1em; - border:none; - color: #909090; - outline: none; - font-family: Arial, Verdana, sans-serif; - -webkit-border-radius: 0px; - border-radius: 0px; - background: none; -} - - -#MSearchBox .right { - display: inline-block; - vertical-align: middle; - width: 1.4em; - height: 1.4em; -} - -#MSearchClose { - display: none; - font-size: inherit; - background : none; - border: none; - margin: 0; - padding: 0; - outline: none; - -} - -#MSearchCloseImg { - height: 1.4em; - padding: 0.3em; - margin: 0; -} - -.MSearchBoxActive #MSearchField { - color: #000000; -} - -#main-menu > li:last-child { - /* This
  • object is the parent of the search bar */ - display: flex; - justify-content: center; - align-items: center; - height: 36px; - margin-right: 1em; -} - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #90A5CE; - background-color: #F9FAFC; - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -.SelectItem { - font: 8pt Arial, Verdana, sans-serif; - padding-left: 2px; - padding-right: 12px; - border: 0px; -} - -span.SelectionMark { - margin-right: 4px; - font-family: monospace; - outline-style: none; - text-decoration: none; -} - -a.SelectItem { - display: block; - outline-style: none; - color: #000000; - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} - -a.SelectItem:focus, -a.SelectItem:active { - color: #000000; - outline-style: none; - text-decoration: none; -} - -a.SelectItem:hover { - color: #FFFFFF; - background-color: #3D578C; - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - width: 60ex; - height: 15em; -} - -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000; - background-color: #EEF1F7; - z-index:10000; -} - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; - padding-bottom: 15px; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} - -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} - -body.SRPage { - margin: 5px 2px; -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} - -.SRPage .SRChildren { - display: none; -} - -.SRSymbol { - font-weight: bold; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -span.SRScope { - padding-left: 4px; - font-family: Arial, Verdana, sans-serif; -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; - font-family: Arial, Verdana, sans-serif; -} - -.SRResult { - display: none; -} - -div.searchresults { - margin-left: 10px; - margin-right: 10px; -} - -/*---------------- External search page results */ - -.searchresult { - background-color: #F0F3F8; -} - -.pages b { - color: white; - padding: 5px 5px 3px 5px; - background-image: url("../tab_a.png"); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; -} - -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none; -} - -.hl { - font-weight: bold; -} - -#searchresults { - margin-bottom: 20px; -} - -.searchpages { - margin-top: 10px; -} - diff --git a/doxygen/html/search/search.js b/doxygen/html/search/search.js deleted file mode 100644 index fb226f7..0000000 --- a/doxygen/html/search/search.js +++ /dev/null @@ -1,816 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ -function convertToId(search) -{ - var result = ''; - for (i=0;i do a search - { - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() - { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() - { - this.keyTimeout = 0; - - // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - var code = searchValue.toLowerCase().charCodeAt(0); - var idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair - { - idxChar = searchValue.substr(0, 2); - } - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) - { - var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else // nothing available for this search term - { - resultsPage = this.resultsPath + '/nomatches' + this.extension; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - } - - window.frames.MSearchResults.location = resultsPageWithSearch; - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (domPopupSearchResultsWindow.style.display!='block') - { - var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline-block'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } - } - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) - { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { - this.DOMSearchBox().className = 'MSearchBoxActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == this.searchLabel) // clear "Search" term upon entry - { - searchField.value = ''; - this.searchActive = true; - } - } - else if (!isActive) // directly remove the panel - { - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.DOMSearchField().value = this.searchLabel; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') - { - return element; - } - - if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) - { - element = element.firstChild; - } - else if (element.nextSibling) - { - element = element.nextSibling; - } - else - { - do - { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; - } - else - { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; - } - } - } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - parent.document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } -} - -function setKeyActions(elem,action) -{ - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); -} - -function setClassAttr(elem,attr) -{ - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); -} - -function createResults() -{ - var results = document.getElementById("SRResults"); - for (var e=0; e - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_0.js b/doxygen/html/search/variables_0.js deleted file mode 100644 index b29ce61..0000000 --- a/doxygen/html/search/variables_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['average_112',['average',['../structpulseBin.html#a12544c37eabcbe9ffd036d8164ca3055',1,'pulseBin']]] -]; diff --git a/doxygen/html/search/variables_1.html b/doxygen/html/search/variables_1.html deleted file mode 100644 index ea73d9a..0000000 --- a/doxygen/html/search/variables_1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_1.js b/doxygen/html/search/variables_1.js deleted file mode 100644 index f88cb83..0000000 --- a/doxygen/html/search/variables_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['bins_113',['bins',['../classPulsetrain.html#a7ae1e45c9920ce2561a944f5ab6cdd77',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/variables_2.html b/doxygen/html/search/variables_2.html deleted file mode 100644 index 0580462..0000000 --- a/doxygen/html/search/variables_2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_2.js b/doxygen/html/search/variables_2.js deleted file mode 100644 index abc2d08..0000000 --- a/doxygen/html/search/variables_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['count_114',['count',['../structpulseBin.html#a4903dab9cf5565d26508a955645e8880',1,'pulseBin']]] -]; diff --git a/doxygen/html/search/variables_3.html b/doxygen/html/search/variables_3.html deleted file mode 100644 index 0d69e76..0000000 --- a/doxygen/html/search/variables_3.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_3.js b/doxygen/html/search/variables_3.js deleted file mode 100644 index 0456a8c..0000000 --- a/doxygen/html/search/variables_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['duration_115',['duration',['../classPulsetrain.html#a2e88fde3ab6db63a39c55026cdf1922a',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/variables_4.html b/doxygen/html/search/variables_4.html deleted file mode 100644 index a4b6506..0000000 --- a/doxygen/html/search/variables_4.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_4.js b/doxygen/html/search/variables_4.js deleted file mode 100644 index 839c9fc..0000000 --- a/doxygen/html/search/variables_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['elements_116',['elements',['../classMeaning.html#a403c23abbe015ea1ebbcc49d136c561b',1,'Meaning']]] -]; diff --git a/doxygen/html/search/variables_5.html b/doxygen/html/search/variables_5.html deleted file mode 100644 index 7e345d1..0000000 --- a/doxygen/html/search/variables_5.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_5.js b/doxygen/html/search/variables_5.js deleted file mode 100644 index 81db795..0000000 --- a/doxygen/html/search/variables_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['first_5fat_117',['first_at',['../classPulsetrain.html#afab8af6fa68ec3e83a95cb3840f3c0a8',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/variables_6.html b/doxygen/html/search/variables_6.html deleted file mode 100644 index 7d48e75..0000000 --- a/doxygen/html/search/variables_6.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_6.js b/doxygen/html/search/variables_6.js deleted file mode 100644 index 486037a..0000000 --- a/doxygen/html/search/variables_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['gap_118',['gap',['../classMeaning.html#aedf73a2aa5be87d46327965ac50d56f1',1,'Meaning::gap()'],['../classPulsetrain.html#a419dc73eee693428324ad98684ee1b94',1,'Pulsetrain::gap()']]] -]; diff --git a/doxygen/html/search/variables_7.html b/doxygen/html/search/variables_7.html deleted file mode 100644 index 5c26340..0000000 --- a/doxygen/html/search/variables_7.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_7.js b/doxygen/html/search/variables_7.js deleted file mode 100644 index 09931af..0000000 --- a/doxygen/html/search/variables_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['intervals_119',['intervals',['../classRawTimings.html#aa11ce3e8127c20c97cf196b86b4caff7',1,'RawTimings']]] -]; diff --git a/doxygen/html/search/variables_8.html b/doxygen/html/search/variables_8.html deleted file mode 100644 index dc9ec54..0000000 --- a/doxygen/html/search/variables_8.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_8.js b/doxygen/html/search/variables_8.js deleted file mode 100644 index d61e8ed..0000000 --- a/doxygen/html/search/variables_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['last_5fat_120',['last_at',['../classPulsetrain.html#a22b0e19734e61765bcff78444e760785',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/search/variables_9.html b/doxygen/html/search/variables_9.html deleted file mode 100644 index 7b01475..0000000 --- a/doxygen/html/search/variables_9.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_9.js b/doxygen/html/search/variables_9.js deleted file mode 100644 index 11da6c9..0000000 --- a/doxygen/html/search/variables_9.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['max_121',['max',['../structpulseBin.html#aa1de1a33047653624423f9afad97b108',1,'pulseBin']]], - ['min_122',['min',['../structpulseBin.html#a6a3e3bfa55b591db3517a544651b2136',1,'pulseBin']]] -]; diff --git a/doxygen/html/search/variables_a.html b/doxygen/html/search/variables_a.html deleted file mode 100644 index 52a724d..0000000 --- a/doxygen/html/search/variables_a.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_a.js b/doxygen/html/search/variables_a.js deleted file mode 100644 index 6224df1..0000000 --- a/doxygen/html/search/variables_a.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['repeats_123',['repeats',['../classMeaning.html#a325d097999f58331611b179d38fdb0d6',1,'Meaning::repeats()'],['../classPulsetrain.html#adbd908c37fcfe1215fdf72f0e238aa04',1,'Pulsetrain::repeats()']]] -]; diff --git a/doxygen/html/search/variables_b.html b/doxygen/html/search/variables_b.html deleted file mode 100644 index f376b27..0000000 --- a/doxygen/html/search/variables_b.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_b.js b/doxygen/html/search/variables_b.js deleted file mode 100644 index a602951..0000000 --- a/doxygen/html/search/variables_b.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['suspected_5fincomplete_124',['suspected_incomplete',['../classMeaning.html#a1909947a4fbb189178f660a8dbca3b79',1,'Meaning']]] -]; diff --git a/doxygen/html/search/variables_c.html b/doxygen/html/search/variables_c.html deleted file mode 100644 index 6019eba..0000000 --- a/doxygen/html/search/variables_c.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/doxygen/html/search/variables_c.js b/doxygen/html/search/variables_c.js deleted file mode 100644 index f33c393..0000000 --- a/doxygen/html/search/variables_c.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['transitions_125',['transitions',['../classPulsetrain.html#af45b392a9a4d92c5e97917bea95a75dd',1,'Pulsetrain']]] -]; diff --git a/doxygen/html/serial__output_8c_source.html b/doxygen/html/serial__output_8c_source.html deleted file mode 100644 index 801540a..0000000 --- a/doxygen/html/serial__output_8c_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/serial_output.c Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    serial_output.c
    -
    -
    -
    1 #include <Arduino.h>
    -
    2 
    -
    3 uint8_t rflink_seq_nr = 0;
    -
    - - - - diff --git a/doxygen/html/serial__output_8h_source.html b/doxygen/html/serial__output_8h_source.html deleted file mode 100644 index 038ddcb..0000000 --- a/doxygen/html/serial__output_8h_source.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/serial_output.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    serial_output.h
    -
    -
    -
    1 #ifndef _SERIAL_OUTPUT_H_
    -
    2 #define _SERIAL_OUTPUT_H_
    -
    3 
    -
    4 #include "Settings.h"
    -
    5 #include <Arduino.h>
    -
    6 
    -
    7 #define ERROR(...) {
    -
    8  String errorlevel;
    -
    9  SETTING(errorlevel);
    -
    10  if (errorlevel != "none") Serial.printf(__VA_ARGS__);\
    -
    11 }
    -
    12 
    -
    13 #define INFO(...) {
    -
    14  String errorlevel;
    -
    15  SETTING(errorlevel);
    -
    16  if (errorlevel != "none" && errorlevel != "error") Serial.printf(__VA_ARGS__);\
    -
    17 }
    -
    18 
    -
    19 #define DEBUG(...) {
    -
    20  String errorlevel;
    -
    21  SETTING(errorlevel);
    -
    22  if (errorlevel == "debug") Serial.printf(__VA_ARGS__);\
    -
    23 }
    -
    24 
    -
    25 #define RFLINK(...)
    -
    26  Serial.printf("20;%02X;", rflink_seq_nr++);
    -
    27  Serial.printf(__VA_ARGS__);
    -
    28 
    -
    29 extern uint8_t rflink_seq_nr;
    -
    30 
    -
    31 #endif
    -
    - - - - diff --git a/doxygen/html/splitbar.png b/doxygen/html/splitbar.png deleted file mode 100644 index fe895f2..0000000 Binary files a/doxygen/html/splitbar.png and /dev/null differ diff --git a/doxygen/html/structMeaningElement-members.html b/doxygen/html/structMeaningElement-members.html deleted file mode 100644 index 50ef156..0000000 --- a/doxygen/html/structMeaningElement-members.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    MeaningElement Member List
    -
    -
    - -

    This is the complete list of members for MeaningElement, including all inherited members.

    - - - - - - - -
    data (defined in MeaningElement)MeaningElement
    data_len (defined in MeaningElement)MeaningElement
    time1 (defined in MeaningElement)MeaningElement
    time2 (defined in MeaningElement)MeaningElement
    time3 (defined in MeaningElement)MeaningElement
    type (defined in MeaningElement)MeaningElement
    - - - - diff --git a/doxygen/html/structMeaningElement.html b/doxygen/html/structMeaningElement.html deleted file mode 100644 index 7ba17b5..0000000 --- a/doxygen/html/structMeaningElement.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - -OOKwiz: MeaningElement Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    MeaningElement Struct Reference
    -
    -
    - -

    Chunks of parsed packet. Either a pulse, a gap or a block of decoded data. - More...

    - -

    #include <Meaning.h>

    - - - - - - - - - - - - - - -

    -Public Attributes

    -modulation type
     
    -std::vector< uint8_t > data
     
    -uint16_t data_len
     
    -uint16_t time1
     
    -uint16_t time2
     
    -uint16_t time3
     
    -

    Detailed Description

    -

    Chunks of parsed packet. Either a pulse, a gap or a block of decoded data.

    - -

    Definition at line 20 of file Meaning.h.

    -

    The documentation for this struct was generated from the following file:
      -
    • /home/runner/work/OOKwiz/OOKwiz/src/Meaning.h
    • -
    -
    - - - - diff --git a/doxygen/html/structpulseBin-members.html b/doxygen/html/structpulseBin-members.html deleted file mode 100644 index ae0c5c2..0000000 --- a/doxygen/html/structpulseBin-members.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -OOKwiz: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    pulseBin Member List
    -
    -
    - -

    This is the complete list of members for pulseBin, including all inherited members.

    - - - - - -
    averagepulseBin
    countpulseBin
    maxpulseBin
    minpulseBin
    - - - - diff --git a/doxygen/html/structpulseBin.html b/doxygen/html/structpulseBin.html deleted file mode 100644 index 1570f26..0000000 --- a/doxygen/html/structpulseBin.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -OOKwiz: pulseBin Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    pulseBin Struct Reference
    -
    -
    - -

    Struct that holds information about a 'bin' in a Pulsetrain, a range of timings that are lumped together when converting RawTimings to a Pulsetrain. - More...

    - -

    #include <Pulsetrain.h>

    - - - - - - - - - - - - - - -

    -Public Attributes

    -uint16_t min = 65535
     shortest time in bin in µs
     
    -uint16_t max = 0
     longest time in bin in µs
     
    -long average = 0
     average time in bin in µs
     
    -uint16_t count = 0
     Number of intervals in this bin in Pulsetrain.
     
    -

    Detailed Description

    -

    Struct that holds information about a 'bin' in a Pulsetrain, a range of timings that are lumped together when converting RawTimings to a Pulsetrain.

    - -

    Definition at line 12 of file Pulsetrain.h.

    -

    The documentation for this struct was generated from the following file: -
    - - - - diff --git a/doxygen/html/sync_off.png b/doxygen/html/sync_off.png deleted file mode 100644 index 3b443fc..0000000 Binary files a/doxygen/html/sync_off.png and /dev/null differ diff --git a/doxygen/html/sync_on.png b/doxygen/html/sync_on.png deleted file mode 100644 index e08320f..0000000 Binary files a/doxygen/html/sync_on.png and /dev/null differ diff --git a/doxygen/html/tab_a.png b/doxygen/html/tab_a.png deleted file mode 100644 index 3b725c4..0000000 Binary files a/doxygen/html/tab_a.png and /dev/null differ diff --git a/doxygen/html/tab_b.png b/doxygen/html/tab_b.png deleted file mode 100644 index e2b4a86..0000000 Binary files a/doxygen/html/tab_b.png and /dev/null differ diff --git a/doxygen/html/tab_h.png b/doxygen/html/tab_h.png deleted file mode 100644 index fd5cb70..0000000 Binary files a/doxygen/html/tab_h.png and /dev/null differ diff --git a/doxygen/html/tab_s.png b/doxygen/html/tab_s.png deleted file mode 100644 index ab478c9..0000000 Binary files a/doxygen/html/tab_s.png and /dev/null differ diff --git a/doxygen/html/tabs.css b/doxygen/html/tabs.css deleted file mode 100644 index 7d45d36..0000000 --- a/doxygen/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/doxygen/html/tools_8cpp_source.html b/doxygen/html/tools_8cpp_source.html deleted file mode 100644 index 50cf53d..0000000 --- a/doxygen/html/tools_8cpp_source.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/tools.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    tools.cpp
    -
    -
    -
    1 #include "tools.h"
    -
    2 #include "config.h"
    -
    3 
    -
    4 size_t getArduinoLoopTaskStackSize() {
    - -
    6 }
    -
    7 
    -
    8 namespace tools {
    -
    9 
    -
    10  /// @brief Takes spaces off start and end of supplied string, operates in place on String passed in.
    -
    11  /// @param in (String) The string in question, will be modified if need be.
    -
    12  void trim(String &in) {
    -
    13  while (in.startsWith(" ")) {
    -
    14  in = in.substring(1);
    -
    15  }
    -
    16  while (in.endsWith(" ")) {
    -
    17  in = in.substring(0, in.length() - 1);
    -
    18  }
    -
    19  }
    -
    20 
    -
    21  /// @brief Identifies contiguous series of digits in String, giving you the toInt() of the nth one.
    -
    22  /// @param in (String) The string we're looking at.
    -
    23  /// @param num (int) Which series of numbers you'd like evaluated.
    -
    24  /// @return (long) The toInt() value you wre looking for, or -1 if there weren't that many series of digits.
    -
    25  long nthNumberFrom(String &in, int num) {
    -
    26  int index = 0;
    -
    27  bool on_numbers = false;
    -
    28  int count = 0;
    -
    29  while (index < in.length()) {
    -
    30  if (isDigit(in.charAt(index)) and !on_numbers) {
    -
    31  on_numbers = true;
    -
    32  if (count == num) {
    -
    33  return in.substring(index).toInt();
    -
    34  }
    -
    35  }
    -
    36  if (!isDigit(in.charAt(index)) and on_numbers) {
    -
    37  on_numbers = false;
    -
    38  count++;
    -
    39  }
    -
    40  index++;
    -
    41  }
    -
    42  return -1;
    -
    43  }
    -
    44 
    -
    45  /// @brief Shifts bits into a range of bytes. Reverse order because length may be unkown at start.
    -
    46  /// @param buf pointer to uint8_t array with enough space for the bits to me shifted in.
    -
    47  /// @param len number of bits that have been shifted in so far.
    -
    48  /// @param bit bool holding the bit to be shifted in this time
    -
    49  void shiftInBit(uint8_t* buf, const int len, const bool bit) {
    -
    50  int len_bytes = (len + 7) / 8;
    -
    51  bool carry = bit;
    -
    52  for (int n = 0; n < len_bytes; n++) {
    -
    53  bool new_carry = buf[n] & 128;
    -
    54  buf[n] <<= 1;
    -
    55  buf[n] |= carry;
    -
    56  carry = new_carry;
    -
    57  }
    -
    58  }
    -
    59 
    -
    60  /// @brief Shifts out the bits in an array of bytes, emptying array in process.
    -
    61  /// @param buf (uint8_t*) pointer to array, MSB of leftmost byte gets shifted out first.
    -
    62  /// @param len (int) Number of bits in buffer in total.
    -
    63  /// @return (bool) the bit shifted out.
    -
    64  bool shiftOutBit(uint8_t* buf, const int len) {
    -
    65  int len_bytes = (len + 7) / 8;
    -
    66  bool carry = 0;
    -
    67  for (int n = len_bytes - 1; n >= 0; n--) {
    -
    68  bool new_carry = buf[n] & 128;
    -
    69  buf[n] <<= 1;
    -
    70  buf[n] |= carry;
    -
    71  carry = new_carry;
    -
    72  }
    -
    73  return carry;
    -
    74  }
    -
    75 
    -
    76  void split(const String &in, const String &separator, String &before, String &after) {
    -
    77  int found = in.indexOf(separator);
    -
    78  if (found != -1) {
    -
    79  before = in.substring(0, found);
    -
    80  trim(before);
    -
    81  after = in.substring(found + separator.length());
    -
    82  trim(after);
    -
    83  } else {
    -
    84  before = in;
    -
    85  after = "";
    -
    86  }
    -
    87  }
    -
    88 
    -
    89 }
    -
    - - - - diff --git a/doxygen/html/tools_8h_source.html b/doxygen/html/tools_8h_source.html deleted file mode 100644 index 52bc429..0000000 --- a/doxygen/html/tools_8h_source.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -OOKwiz: /home/runner/work/OOKwiz/OOKwiz/src/tools.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    OOKwiz -
    -
    on/off-keying for ESP32 and a variety of supported radio modules
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    tools.h
    -
    -
    -
    1 #ifndef _TOOLS_H_
    -
    2 #define _TOOLS_H_
    -
    3 
    -
    4 #include <Arduino.h>
    -
    5 
    -
    6 #define QUOTE_2(x) #x
    -
    7 #define QUOTE(x) QUOTE_2(x)
    -
    8 #define CONCAT_2(x, y) x##y
    -
    9 #define CONCAT(x, y) CONCAT_2(x, y)
    -
    10 
    -
    11 // So that the stack size can be increased. See config.h for setting
    -
    12 size_t getArduinoLoopTaskStackSize();
    -
    13 
    -
    14 #define SPLIT(in, sep, a, b)
    -
    15  String a;
    -
    16  String b;
    -
    17  tools::split(in, sep, a, b);
    -
    18 
    -
    19 #define snprintf_append(append_to, len, ...)
    -
    20  {
    -
    21  char buffer[len];
    -
    22  snprintf(buffer, len, __VA_ARGS__);
    -
    23  append_to = append_to + buffer;
    -
    24  }
    -
    25 
    -
    26 namespace tools {
    -
    27 
    -
    28  long nthNumberFrom(String &in, int num);
    -
    29  void trim(String &in);
    -
    30  void shiftInBit(uint8_t* buf, const int len, const bool bit);
    -
    31  bool shiftOutBit(uint8_t* buf, const int len);
    -
    32  void split(const String &in, const String &separator, String &before, String &after);
    -
    33 
    -
    34 }
    -
    35 
    -
    36 #endif
    -
    - - - -