From 4f2173e2c6b7deb178862e411ade0b8efc5254b2 Mon Sep 17 00:00:00 2001 From: Doxygen CI Date: Thu, 30 Apr 2020 22:39:11 +0000 Subject: [PATCH] Deploy code docs to GitHub Pages Travis build: 4 Commit: 4cbf99aa541c6d9ec502e2651580fec8dfd7173d --- .nojekyll | 1 + README.md | 1 - html/_adafruit___protomatter_8cpp.html | 96 + html/_adafruit___protomatter_8h_source.html | 81 + html/annotated.html | 80 + html/arch_8h.html | 114 ++ html/arch_8h_source.html | 93 + html/bc_s.png | Bin 0 -> 676 bytes html/bdwn.png | Bin 0 -> 147 bytes .../class_adafruit___protomatter-members.html | 81 + html/class_adafruit___protomatter.html | 256 +++ html/class_adafruit___protomatter.png | Bin 0 -> 543 bytes html/classes.html | 84 + html/closed.png | Bin 0 -> 132 bytes html/core_8c.html | 460 +++++ html/core_8h.html | 586 ++++++ html/core_8h_source.html | 124 ++ html/doc.png | Bin 0 -> 746 bytes html/doxygen.css | 1596 +++++++++++++++++ html/doxygen.png | Bin 0 -> 3779 bytes html/dynsections.js | 97 + html/files.html | 82 + html/folderclosed.png | Bin 0 -> 616 bytes html/folderopen.png | Bin 0 -> 597 bytes html/functions.html | 245 +++ html/functions_func.html | 83 + html/functions_vars.html | 229 +++ html/globals.html | 167 ++ html/globals_defs.html | 112 ++ html/globals_enum.html | 74 + html/globals_func.html | 114 ++ html/globals_vars.html | 74 + html/hierarchy.html | 81 + html/index.html | 86 + html/jquery.js | 87 + html/menu.js | 26 + html/menudata.js | 49 + html/nav_f.png | Bin 0 -> 153 bytes html/nav_g.png | Bin 0 -> 95 bytes html/nav_h.png | Bin 0 -> 98 bytes html/open.png | Bin 0 -> 123 bytes html/search/all_0.html | 26 + html/search/all_0.js | 27 + html/search/all_1.html | 26 + html/search/all_1.js | 10 + html/search/all_2.html | 26 + html/search/all_2.js | 8 + html/search/all_3.html | 26 + html/search/all_3.js | 8 + html/search/all_4.html | 26 + html/search/all_4.js | 4 + html/search/all_5.html | 26 + html/search/all_5.js | 4 + html/search/all_6.html | 26 + html/search/all_6.js | 4 + html/search/all_7.html | 26 + html/search/all_7.js | 4 + html/search/all_8.html | 26 + html/search/all_8.js | 4 + html/search/all_9.html | 26 + html/search/all_9.js | 6 + html/search/all_a.html | 26 + html/search/all_a.js | 4 + html/search/all_b.html | 26 + html/search/all_b.js | 12 + html/search/all_c.html | 26 + html/search/all_c.js | 7 + html/search/all_d.html | 26 + html/search/all_d.js | 8 + html/search/all_e.html | 26 + html/search/all_e.js | 5 + html/search/all_f.html | 26 + html/search/all_f.js | 4 + html/search/classes_0.html | 26 + html/search/classes_0.js | 4 + html/search/classes_1.html | 26 + html/search/classes_1.js | 4 + html/search/classes_2.html | 26 + html/search/classes_2.js | 4 + html/search/close.png | Bin 0 -> 273 bytes html/search/defines_0.html | 26 + html/search/defines_0.js | 14 + html/search/defines_1.html | 26 + html/search/defines_1.js | 5 + html/search/enums_0.html | 26 + html/search/enums_0.js | 4 + html/search/files_0.html | 26 + html/search/files_0.js | 5 + html/search/files_1.html | 26 + html/search/files_1.js | 5 + html/search/functions_0.html | 26 + html/search/functions_0.js | 15 + html/search/functions_1.html | 26 + html/search/functions_1.js | 4 + html/search/functions_2.html | 26 + html/search/functions_2.js | 4 + html/search/functions_3.html | 26 + html/search/functions_3.js | 4 + html/search/functions_4.html | 26 + html/search/functions_4.js | 4 + html/search/mag_sel.png | Bin 0 -> 563 bytes html/search/nomatches.html | 12 + html/search/pages_0.html | 26 + html/search/pages_0.js | 4 + html/search/search.css | 271 +++ html/search/search.js | 791 ++++++++ html/search/search_l.png | Bin 0 -> 604 bytes html/search/search_m.png | Bin 0 -> 158 bytes html/search/search_r.png | Bin 0 -> 612 bytes html/search/searchdata.js | 36 + html/search/variables_0.html | 26 + html/search/variables_0.js | 4 + html/search/variables_1.html | 26 + html/search/variables_1.js | 6 + html/search/variables_2.html | 26 + html/search/variables_2.js | 7 + html/search/variables_3.html | 26 + html/search/variables_3.js | 6 + html/search/variables_4.html | 26 + html/search/variables_4.js | 4 + html/search/variables_5.html | 26 + html/search/variables_5.js | 4 + html/search/variables_6.html | 26 + html/search/variables_6.js | 4 + html/search/variables_7.html | 26 + html/search/variables_7.js | 4 + html/search/variables_8.html | 26 + html/search/variables_8.js | 6 + html/search/variables_9.html | 26 + html/search/variables_9.js | 4 + html/search/variables_a.html | 26 + html/search/variables_a.js | 8 + html/search/variables_b.html | 26 + html/search/variables_b.js | 7 + html/search/variables_c.html | 26 + html/search/variables_c.js | 7 + html/search/variables_d.html | 26 + html/search/variables_d.js | 5 + html/search/variables_e.html | 26 + html/search/variables_e.js | 4 + html/splitbar.png | Bin 0 -> 314 bytes html/struct___p_m__pin-members.html | 80 + html/struct___p_m__pin.html | 103 ++ html/struct_protomatter__core-members.html | 108 ++ html/struct_protomatter__core.html | 215 +++ html/sync_off.png | Bin 0 -> 853 bytes html/sync_on.png | Bin 0 -> 845 bytes html/tab_a.png | Bin 0 -> 142 bytes html/tab_b.png | Bin 0 -> 169 bytes html/tab_h.png | Bin 0 -> 177 bytes html/tab_s.png | Bin 0 -> 184 bytes html/tabs.css | 1 + index.html | 11 + 153 files changed, 8335 insertions(+), 1 deletion(-) create mode 100644 .nojekyll delete mode 100644 README.md create mode 100644 html/_adafruit___protomatter_8cpp.html create mode 100644 html/_adafruit___protomatter_8h_source.html create mode 100644 html/annotated.html create mode 100644 html/arch_8h.html create mode 100644 html/arch_8h_source.html create mode 100644 html/bc_s.png create mode 100644 html/bdwn.png create mode 100644 html/class_adafruit___protomatter-members.html create mode 100644 html/class_adafruit___protomatter.html create mode 100644 html/class_adafruit___protomatter.png create mode 100644 html/classes.html create mode 100644 html/closed.png create mode 100644 html/core_8c.html create mode 100644 html/core_8h.html create mode 100644 html/core_8h_source.html create mode 100644 html/doc.png create mode 100644 html/doxygen.css create mode 100644 html/doxygen.png create mode 100644 html/dynsections.js create mode 100644 html/files.html create mode 100644 html/folderclosed.png create mode 100644 html/folderopen.png create mode 100644 html/functions.html create mode 100644 html/functions_func.html create mode 100644 html/functions_vars.html create mode 100644 html/globals.html create mode 100644 html/globals_defs.html create mode 100644 html/globals_enum.html create mode 100644 html/globals_func.html create mode 100644 html/globals_vars.html create mode 100644 html/hierarchy.html create mode 100644 html/index.html create mode 100644 html/jquery.js create mode 100644 html/menu.js create mode 100644 html/menudata.js create mode 100644 html/nav_f.png create mode 100644 html/nav_g.png create mode 100644 html/nav_h.png create mode 100644 html/open.png create mode 100644 html/search/all_0.html create mode 100644 html/search/all_0.js create mode 100644 html/search/all_1.html create mode 100644 html/search/all_1.js create mode 100644 html/search/all_2.html create mode 100644 html/search/all_2.js create mode 100644 html/search/all_3.html create mode 100644 html/search/all_3.js create mode 100644 html/search/all_4.html create mode 100644 html/search/all_4.js create mode 100644 html/search/all_5.html create mode 100644 html/search/all_5.js create mode 100644 html/search/all_6.html create mode 100644 html/search/all_6.js create mode 100644 html/search/all_7.html create mode 100644 html/search/all_7.js create mode 100644 html/search/all_8.html create mode 100644 html/search/all_8.js create mode 100644 html/search/all_9.html create mode 100644 html/search/all_9.js create mode 100644 html/search/all_a.html create mode 100644 html/search/all_a.js create mode 100644 html/search/all_b.html create mode 100644 html/search/all_b.js create mode 100644 html/search/all_c.html create mode 100644 html/search/all_c.js create mode 100644 html/search/all_d.html create mode 100644 html/search/all_d.js create mode 100644 html/search/all_e.html create mode 100644 html/search/all_e.js create mode 100644 html/search/all_f.html create mode 100644 html/search/all_f.js create mode 100644 html/search/classes_0.html create mode 100644 html/search/classes_0.js create mode 100644 html/search/classes_1.html create mode 100644 html/search/classes_1.js create mode 100644 html/search/classes_2.html create mode 100644 html/search/classes_2.js create mode 100644 html/search/close.png create mode 100644 html/search/defines_0.html create mode 100644 html/search/defines_0.js create mode 100644 html/search/defines_1.html create mode 100644 html/search/defines_1.js create mode 100644 html/search/enums_0.html create mode 100644 html/search/enums_0.js create mode 100644 html/search/files_0.html create mode 100644 html/search/files_0.js create mode 100644 html/search/files_1.html create mode 100644 html/search/files_1.js create mode 100644 html/search/functions_0.html create mode 100644 html/search/functions_0.js create mode 100644 html/search/functions_1.html create mode 100644 html/search/functions_1.js create mode 100644 html/search/functions_2.html create mode 100644 html/search/functions_2.js create mode 100644 html/search/functions_3.html create mode 100644 html/search/functions_3.js create mode 100644 html/search/functions_4.html create mode 100644 html/search/functions_4.js create mode 100644 html/search/mag_sel.png create mode 100644 html/search/nomatches.html create mode 100644 html/search/pages_0.html create mode 100644 html/search/pages_0.js create mode 100644 html/search/search.css create mode 100644 html/search/search.js create mode 100644 html/search/search_l.png create mode 100644 html/search/search_m.png create mode 100644 html/search/search_r.png create mode 100644 html/search/searchdata.js create mode 100644 html/search/variables_0.html create mode 100644 html/search/variables_0.js create mode 100644 html/search/variables_1.html create mode 100644 html/search/variables_1.js create mode 100644 html/search/variables_2.html create mode 100644 html/search/variables_2.js create mode 100644 html/search/variables_3.html create mode 100644 html/search/variables_3.js create mode 100644 html/search/variables_4.html create mode 100644 html/search/variables_4.js create mode 100644 html/search/variables_5.html create mode 100644 html/search/variables_5.js create mode 100644 html/search/variables_6.html create mode 100644 html/search/variables_6.js create mode 100644 html/search/variables_7.html create mode 100644 html/search/variables_7.js create mode 100644 html/search/variables_8.html create mode 100644 html/search/variables_8.js create mode 100644 html/search/variables_9.html create mode 100644 html/search/variables_9.js create mode 100644 html/search/variables_a.html create mode 100644 html/search/variables_a.js create mode 100644 html/search/variables_b.html create mode 100644 html/search/variables_b.js create mode 100644 html/search/variables_c.html create mode 100644 html/search/variables_c.js create mode 100644 html/search/variables_d.html create mode 100644 html/search/variables_d.js create mode 100644 html/search/variables_e.html create mode 100644 html/search/variables_e.js create mode 100644 html/splitbar.png create mode 100644 html/struct___p_m__pin-members.html create mode 100644 html/struct___p_m__pin.html create mode 100644 html/struct_protomatter__core-members.html create mode 100644 html/struct_protomatter__core.html create mode 100644 html/sync_off.png create mode 100644 html/sync_on.png create mode 100644 html/tab_a.png create mode 100644 html/tab_b.png create mode 100644 html/tab_h.png create mode 100644 html/tab_s.png create mode 100644 html/tabs.css create mode 100644 index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ + diff --git a/README.md b/README.md deleted file mode 100644 index 6228a7f..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -My gh-pages branch diff --git a/html/_adafruit___protomatter_8cpp.html b/html/_adafruit___protomatter_8cpp.html new file mode 100644 index 0000000..d8fdb7a --- /dev/null +++ b/html/_adafruit___protomatter_8cpp.html @@ -0,0 +1,96 @@ + + + + + + + +Adafruit Protomatter: Adafruit_Protomatter.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
Adafruit_Protomatter.cpp File Reference
+
+
+
#include "Adafruit_Protomatter.h"
+
+ + + + + + + +

+Macros

+#define _PM_MAX_REFRESH_HZ   250
 Upper limit (ish) to matrix refresh rate.
 
+#define _PM_ROW_DELAY   8
 Delay time between row address line changes (ms)
 
+ + + + +

+Variables

+Protomatter_core_PM_protoPtr
 In core.c (via arch.h)
 
+
+ + + + diff --git a/html/_adafruit___protomatter_8h_source.html b/html/_adafruit___protomatter_8h_source.html new file mode 100644 index 0000000..f6bab11 --- /dev/null +++ b/html/_adafruit___protomatter_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Adafruit Protomatter: Adafruit_Protomatter.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Adafruit_Protomatter.h
+
+
+
1 // Arduino-specific header, accompanies Adafruit_Protomatter.cpp.
2 // There should not be any device-specific #ifdefs here.
3 
4 #ifndef _ADAFRUIT_PROTOMATTER_H_
5 #define _ADAFRUIT_PROTOMATTER_H_
6 
7 #include "core.h"
8 #include <Adafruit_GFX.h>
9 
15 class Adafruit_Protomatter : public GFXcanvas16 {
16 public:
62  Adafruit_Protomatter(uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount,
63  uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList,
64  uint8_t clockPin, uint8_t latchPin, uint8_t oePin,
65  bool doubleBuffer, void *timer = NULL);
66  ~Adafruit_Protomatter(void);
67 
81 
86  void show(void);
87 
96  uint32_t getFrameCount(void);
97 
98 private:
99  Protomatter_core core; // Underlying C struct
100  void convert_byte(uint8_t *dest); // GFXcanvas16-to-matrix
101  void convert_word(uint16_t *dest); // conversion functions
102  void convert_long(uint32_t *dest); // for 8/16/32 bit bufs
103 };
104 
105 #endif // _ADAFRUIT_PROTOMATTER_H_
Adafruit_Protomatter(uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount, uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList, uint8_t clockPin, uint8_t latchPin, uint8_t oePin, bool doubleBuffer, void *timer=NULL)
Adafruit_Protomatter constructor.
Definition: Adafruit_Protomatter.cpp:67
+ +
ProtomatterStatus
Definition: core.h:28
+
Class representing the Arduino-facing side of the Protomatter library. Subclass of Adafruit_GFX&#39;s GFX...
Definition: Adafruit_Protomatter.h:15
+
ProtomatterStatus begin(void)
Start a Protomatter matrix display running – initialize pins, timer and interrupt into existence...
Definition: Adafruit_Protomatter.cpp:91
+
void show(void)
Process data from GFXcanvas16 to the matrix framebuffer&#39;s internal format for display.
Definition: Adafruit_Protomatter.cpp:99
+
uint32_t getFrameCount(void)
Returns current value of frame counter and resets its value to zero. Two calls to this...
Definition: Adafruit_Protomatter.cpp:108
+
Definition: core.h:58
+
+ + + + diff --git a/html/annotated.html b/html/annotated.html new file mode 100644 index 0000000..c018531 --- /dev/null +++ b/html/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Adafruit Protomatter: Class List + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + +
 C_PM_pin
 CAdafruit_ProtomatterClass representing the Arduino-facing side of the Protomatter library. Subclass of Adafruit_GFX's GFXcanvas16 to allow all the drawing operations
 CProtomatter_core
+
+
+ + + + diff --git a/html/arch_8h.html b/html/arch_8h.html new file mode 100644 index 0000000..b409bfc --- /dev/null +++ b/html/arch_8h.html @@ -0,0 +1,114 @@ + + + + + + + +Adafruit Protomatter: arch.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
arch.h File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define _PM_chunkSize   8
 Unroll data-stuffing loop to this size.
 
+#define _PM_clockHoldHigh
 Extra cycles (if any) on clock HIGH signal.
 
+#define _PM_clockHoldLow
 Extra cycles (if any) on clock LOW signal.
 
+#define _PM_minMinPeriod   100
 Minimum timer interval for least bit.
 
+#define _PM_ALLOCATOR(x)   (malloc((x)))
 Memory alloc call.
 
+#define _PM_FREE(x)   (free((x)))
 Memory free call.
 
+#define _PM_PORT_TYPE   uint32_t
 PORT register size/type.
 
+

Detailed Description

+

Part of Adafruit's Protomatter library for HUB75-style RGB LED matrices.

+

Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

+

Written by Phil "Paint Your Dragon" Burgess and Jeff Epler for Adafruit Industries, with contributions from the open source community.

+

BSD license, all text here must be included in any redistribution.

+
+ + + + diff --git a/html/arch_8h_source.html b/html/arch_8h_source.html new file mode 100644 index 0000000..8a75fa8 --- /dev/null +++ b/html/arch_8h_source.html @@ -0,0 +1,93 @@ + + + + + + + +Adafruit Protomatter: arch.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
arch.h
+
+
+Go to the documentation of this file.
1 
17 // Establishes some very low-level things specific to each supported device.
18 // This should ONLY be included by core.c, nowhere else. Ever.
19 
20 #if !defined(_PROTOMATTER_ARCH_H_)
21 #define _PROTOMATTER_ARCH_H_
22 
23 /*
24 Common ground for architectures to support this library:
25 
26 - 32-bit device (e.g. ARM core, but potentially ESP32 and others in future)
27 - One or more 32-bit GPIO PORTs with atomic bitmask SET and CLEAR registers.
28  A TOGGLE register, if present, may improve performance but is NOT required.
29 - Tolerate 8-bit or word-aligned 16-bit accesses within the 32-bit PORT
30  registers (e.g. writing just one of four bytes, rather than the whole
31  32 bits). The library does not use any unaligned accesses (i.e. the
32  "middle word" of a 32-bit register), even if a device tolerates such.
33 
34 "Pin" as used in this code is always a uint8_t value, but the semantics
35 of what it means may vary between Arduino and non-Arduino situations.
36 In Arduino, it's the pin index one would pass to functions such as
37 digitalWrite(), and doesn't necessarily correspond to physical hardware
38 pins or any other arrangement. Some may have names like 'A0' that really
39 just map to higher indices.
40 In non-Arduino settings (CircuitPython, other languages, etc.), how a
41 pin index relates to hardware is entirely implementation dependent, and
42 how to get from one to the other is what must be implemented in this file.
43 Quite often an environment will follow the Arduino pin designations
44 (since the numbers are on a board's silkscreen) and will have an internal
45 table mapping those indices to registers and bitmasks...but probably not
46 an identically-named and -structured table to the Arduino code, hence the
47 reason for many "else" situations in this code.
48 
49 Each architecture defines the following macros and/or functions (the _PM_
50 prefix on each is to reduce likelihood of naming collisions...especially
51 on ESP32, which has some similarly-named timer functions...though note
52 that this library is NOT CURRENTLY PORTED to ESP32):
53 
54 GPIO-related macros/functions:
55 
56 _PM_portOutRegister(pin): Get address of PORT out register. Code calling
57  this can cast it to whatever type's needed.
58 _PM_portSetRegister(pin): Get address of PORT set-bits register.
59 _PM_portClearRegister(pin): Get address of PORT clear-bits register.
60 _PM_portToggleRegister(pin): Get address of PORT toggle-bits register.
61  Not all devices support this, in which case
62  it must be left undefined.
63 _PM_portBitMask(pin): Get bit mask within PORT register corresponding
64  to a pin number. When compiling for Arduino,
65  this just maps to digitalPinToBitMask(), other
66  environments will need an equivalent.
67 _PM_byteOffset(pin): Get index of byte (0 to 3) within 32-bit PORT
68  corresponding to a pin number.
69 _PM_wordOffset(pin): Get index of word (0 or 1) within 32-bit PORT
70  corresponding to a pin number.
71 _PM_pinOutput(pin): Set a pin to output mode. In Arduino this maps
72  to pinMode(pin, OUTPUT). Other environments
73  will need an equivalent.
74 _PM_pinInput(pin): Set a pin to input mode, no pullup. In Arduino
75  this maps to pinMode(pin, INPUT).
76 _PM_pinHigh(pin): Set an output pin to a high or 1 state. In
77  Arduino this maps to digitalWrite(pin, HIGH).
78 _PM_pinLow(pin): Set an output pin to a low or 0 state. In
79  Arduino this maps to digitalWrite(pin, LOW).
80 
81 Timer-related macros/functions:
82 
83 _PM_timerFreq: A numerical constant - the source clock rate
84  (in Hz) that's fed to the timer peripheral.
85 _PM_timerInit(void*): Initialize (but do not start) timer.
86 _PM_timerStart(void*,count): (Re)start timer for a given timer-tick interval.
87 _PM_timerStop(void*): Stop timer, return current timer counter value.
88 _PM_timerGetCount(void*): Get current timer counter value (whether timer
89  is running or stopped).
90 A timer interrupt service routine is also required, syntax for which varies
91 between architectures.
92 The void* argument passed to the timer functions is some indeterminate type
93 used to uniquely identify a timer peripheral within a given environment. For
94 example, in the Arduino wrapper for this library, compiling for SAMD chips,
95 it's just a pointer directly to a timer/counter peripheral base address. If
96 an implementation needs more data associated alongside a peripheral, this
97 could instead be a pointer to a struct, or an integer index.
98 
99 Other macros/functions:
100 
101 _PM_chunkSize: Matrix bitmap width (both in RAM and as issued
102  to the device) is rounded up (if necessary) to
103  a multiple of this value as a way of explicitly
104  unrolling the innermost data-stuffing loops.
105  So far all HUB75 displays I've encountered are
106  a multiple of 32 pixels wide, but in case
107  something new comes along, or if a larger
108  unroll actually decreases performance due to
109  cache size, this can be set to whatever works
110  best (any additional data is simply shifted
111  out the other end of the matrix). Default if
112  unspecified is 8 (e.g. four loop passes on a
113  32-pixel matrix, eight if 64-pixel). Only
114  certain chunkSizes are actually implemented,
115  see .cpp code (avoiding GCC-specific tricks
116  that would handle arbitrary chunk sizes).
117 _PM_delayMicroseconds(us): Function or macro to delay some number of
118  microseconds. For Arduino, this just maps to
119  delayMicroseconds(). Other environments will
120  need to provide their own or map to an
121  an equivalent function.
122 _PM_clockHoldHigh: Additional code (typically some number of NOPs)
123  needed to delay the clock fall after RGB data is
124  written to PORT. Only required on fast devices.
125  If left undefined, no delay happens.
126 _PM_clockHoldLow: Additional code (e.g. NOPs) needed to delay
127  clock rise after writing RGB data to PORT.
128  No delay if left undefined.
129 _PM_minMinPeriod: Mininum value for the "minPeriod" class member,
130  so bit-angle-modulation time always doubles with
131  each bitplane (else lower bits may be the same).
132 */
133 
134 #if defined(ARDUINO) // If compiling in Arduino IDE...
135 #include <Arduino.h> // pull in all that stuff.
136 
137 #define _PM_delayMicroseconds(us) delayMicroseconds(us)
138 #define _PM_pinOutput(pin) pinMode(pin, OUTPUT)
139 #define _PM_pinInput(pin) pinMode(pin, INPUT)
140 #define _PM_pinHigh(pin) digitalWrite(pin, HIGH)
141 #define _PM_pinLow(pin) digitalWrite(pin, LOW)
142 #define _PM_portBitMask(pin) digitalPinToBitMask(pin)
143 
144 #elif defined(CIRCUITPY)
145 #include "py/mphal.h"
146 #include "shared-bindings/microcontroller/Pin.h"
147 
148 #define _PM_delayMicroseconds(us) mp_hal_delay_us(us)
149 
150 #ifdef SAMD51
151 #define __SAMD51__
152 #define F_CPU (120000000)
153 #endif
154 #ifdef SAMD21
155 #define _SAMD21_
156 #endif
157 
158 #ifdef STM32F405xx
159 #define STM32F4_SERIES (1)
160 #endif
161 
162 // No #else here. In non-Arduino case, declare things in the arch-specific
163 // sections below...unless other environments provide device-neutral
164 // functions as above, in which case those could go here (w/#elif).
165 #endif // end defined(ARDUINO)
166 
167 // CODE COMMON TO BOTH SAMD51 AND SAMD21 -----------------------------------
168 
169 #if defined(__SAMD51__) || defined(_SAMD21_)
170 #if defined(ARDUINO)
171 
172 // g_APinDescription[] table and pin indices are Arduino specific:
173 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
174 #define _PM_byteOffset(pin) (g_APinDescription[pin].ulPin / 8)
175 #define _PM_wordOffset(pin) (g_APinDescription[pin].ulPin / 16)
176 #else
177 #define _PM_byteOffset(pin) (3 - (g_APinDescription[pin].ulPin / 8))
178 #define _PM_wordOffset(pin) (1 - (g_APinDescription[pin].ulPin / 16))
179 #endif
180 
181 // Arduino implementation is tied to a specific timer/counter & freq:
182 #if defined(TC4)
183 #define _PM_TIMER_DEFAULT TC4
184 #define _PM_IRQ_HANDLER TC4_Handler
185 #else // No TC4 on some M4's
186 #define _PM_TIMER_DEFAULT TC3
187 #define _PM_IRQ_HANDLER TC3_Handler
188 #endif
189 #define _PM_timerFreq 48000000
190 // Partly because IRQs must be declared at compile-time, and partly
191 // because we know Arduino's already set up one of the GCLK sources
192 // for 48 MHz.
193 
194 // Because it's tied to a specific timer right now, there can be only
195 // one instance of the Protomatter_core struct. The Arduino library
196 // sets up this pointer when calling begin().
197 void *_PM_protoPtr = NULL;
198 
199 // Timer interrupt service routine
200 void _PM_IRQ_HANDLER(void) {
201  // Clear overflow flag:
202  _PM_TIMER_DEFAULT->COUNT16.INTFLAG.reg = TC_INTFLAG_OVF;
203  _PM_row_handler(_PM_protoPtr); // In core.c
204 }
205 
206 #elif defined(CIRCUITPY)
207 
208 #include "hal_gpio.h"
209 
210 #define _PM_pinOutput(pin) gpio_set_pin_direction(pin, GPIO_DIRECTION_OUT)
211 #define _PM_pinInput(pin) gpio_set_pin_direction(pin, GPIO_DIRECTION_IN)
212 #define _PM_pinHigh(pin) gpio_set_pin_level(pin, 1)
213 #define _PM_pinLow(pin) gpio_set_pin_level(pin, 0)
214 #define _PM_portBitMask(pin) (1u << ((pin) % 32))
215 
216 #define _PM_byteOffset(pin) ((pin % 32) / 8)
217 #define _PM_wordOffset(pin) ((pin % 32) / 16)
218 
219 #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
220 #error SRSLY
221 #endif
222 
223 // CircuitPython implementation is tied to a specific freq (but the counter
224 // is dynamically allocated):
225 #define _PM_timerFreq 48000000
226 // Partly because IRQs must be declared at compile-time, and partly
227 // because we know Arduino's already set up one of the GCLK sources
228 // for 48 MHz.
229 
230 // Because it's tied to a specific timer right now, there can be only
231 // one instance of the Protomatter_core struct. The Arduino library
232 // sets up this pointer when calling begin().
233 void *_PM_protoPtr = NULL;
234 
235 // Timer interrupt service routine
236 void _PM_IRQ_HANDLER(void) {
237  ((Tc *)(((Protomatter_core *)_PM_protoPtr)->timer))->COUNT16.INTFLAG.reg =
238  TC_INTFLAG_OVF;
239  _PM_row_handler(_PM_protoPtr); // In core.c
240 }
241 
242 #else
243 
244 // Other port byte offset macros, timer and ISR work go here.
245 
246 #endif
247 
248 // Code below diverges for SAMD51 vs SAMD21, but is still very similar...
249 // If making a change or bug fix in one, check to see if an equivalent
250 // change should be made in the other!
251 
252 #endif // __SAMD51__ || _SAMD21_
253 
254 // SAMD51-SPECIFIC CODE ----------------------------------------------------
255 
256 #if defined(__SAMD51__)
257 
258 #if defined(ARDUINO)
259 
260 // g_APinDescription[] table and pin indices are Arduino specific:
261 #define _PM_portOutRegister(pin) \
262  &PORT->Group[g_APinDescription[pin].ulPort].OUT.reg
263 
264 #define _PM_portSetRegister(pin) \
265  &PORT->Group[g_APinDescription[pin].ulPort].OUTSET.reg
266 
267 #define _PM_portClearRegister(pin) \
268  &PORT->Group[g_APinDescription[pin].ulPort].OUTCLR.reg
269 
270 #define _PM_portToggleRegister(pin) \
271  &PORT->Group[g_APinDescription[pin].ulPort].OUTTGL.reg
272 
273 #elif defined(CIRCUITPY)
274 
275 #include "hal_gpio.h"
276 
277 #define _PM_portOutRegister(pin) (&PORT->Group[(pin / 32)].OUT.reg)
278 
279 #define _PM_portSetRegister(pin) (&PORT->Group[(pin / 32)].OUTSET.reg)
280 
281 #define _PM_portClearRegister(pin) (&PORT->Group[(pin / 32)].OUTCLR.reg)
282 
283 #define _PM_portToggleRegister(pin) (&PORT->Group[(pin / 32)].OUTTGL.reg)
284 
285 #else
286 
287 // Other port register lookups go here
288 
289 #endif
290 
291 // Initialize, but do not start, timer
292 void _PM_timerInit(void *tptr) {
293  static const struct {
294  Tc *tc; // -> Timer/counter peripheral base address
295  IRQn_Type IRQn; // Interrupt number
296  uint8_t GCLK_ID; // Peripheral channel # for clock source
297  } timer[] = {
298 #if defined(TC0)
299  {TC0, TC0_IRQn, TC0_GCLK_ID},
300 #endif
301 #if defined(TC1)
302  {TC1, TC1_IRQn, TC1_GCLK_ID},
303 #endif
304 #if defined(TC2)
305  {TC2, TC2_IRQn, TC2_GCLK_ID},
306 #endif
307 #if defined(TC3)
308  {TC3, TC3_IRQn, TC3_GCLK_ID},
309 #endif
310 #if defined(TC4)
311  {TC4, TC4_IRQn, TC4_GCLK_ID},
312 #endif
313 #if defined(TC5)
314  {TC5, TC5_IRQn, TC5_GCLK_ID},
315 #endif
316 #if defined(TC6)
317  {TC6, TC6_IRQn, TC6_GCLK_ID},
318 #endif
319 #if defined(TC7)
320  {TC7, TC7_IRQn, TC7_GCLK_ID},
321 #endif
322 #if defined(TC8)
323  {TC8, TC8_IRQn, TC8_GCLK_ID},
324 #endif
325 #if defined(TC9)
326  {TC9, TC9_IRQn, TC9_GCLK_ID},
327 #endif
328 #if defined(TC10)
329  {TC10, TC10_IRQn, TC10_GCLK_ID},
330 #endif
331 #if defined(TC11)
332  {TC11, TC11_IRQn, TC11_GCLK_ID},
333 #endif
334 #if defined(TC12)
335  {TC12, TC12_IRQn, TC12_GCLK_ID},
336 #endif
337  };
338 #define NUM_TIMERS (sizeof timer / sizeof timer[0])
339 
340  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
341 
342  uint8_t timerNum = 0;
343  while ((timerNum < NUM_TIMERS) && (timer[timerNum].tc != tc)) {
344  timerNum++;
345  }
346  if (timerNum >= NUM_TIMERS)
347  return;
348 
349  // Feed timer/counter off GCLK1 (already set 48 MHz by Arduino core).
350  // Sure, SAMD51 can run timers up to F_CPU (e.g. 120 MHz or up to
351  // 200 MHz with overclocking), but on higher bitplanes (which have
352  // progressively longer timer periods) I could see this possibly
353  // exceeding a 16-bit timer, and would have to switch prescalers.
354  // We don't actually need atomic precision on the timer -- point is
355  // simply that the period doubles with each bitplane, and this can
356  // work fine at 48 MHz.
357  GCLK->PCHCTRL[timer[timerNum].GCLK_ID].bit.CHEN = 0; // Disable
358  while (GCLK->PCHCTRL[timer[timerNum].GCLK_ID].bit.CHEN)
359  ; // Wait for it
360  GCLK_PCHCTRL_Type pchctrl; // Read-modify-store
361  pchctrl.reg = GCLK->PCHCTRL[timer[timerNum].GCLK_ID].reg;
362  pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK1_Val;
363  pchctrl.bit.CHEN = 1;
364  GCLK->PCHCTRL[timer[timerNum].GCLK_ID].reg = pchctrl.reg;
365  while (!GCLK->PCHCTRL[timer[timerNum].GCLK_ID].bit.CHEN)
366  ;
367 
368  // Disable timer before configuring it
369  tc->COUNT16.CTRLA.bit.ENABLE = 0;
370  while (tc->COUNT16.SYNCBUSY.bit.ENABLE)
371  ;
372 
373  // 16-bit counter mode, 1:1 prescale
374  tc->COUNT16.CTRLA.bit.MODE = TC_CTRLA_MODE_COUNT16;
375  tc->COUNT16.CTRLA.bit.PRESCALER = TC_CTRLA_PRESCALER_DIV1_Val;
376 
377  tc->COUNT16.WAVE.bit.WAVEGEN =
378  TC_WAVE_WAVEGEN_MFRQ_Val; // Match frequency generation mode (MFRQ)
379 
380  tc->COUNT16.CTRLBCLR.reg = TC_CTRLBCLR_DIR; // Count up
381  while (tc->COUNT16.SYNCBUSY.bit.CTRLB)
382  ;
383 
384  // Overflow interrupt
385  tc->COUNT16.INTENSET.reg = TC_INTENSET_OVF;
386 
387  NVIC_DisableIRQ(timer[timerNum].IRQn);
388  NVIC_ClearPendingIRQ(timer[timerNum].IRQn);
389  NVIC_SetPriority(timer[timerNum].IRQn, 0); // Top priority
390  NVIC_EnableIRQ(timer[timerNum].IRQn);
391 
392  // Timer is configured but NOT enabled by default
393 }
394 
395 // Set timer period, initialize count value to zero, enable timer.
396 // Timer must be initialized to 16-bit mode using the init function
397 // above, but must be inactive before calling this.
398 inline void _PM_timerStart(void *tptr, uint32_t period) {
399  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
400  tc->COUNT16.COUNT.reg = 0;
401  while (tc->COUNT16.SYNCBUSY.bit.COUNT)
402  ;
403  tc->COUNT16.CC[0].reg = period;
404  while (tc->COUNT16.SYNCBUSY.bit.CC0)
405  ;
406  tc->COUNT16.CTRLA.bit.ENABLE = 1;
407  while (tc->COUNT16.SYNCBUSY.bit.STATUS)
408  ;
409 }
410 
411 // Return current count value (timer enabled or not).
412 // Timer must be previously initialized.
413 inline uint32_t _PM_timerGetCount(void *tptr) {
414  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
415  tc->COUNT16.CTRLBSET.bit.CMD = 0x4; // Sync COUNT
416  while (tc->COUNT16.CTRLBSET.bit.CMD)
417  ; // Wait for command
418  return tc->COUNT16.COUNT.reg;
419 }
420 
421 // Disable timer and return current count value.
422 // Timer must be previously initialized.
423 uint32_t _PM_timerStop(void *tptr) {
424  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
425  uint32_t count = _PM_timerGetCount(tptr);
426  tc->COUNT16.CTRLA.bit.ENABLE = 0;
427  while (tc->COUNT16.SYNCBUSY.bit.STATUS)
428  ;
429  return count;
430 }
431 
432 // See notes in core.c before the "blast" functions
433 #if F_CPU >= 200000000
434 #define _PM_clockHoldHigh asm("nop; nop; nop; nop; nop");
435 #define _PM_clockHoldLow asm("nop; nop");
436 #elif F_CPU >= 180000000
437 #define _PM_clockHoldHigh asm("nop; nop; nop; nop");
438 #define _PM_clockHoldLow asm("nop");
439 #elif F_CPU >= 150000000
440 #define _PM_clockHoldHigh asm("nop; nop; nop");
441 #define _PM_clockHoldLow asm("nop");
442 #else
443 #define _PM_clockHoldHigh asm("nop; nop; nop");
444 #define _PM_clockHoldLow asm("nop");
445 #endif
446 
447 #define _PM_minMinPeriod 160
448 
449 #endif // end __SAMD51__
450 
451 // SAMD21-SPECIFIC CODE ----------------------------------------------------
452 
453 #if defined(_SAMD21_)
454 
455 #if defined(ARDUINO)
456 
457 // g_APinDescription[] table and pin indices are Arduino specific:
458 #define _PM_portOutRegister(pin) \
459  &PORT_IOBUS->Group[g_APinDescription[pin].ulPort].OUT.reg
460 
461 #define _PM_portSetRegister(pin) \
462  &PORT_IOBUS->Group[g_APinDescription[pin].ulPort].OUTSET.reg
463 
464 #define _PM_portClearRegister(pin) \
465  &PORT_IOBUS->Group[g_APinDescription[pin].ulPort].OUTCLR.reg
466 
467 #define _PM_portToggleRegister(pin) \
468  &PORT_IOBUS->Group[g_APinDescription[pin].ulPort].OUTTGL.reg
469 
470 #else
471 
472 // Non-Arduino port register lookups go here
473 
474 #endif
475 
476 // Initialize, but do not start, timer
477 void _PM_timerInit(void *tptr) {
478  static const struct {
479  Tc *tc; // -> Timer/counter peripheral base address
480  IRQn_Type IRQn; // Interrupt number
481  uint8_t GCM_ID; // GCLK selection ID
482  } timer[] = {
483 #if defined(TC0)
484  {TC0, TC0_IRQn, GCM_TCC0_TCC1},
485 #endif
486 #if defined(TC1)
487  {TC1, TC1_IRQn, GCM_TCC0_TCC1},
488 #endif
489 #if defined(TC2)
490  {TC2, TC2_IRQn, GCM_TCC2_TC3},
491 #endif
492 #if defined(TC3)
493  {TC3, TC3_IRQn, GCM_TCC2_TC3},
494 #endif
495 #if defined(TC4)
496  {TC4, TC4_IRQn, GCM_TC4_TC5},
497 #endif
498  };
499 #define NUM_TIMERS (sizeof timer / sizeof timer[0])
500 
501  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
502 
503  uint8_t timerNum = 0;
504  while ((timerNum < NUM_TIMERS) && (timer[timerNum].tc != tc)) {
505  timerNum++;
506  }
507  if (timerNum >= NUM_TIMERS)
508  return;
509 
510  // Enable GCLK for timer/counter
511  GCLK->CLKCTRL.reg = (uint16_t)(GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 |
512  GCLK_CLKCTRL_ID(timer[timerNum].GCM_ID));
513  while (GCLK->STATUS.bit.SYNCBUSY == 1)
514  ;
515 
516  // Counter must first be disabled to configure it
517  tc->COUNT16.CTRLA.bit.ENABLE = 0;
518  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
519  ;
520 
521  tc->COUNT16.CTRLA.reg = // Configure timer counter
522  TC_CTRLA_PRESCALER_DIV1 | // 1:1 Prescale
523  TC_CTRLA_WAVEGEN_MFRQ | // Match frequency generation mode (MFRQ)
524  TC_CTRLA_MODE_COUNT16; // 16-bit counter mode
525  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
526  ;
527 
528  tc->COUNT16.CTRLBCLR.reg = TCC_CTRLBCLR_DIR; // Count up
529  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
530  ;
531 
532  // Overflow interrupt
533  tc->COUNT16.INTENSET.reg = TC_INTENSET_OVF;
534 
535  NVIC_DisableIRQ(timer[timerNum].IRQn);
536  NVIC_ClearPendingIRQ(timer[timerNum].IRQn);
537  NVIC_SetPriority(timer[timerNum].IRQn, 0); // Top priority
538  NVIC_EnableIRQ(timer[timerNum].IRQn);
539 
540  // Timer is configured but NOT enabled by default
541 }
542 
543 // Set timer period, initialize count value to zero, enable timer.
544 // Timer must be initialized to 16-bit mode using the init function
545 // above, but must be inactive before calling this.
546 inline void _PM_timerStart(void *tptr, uint32_t period) {
547  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
548  tc->COUNT16.COUNT.reg = 0;
549  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
550  ;
551  tc->COUNT16.CC[0].reg = period;
552  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
553  ;
554  tc->COUNT16.CTRLA.bit.ENABLE = 1;
555  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
556  ;
557 }
558 
559 // Return current count value (timer enabled or not).
560 // Timer must be previously initialized.
561 inline uint32_t _PM_timerGetCount(void *tptr) {
562  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
563  tc->COUNT16.READREQ.reg = TC_READREQ_RCONT | TC_READREQ_ADDR(0x10);
564  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
565  ;
566  return tc->COUNT16.COUNT.reg;
567 }
568 
569 // Disable timer and return current count value.
570 // Timer must be previously initialized.
571 inline uint32_t _PM_timerStop(void *tptr) {
572  Tc *tc = (Tc *)tptr; // Cast peripheral address passed in
573  uint32_t count = _PM_timerGetCount(tptr);
574  tc->COUNT16.CTRLA.bit.ENABLE = 0;
575  while (tc->COUNT16.STATUS.bit.SYNCBUSY)
576  ;
577  return count;
578 }
579 
580 #endif // _SAMD21_
581 
582 // NRF52-SPECIFIC CODE -----------------------------------------------------
583 
584 #if defined(NRF52_SERIES)
585 
586 #if defined(ARDUINO)
587 
588 // digitalPinToPort, g_ADigitalPinMap[] are Arduino specific:
589 
590 void *_PM_portOutRegister(uint32_t pin) {
591  NRF_GPIO_Type *port = digitalPinToPort(pin);
592  return &port->OUT;
593 }
594 
595 void *_PM_portSetRegister(uint32_t pin) {
596  NRF_GPIO_Type *port = digitalPinToPort(pin);
597  return &port->OUTSET;
598 }
599 
600 void *_PM_portClearRegister(uint32_t pin) {
601  NRF_GPIO_Type *port = digitalPinToPort(pin);
602  return &port->OUTCLR;
603 }
604 
605 // Leave _PM_portToggleRegister(pin) undefined on nRF!
606 
607 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
608 #define _PM_byteOffset(pin) ((g_ADigitalPinMap[pin] & 0x1F) / 8)
609 #define _PM_wordOffset(pin) ((g_ADigitalPinMap[pin] & 0x1F) / 16)
610 #else
611 #define _PM_byteOffset(pin) (3 - ((g_ADigitalPinMap[pin] & 0x1F) / 8))
612 #define _PM_wordOffset(pin) (1 - ((g_ADigitalPinMap[pin] & 0x1F) / 16))
613 #endif
614 
615 // Because it's tied to a specific timer right now, there can be only
616 // one instance of the Protomatter_core struct. The Arduino library
617 // sets up this pointer when calling begin().
618 void *_PM_protoPtr = NULL;
619 
620 // Arduino implementation is tied to a specific timer/counter,
621 // Partly because IRQs must be declared at compile-time.
622 #define _PM_IRQ_HANDLER TIMER4_IRQHandler
623 #define _PM_timerFreq 16000000
624 #define _PM_TIMER_DEFAULT NRF_TIMER4
625 
626 #ifdef __cplusplus
627 extern "C" {
628 #endif
629 
630 // Timer interrupt service routine
631 void _PM_IRQ_HANDLER(void) {
632  if (_PM_TIMER_DEFAULT->EVENTS_COMPARE[0]) {
633  _PM_TIMER_DEFAULT->EVENTS_COMPARE[0] = 0;
634  }
635  _PM_row_handler(_PM_protoPtr); // In core.c
636 }
637 
638 #ifdef __cplusplus
639 }
640 #endif
641 
642 #elif defined(CIRCUITPY)
643 
644 #include "nrf_gpio.h"
645 
646 volatile uint32_t *_PM_portOutRegister(uint32_t pin) {
647  NRF_GPIO_Type *port = nrf_gpio_pin_port_decode(&pin);
648  return &port->OUT;
649 }
650 
651 volatile uint32_t *_PM_portSetRegister(uint32_t pin) {
652  NRF_GPIO_Type *port = nrf_gpio_pin_port_decode(&pin);
653  return &port->OUTSET;
654 }
655 
656 volatile uint32_t *_PM_portClearRegister(uint32_t pin) {
657  NRF_GPIO_Type *port = nrf_gpio_pin_port_decode(&pin);
658  return &port->OUTCLR;
659 }
660 #define _PM_pinOutput(pin) \
661  nrf_gpio_cfg(pin, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, \
662  NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_H0H1, NRF_GPIO_PIN_NOSENSE)
663 #define _PM_pinInput(pin) nrf_gpio_cfg_input(pin)
664 #define _PM_pinHigh(pin) nrf_gpio_pin_set(pin)
665 #define _PM_pinLow(pin) nrf_gpio_pin_clear(pin)
666 #define _PM_portBitMask(pin) (1u << ((pin) % 32))
667 
668 #define _PM_byteOffset(pin) ((pin % 32) / 8)
669 #define _PM_wordOffset(pin) ((pin % 32) / 16)
670 
671 #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
672 #error SRSLY
673 #endif
674 
675 // CircuitPython implementation is tied to a specific freq (but the counter
676 // is dynamically allocated):
677 #define _PM_timerFreq 16000000
678 
679 // Because it's tied to a specific timer right now, there can be only
680 // one instance of the Protomatter_core struct. The Arduino library
681 // sets up this pointer when calling begin().
682 void *_PM_protoPtr = NULL;
683 
684 // Timer interrupt service routine
685 void _PM_IRQ_HANDLER(void) {
686  NRF_TIMER_Type *timer = (((Protomatter_core *)_PM_protoPtr)->timer);
687  if (timer->EVENTS_COMPARE[0]) {
688  timer->EVENTS_COMPARE[0] = 0;
689  }
690 
691  _PM_row_handler(_PM_protoPtr); // In core.c
692 }
693 
694 #else
695 
696 // Non-arduino byte offset macros, timer and ISR work go here.
697 
698 #endif
699 
700 void _PM_timerInit(void *tptr) {
701  static const struct {
702  NRF_TIMER_Type *tc; // -> Timer peripheral base address
703  IRQn_Type IRQn; // Interrupt number
704  } timer[] = {
705 #if defined(NRF_TIMER0)
706  {NRF_TIMER0, TIMER0_IRQn},
707 #endif
708 #if defined(NRF_TIMER1)
709  {NRF_TIMER1, TIMER1_IRQn},
710 #endif
711 #if defined(NRF_TIMER2)
712  {NRF_TIMER2, TIMER2_IRQn},
713 #endif
714 #if defined(NRF_TIMER3)
715  {NRF_TIMER3, TIMER3_IRQn},
716 #endif
717 #if defined(NRF_TIMER4)
718  {NRF_TIMER4, TIMER4_IRQn},
719 #endif
720  };
721 #define NUM_TIMERS (sizeof timer / sizeof timer[0])
722 
723  // Determine IRQn from timer address
724  uint8_t timerNum = 0;
725  while ((timerNum < NUM_TIMERS) && (timer[timerNum].tc != tptr)) {
726  timerNum++;
727  }
728  if (timerNum >= NUM_TIMERS)
729  return;
730 
731  NRF_TIMER_Type *tc = timer[timerNum].tc;
732 
733  tc->TASKS_STOP = 1; // Stop timer
734  tc->MODE = TIMER_MODE_MODE_Timer; // Timer (not counter) mode
735  tc->TASKS_CLEAR = 1;
736  tc->BITMODE = TIMER_BITMODE_BITMODE_16Bit
737  << TIMER_BITMODE_BITMODE_Pos; // 16-bit timer res
738  tc->PRESCALER = 0; // 1:1 prescale (16 MHz)
739  tc->INTENSET = TIMER_INTENSET_COMPARE0_Enabled
740  << TIMER_INTENSET_COMPARE0_Pos; // Event 0 interrupt
741  // NVIC_DisableIRQ(timer[timerNum].IRQn);
742  // NVIC_ClearPendingIRQ(timer[timerNum].IRQn);
743  // NVIC_SetPriority(timer[timerNum].IRQn, 0); // Top priority
744  NVIC_EnableIRQ(timer[timerNum].IRQn);
745 }
746 
747 inline void _PM_timerStart(void *tptr, uint32_t period) {
748  volatile NRF_TIMER_Type *tc = (volatile NRF_TIMER_Type *)tptr;
749  tc->TASKS_STOP = 1; // Stop timer
750  tc->TASKS_CLEAR = 1; // Reset to 0
751  tc->CC[0] = period;
752  tc->TASKS_START = 1; // Start timer
753 }
754 
755 inline uint32_t _PM_timerGetCount(void *tptr) {
756  volatile NRF_TIMER_Type *tc = (volatile NRF_TIMER_Type *)tptr;
757  tc->TASKS_CAPTURE[0] = 1; // Capture timer to CC[n] register
758  return tc->CC[0];
759 }
760 
761 uint32_t _PM_timerStop(void *tptr) {
762  volatile NRF_TIMER_Type *tc = (volatile NRF_TIMER_Type *)tptr;
763  tc->TASKS_STOP = 1; // Stop timer
764  __attribute__((unused)) uint32_t count = _PM_timerGetCount(tptr);
765  // NOTE TO FUTURE SELF: I don't know why the GetCount code isn't
766  // working. It does the expected thing in a small test program but
767  // not here. I need to get on with testing on an actual matrix, so
768  // this is just a nonsense fudge value for now:
769  return 100;
770  // return count;
771 }
772 
773 #define _PM_clockHoldHigh asm("nop; nop");
774 
775 #define _PM_minMinPeriod 100
776 
777 #endif // NRF52_SERIES
778 
779 // STM32F4xx SPECIFIC CODE -------------------------------------------------
780 #if defined(STM32F4_SERIES)
781 #if defined(ARDUINO)
782 // Arduino port register lookups go here
783 #elif defined(CIRCUITPY)
784 
785 #undef _PM_portBitMask
786 #define _PM_portBitMask(pin) (1u << ((pin) % 16))
787 #define _PM_byteOffset(pin) ((pin % 16) / 8)
788 #define _PM_wordOffset(pin) ((pin % 16) / 16)
789 
790 #define _PM_pinOutput(pin_) \
791  do { \
792  int8_t pin = (pin_); \
793  GPIO_InitTypeDef GPIO_InitStruct = {0}; \
794  GPIO_InitStruct.Pin = 1 << (pin % 16); \
795  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \
796  GPIO_InitStruct.Pull = GPIO_NOPULL; \
797  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; \
798  HAL_GPIO_Init(pin_port(pin / 16), &GPIO_InitStruct); \
799  } while (0)
800 #define _PM_pinInput(pin_) \
801  do { \
802  int8_t pin = (pin_); \
803  GPIO_InitTypeDef GPIO_InitStruct = {0}; \
804  GPIO_InitStruct.Pin = 1 << (pin % 16); \
805  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \
806  GPIO_InitStruct.Pull = GPIO_NOPULL; \
807  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; \
808  HAL_GPIO_Init(pin_port(pin / 16), &GPIO_InitStruct); \
809  } while (0)
810 #define _PM_pinHigh(pin) \
811  HAL_GPIO_WritePin(pin_port(pin / 16), 1 << (pin % 16), GPIO_PIN_SET)
812 #define _PM_pinLow(pin) \
813  HAL_GPIO_WritePin(pin_port(pin / 16), 1 << (pin % 16), GPIO_PIN_RESET)
814 
815 #define _PM_PORT_TYPE uint16_t
816 
817 volatile uint16_t *_PM_portOutRegister(uint32_t pin) {
818  return (uint16_t *)&pin_port(pin / 16)->ODR;
819 }
820 
821 volatile uint16_t *_PM_portSetRegister(uint32_t pin) {
822  return (uint16_t *)&pin_port(pin / 16)->BSRR;
823 }
824 
825 // To make things interesting, STM32F4xx places the set and clear
826 // GPIO bits within a single register. The "clear" bits are upper, so
827 // offset by 1 in uint16_ts
828 volatile uint16_t *_PM_portClearRegister(uint32_t pin) {
829  return 1 + (uint16_t *)&pin_port(pin / 16)->BSRR;
830 }
831 
832 // Use hard-coded TIM6 (TIM7 is used by PulseOut, other TIM by PWMOut)
833 #define _PM_timerFreq 42000000
834 
835 // Because it's tied to a specific timer right now, there can be only
836 // one instance of the Protomatter_core struct. The Arduino library
837 // sets up this pointer when calling begin().
838 void *_PM_protoPtr = NULL;
839 
840 STATIC TIM_HandleTypeDef t6_handle;
841 
842 #define _PM_IRQ_HANDLER TIM6_DAC_IRQHandler
843 
844 // Timer interrupt service routine
845 void _PM_IRQ_HANDLER(void) {
846  // Clear overflow flag:
847  //_PM_TIMER_DEFAULT->COUNT16.INTFLAG.reg = TC_INTFLAG_OVF;
848  _PM_row_handler(_PM_protoPtr); // In core.c
849 }
850 
851 // Initialize, but do not start, timer
852 void _PM_timerInit(void *tptr) {
853  __HAL_RCC_TIM6_CLK_ENABLE();
854 
855  t6_handle.Instance = TIM6;
856  t6_handle.Init.Period = 1000; // immediately replaced.
857  t6_handle.Init.Prescaler = 0;
858  t6_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
859  t6_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
860  t6_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
861 
862  HAL_TIM_Base_Init(&t6_handle);
863 
864  HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);
865  NVIC_ClearPendingIRQ(TIM6_DAC_IRQn);
866  NVIC_SetPriority(TIM6_DAC_IRQn, 0); // Top priority
867 }
868 
869 inline void _PM_timerStart(void *tptr, uint32_t period) {
870  TIM_TypeDef *tim = tptr;
871  tim->SR = 0;
872  tim->ARR = period;
873  tim->CR1 |= TIM_CR1_CEN;
874  tim->DIER |= TIM_DIER_UIE;
875  HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
876 }
877 
878 uint32_t _PM_timerStop(void *tptr) {
879  HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);
880  TIM_TypeDef *tim = tptr;
881  tim->CR1 &= ~TIM_CR1_CEN;
882  tim->DIER &= ~TIM_DIER_UIE;
883  return tim->CNT;
884 }
885 // settings from M4 for >= 150MHz, we use this part at 168MHz
886 #define _PM_clockHoldHigh asm("nop; nop; nop");
887 #define _PM_clockHoldLow asm("nop");
888 
889 #define _PM_minMinPeriod 140
890 
891 #endif
892 #endif // STM32F4_SERIES
893 
894 // ESP32-SPECIFIC CODE -----------------------------------------------------
895 
896 #if defined(ARDUINO_ARCH_ESP32)
897 #endif // ARDUINO_ARCH_ESP32
898 
899 // DEFAULTS IF NOT DEFINED ABOVE -------------------------------------------
900 
901 #if !defined(_PM_chunkSize)
902 #define _PM_chunkSize 8
903 #endif
904 
905 #if !defined(_PM_clockHoldHigh)
906 #define _PM_clockHoldHigh
907 #endif
908 
909 #if !defined(_PM_clockHoldLow)
910 #define _PM_clockHoldLow
911 #endif
912 
913 #if !defined(_PM_minMinPeriod)
914 #define _PM_minMinPeriod 100
915 #endif
916 
917 #ifndef _PM_ALLOCATOR
918 #define _PM_ALLOCATOR(x) (malloc((x)))
919 #endif
920 
921 #ifndef _PM_FREE
922 #define _PM_FREE(x) (free((x)))
923 #endif
924 
925 // ARDUINO SPECIFIC CODE ---------------------------------------------------
926 
927 #if defined(ARDUINO) || defined(CIRCUITPY)
928 
929 // 16-bit (565) color conversion functions go here (rather than in the
930 // Arduino lib .cpp) because knowledge is required of chunksize and the
931 // toggle register (or lack thereof), which are only known to this file,
932 // not the .cpp or anywhere else
933 // However...this file knows nothing of the GFXcanvas16 type (from
934 // Adafruit_GFX...another C++ lib), so the .cpp just passes down some
935 // pointers and minimal info about the canvas buffer.
936 // It's probably not ideal but this is my life now, oh well.
937 
938 // Different runtime environments (which might not use the 565 canvas
939 // format) will need their own conversion functions.
940 
941 // There are THREE COPIES of the following function -- one each for byte,
942 // word and long. If changes are made in any one of them, the others MUST
943 // be updated to match! Note that they are not simple duplicates of each
944 // other. The byte case, for example, doesn't need to handle parallel
945 // matrix chains (matrix data can only be byte-sized if one chain).
946 
947 // width argument comes from GFX canvas width, which may be less than
948 // core's bitWidth (due to padding). height isn't needed, it can be
949 // inferred from core->numRowPairs.
950 __attribute__((noinline)) void _PM_convert_565_byte(Protomatter_core *core,
951  const uint16_t *source,
952  uint16_t width) {
953  const uint16_t *upperSrc = source; // Canvas top half
954  const uint16_t *lowerSrc =
955  source + width * core->numRowPairs; // " bottom half
956  uint8_t *pinMask = (uint8_t *)core->rgbMask; // Pin bitmasks
957  uint8_t *dest = (uint8_t *)core->screenData;
958  if (core->doubleBuffer) {
959  dest += core->bufferSize * (1 - core->activeBuffer);
960  }
961 
962  // No need to clear matrix buffer, loops below do a full overwrite
963  // (except for any scanline pad, which was already initialized in the
964  // begin() function and won't be touched here).
965 
966  // Determine matrix bytes per bitplane & row (row pair really):
967 
968  uint32_t bitplaneSize =
969  _PM_chunkSize *
970  ((width + (_PM_chunkSize - 1)) / _PM_chunkSize); // 1 plane of row pair
971  uint8_t pad = bitplaneSize - width; // Start-of-plane pad
972 
973  // Skip initial scanline padding if present (HUB75 matrices shift data
974  // in from right-to-left, so if we need scanline padding it occurs at
975  // the start of a line, rather than the usual end). Destination pointer
976  // passed in already handles double-buffer math, so we don't need to
977  // handle that here, just the pad...
978  dest += pad;
979 
980  uint32_t initialRedBit, initialGreenBit, initialBlueBit;
981  if (core->numPlanes == 6) {
982  // If numPlanes is 6, red and blue are expanded from 5 to 6 bits.
983  // This involves duplicating the MSB of the 5-bit value to the LSB
984  // of its corresponding 6-bit value...or in this case, bitmasks for
985  // red and blue are initially assigned to canvas MSBs, while green
986  // starts at LSB (because it's already 6-bit). Inner loop below then
987  // wraps red & blue after the first bitplane.
988  initialRedBit = 0b1000000000000000; // MSB red
989  initialGreenBit = 0b0000000000100000; // LSB green
990  initialBlueBit = 0b0000000000010000; // MSB blue
991  } else {
992  // If numPlanes is 1 to 5, no expansion is needed, and one or all
993  // three color components might be decimated by some number of bits.
994  // The initial bitmasks are set to the components' numPlanesth bit
995  // (e.g. for 5 planes, start at red & blue bit #0, green bit #1,
996  // for 4 planes, everything starts at the next bit up, etc.).
997  uint8_t shiftLeft = 5 - core->numPlanes;
998  initialRedBit = 0b0000100000000000 << shiftLeft;
999  initialGreenBit = 0b0000000001000000 << shiftLeft;
1000  initialBlueBit = 0b0000000000000001 << shiftLeft;
1001  }
1002 
1003  // This works sequentially-ish through the destination buffer,
1004  // reading from the canvas source pixels in repeated passes,
1005  // beginning from the least bit.
1006  for (uint8_t row = 0; row < core->numRowPairs; row++) {
1007  uint32_t redBit = initialRedBit;
1008  uint32_t greenBit = initialGreenBit;
1009  uint32_t blueBit = initialBlueBit;
1010  for (uint8_t plane = 0; plane < core->numPlanes; plane++) {
1011 #if defined(_PM_portToggleRegister)
1012  uint8_t prior = core->clockMask; // Set clock bit on 1st out
1013 #endif
1014  for (uint16_t x = 0; x < width; x++) {
1015  uint16_t upperRGB = upperSrc[x]; // Pixel in upper half
1016  uint16_t lowerRGB = lowerSrc[x]; // Pixel in lower half
1017  uint8_t result = 0;
1018  if (upperRGB & redBit)
1019  result |= pinMask[0];
1020  if (upperRGB & greenBit)
1021  result |= pinMask[1];
1022  if (upperRGB & blueBit)
1023  result |= pinMask[2];
1024  if (lowerRGB & redBit)
1025  result |= pinMask[3];
1026  if (lowerRGB & greenBit)
1027  result |= pinMask[4];
1028  if (lowerRGB & blueBit)
1029  result |= pinMask[5];
1030 #if defined(_PM_portToggleRegister)
1031  dest[x] = result ^ prior;
1032  prior = result | core->clockMask; // Set clock bit on next out
1033 #else
1034  dest[x] = result;
1035 #endif
1036  } // end x
1037  greenBit <<= 1;
1038  if (plane || (core->numPlanes < 6)) {
1039  // In most cases red & blue bit scoot 1 left...
1040  redBit <<= 1;
1041  blueBit <<= 1;
1042  } else {
1043  // Exception being after bit 0 with 6-plane display,
1044  // in which case they're reset to red & blue LSBs
1045  // (so 5-bit colors are expanded to 6 bits).
1046  redBit = 0b0000100000000000;
1047  blueBit = 0b0000000000000001;
1048  }
1049 #if defined(_PM_portToggleRegister)
1050  // If using bit-toggle register, erase the toggle bit on the
1051  // first element of each bitplane & row pair. The matrix-driving
1052  // interrupt functions correspondingly set the clock low before
1053  // finishing. This is all done for legibility on oscilloscope --
1054  // so idle clock appears LOW -- but really the matrix samples on
1055  // a rising edge and we could leave it high, but at this stage
1056  // in development just want the scope "readable."
1057  dest[-pad] &= ~core->clockMask; // Negative index is legal & intentional
1058 #endif
1059  dest += bitplaneSize; // Advance one scanline in dest buffer
1060  } // end plane
1061  upperSrc += width; // Advance one scanline in source buffer
1062  lowerSrc += width;
1063  } // end row
1064 }
1065 
1066 // Corresponding function for word output -- either 12 RGB bits (2 parallel
1067 // matrix chains), or 1 chain with RGB bits not in the same byte (but in the
1068 // same 16-bit word). Some of the comments have been stripped out since it's
1069 // largely the same operation, but changes are noted.
1070 void _PM_convert_565_word(Protomatter_core *core, uint16_t *source,
1071  uint16_t width) {
1072  uint16_t *upperSrc = source; // Matrix top half
1073  uint16_t *lowerSrc = source + width * core->numRowPairs; // " bottom half
1074  uint16_t *pinMask = (uint16_t *)core->rgbMask; // Pin bitmasks
1075  uint16_t *dest = (uint16_t *)core->screenData;
1076  if (core->doubleBuffer) {
1077  dest += core->bufferSize / core->bytesPerElement * (1 - core->activeBuffer);
1078  }
1079 
1080  uint32_t bitplaneSize =
1081  _PM_chunkSize *
1082  ((width + (_PM_chunkSize - 1)) / _PM_chunkSize); // 1 plane of row pair
1083  uint8_t pad = bitplaneSize - width; // Start-of-plane pad
1084 
1085  uint32_t initialRedBit, initialGreenBit, initialBlueBit;
1086  if (core->numPlanes == 6) {
1087  initialRedBit = 0b1000000000000000; // MSB red
1088  initialGreenBit = 0b0000000000100000; // LSB green
1089  initialBlueBit = 0b0000000000010000; // MSB blue
1090  } else {
1091  uint8_t shiftLeft = 5 - core->numPlanes;
1092  initialRedBit = 0b0000100000000000 << shiftLeft;
1093  initialGreenBit = 0b0000000001000000 << shiftLeft;
1094  initialBlueBit = 0b0000000000000001 << shiftLeft;
1095  }
1096 
1097  // Unlike the 565 byte converter, the word converter DOES clear out the
1098  // matrix buffer (because each chain is OR'd into place). If a toggle
1099  // register exists, "clear" really means the clock mask is set in all
1100  // but the first element on a scanline (per bitplane). If no toggle
1101  // register, can just zero everything out.
1102 #if defined(_PM_portToggleRegister)
1103  // No per-chain loop is required; one clock bit handles all chains
1104  uint32_t offset = 0; // Current position in the 'dest' buffer
1105  for (uint8_t row = 0; row < core->numRowPairs; row++) {
1106  for (uint8_t plane = 0; plane < core->numPlanes; plane++) {
1107  dest[offset++] = 0; // First element of each plane
1108  for (uint16_t x = 1; x < bitplaneSize; x++) { // All subsequent items
1109  dest[offset++] = core->clockMask;
1110  }
1111  }
1112  }
1113 #else
1114  memset(dest, 0, core->bufferSize);
1115 #endif
1116 
1117  dest += pad; // Pad value is in 'elements,' not bytes, so this is OK
1118 
1119  // After a set of rows+bitplanes are processed, upperSrc and lowerSrc
1120  // have advanced halfway down one matrix. This offset is used after
1121  // each chain to advance them to the start/middle of the next matrix.
1122  uint32_t halfMatrixOffset = width * core->numPlanes * core->numRowPairs;
1123 
1124  for (uint8_t chain = 0; chain < core->parallel; chain++) {
1125  for (uint8_t row = 0; row < core->numRowPairs; row++) {
1126  uint32_t redBit = initialRedBit;
1127  uint32_t greenBit = initialGreenBit;
1128  uint32_t blueBit = initialBlueBit;
1129  for (uint8_t plane = 0; plane < core->numPlanes; plane++) {
1130 #if defined(_PM_portToggleRegister)
1131  // Since we're ORing in bits over an existing clock bit,
1132  // prior is 0 rather than clockMask as in the byte case.
1133  uint16_t prior = 0;
1134 #endif
1135  for (uint16_t x = 0; x < width; x++) {
1136  uint16_t upperRGB = upperSrc[x]; // Pixel in upper half
1137  uint16_t lowerRGB = lowerSrc[x]; // Pixel in lower half
1138  uint16_t result = 0;
1139  if (upperRGB & redBit)
1140  result |= pinMask[0];
1141  if (upperRGB & greenBit)
1142  result |= pinMask[1];
1143  if (upperRGB & blueBit)
1144  result |= pinMask[2];
1145  if (lowerRGB & redBit)
1146  result |= pinMask[3];
1147  if (lowerRGB & greenBit)
1148  result |= pinMask[4];
1149  if (lowerRGB & blueBit)
1150  result |= pinMask[5];
1151  // Main difference here vs byte converter is each chain
1152  // ORs new bits into place (vs single-pass overwrite).
1153 #if defined(_PM_portToggleRegister)
1154  dest[x] |= result ^ prior; // Bitwise OR
1155  prior = result;
1156 #else
1157  dest[x] |= result; // Bitwise OR
1158 #endif
1159  } // end x
1160  greenBit <<= 1;
1161  if (plane || (core->numPlanes < 6)) {
1162  redBit <<= 1;
1163  blueBit <<= 1;
1164  } else {
1165  redBit = 0b0000100000000000;
1166  blueBit = 0b0000000000000001;
1167  }
1168  dest += bitplaneSize; // Advance one scanline in dest buffer
1169  } // end plane
1170  upperSrc += width; // Advance one scanline in source buffer
1171  lowerSrc += width;
1172  } // end row
1173  pinMask += 6; // Next chain's RGB pin masks
1174  upperSrc += halfMatrixOffset; // Advance to next matrix start pos
1175  lowerSrc += halfMatrixOffset;
1176  }
1177 }
1178 
1179 // Corresponding function for long output -- either several parallel chains
1180 // (up to 5), or 1 chain with RGB bits scattered widely about the PORT.
1181 // Same deal, comments are pared back, see above functions for explanations.
1182 void _PM_convert_565_long(Protomatter_core *core, uint16_t *source,
1183  uint16_t width) {
1184  uint16_t *upperSrc = source; // Matrix top half
1185  uint16_t *lowerSrc = source + width * core->numRowPairs; // " bottom half
1186  uint32_t *pinMask = (uint32_t *)core->rgbMask; // Pin bitmasks
1187  uint32_t *dest = (uint32_t *)core->screenData;
1188  if (core->doubleBuffer) {
1189  dest += core->bufferSize / core->bytesPerElement * (1 - core->activeBuffer);
1190  }
1191 
1192  uint32_t bitplaneSize =
1193  _PM_chunkSize *
1194  ((width + (_PM_chunkSize - 1)) / _PM_chunkSize); // 1 plane of row pair
1195  uint8_t pad = bitplaneSize - width; // Start-of-plane pad
1196 
1197  uint32_t initialRedBit, initialGreenBit, initialBlueBit;
1198  if (core->numPlanes == 6) {
1199  initialRedBit = 0b1000000000000000; // MSB red
1200  initialGreenBit = 0b0000000000100000; // LSB green
1201  initialBlueBit = 0b0000000000010000; // MSB blue
1202  } else {
1203  uint8_t shiftLeft = 5 - core->numPlanes;
1204  initialRedBit = 0b0000100000000000 << shiftLeft;
1205  initialGreenBit = 0b0000000001000000 << shiftLeft;
1206  initialBlueBit = 0b0000000000000001 << shiftLeft;
1207  }
1208 
1209 #if defined(_PM_portToggleRegister)
1210  // No per-chain loop is required; one clock bit handles all chains
1211  uint32_t offset = 0; // Current position in the 'dest' buffer
1212  for (uint8_t row = 0; row < core->numRowPairs; row++) {
1213  for (uint8_t plane = 0; plane < core->numPlanes; plane++) {
1214  dest[offset++] = 0; // First element of each plane
1215  for (uint16_t x = 1; x < bitplaneSize; x++) { // All subsequent items
1216  dest[offset++] = core->clockMask;
1217  }
1218  }
1219  }
1220 #else
1221  memset(dest, 0, core->bufferSize);
1222 #endif
1223 
1224  dest += pad; // Pad value is in 'elements,' not bytes, so this is OK
1225 
1226  uint32_t halfMatrixOffset = width * core->numPlanes * core->numRowPairs;
1227 
1228  for (uint8_t chain = 0; chain < core->parallel; chain++) {
1229  for (uint8_t row = 0; row < core->numRowPairs; row++) {
1230  uint32_t redBit = initialRedBit;
1231  uint32_t greenBit = initialGreenBit;
1232  uint32_t blueBit = initialBlueBit;
1233  for (uint8_t plane = 0; plane < core->numPlanes; plane++) {
1234 #if defined(_PM_portToggleRegister)
1235  uint32_t prior = 0;
1236 #endif
1237  for (uint16_t x = 0; x < width; x++) {
1238  uint16_t upperRGB = upperSrc[x]; // Pixel in upper half
1239  uint16_t lowerRGB = lowerSrc[x]; // Pixel in lower half
1240  uint32_t result = 0;
1241  if (upperRGB & redBit)
1242  result |= pinMask[0];
1243  if (upperRGB & greenBit)
1244  result |= pinMask[1];
1245  if (upperRGB & blueBit)
1246  result |= pinMask[2];
1247  if (lowerRGB & redBit)
1248  result |= pinMask[3];
1249  if (lowerRGB & greenBit)
1250  result |= pinMask[4];
1251  if (lowerRGB & blueBit)
1252  result |= pinMask[5];
1253  // Main difference here vs byte converter is each chain
1254  // ORs new bits into place (vs single-pass overwrite).
1255 #if defined(_PM_portToggleRegister)
1256  dest[x] |= result ^ prior; // Bitwise OR
1257  prior = result;
1258 #else
1259  dest[x] |= result; // Bitwise OR
1260 #endif
1261  } // end x
1262  greenBit <<= 1;
1263  if (plane || (core->numPlanes < 6)) {
1264  redBit <<= 1;
1265  blueBit <<= 1;
1266  } else {
1267  redBit = 0b0000100000000000;
1268  blueBit = 0b0000000000000001;
1269  }
1270  dest += bitplaneSize; // Advance one scanline in dest buffer
1271  } // end plane
1272  upperSrc += width; // Advance one scanline in source buffer
1273  lowerSrc += width;
1274  } // end row
1275  pinMask += 6; // Next chain's RGB pin masks
1276  upperSrc += halfMatrixOffset; // Advance to next matrix start pos
1277  lowerSrc += halfMatrixOffset;
1278  }
1279 }
1280 
1281 void _PM_convert_565(Protomatter_core *core, uint16_t *source, uint16_t width) {
1282  // Destination address is computed in convert function
1283  // (based on active buffer value, if double-buffering),
1284  // just need to pass in the canvas buffer address and
1285  // width in pixels.
1286  if (core->bytesPerElement == 1) {
1287  _PM_convert_565_byte(core, source, width);
1288  } else if (core->bytesPerElement == 2) {
1289  _PM_convert_565_word(core, source, width);
1290  } else {
1291  _PM_convert_565_long(core, source, width);
1292  }
1293 }
1294 
1296  if (core->doubleBuffer) {
1297  core->swapBuffers = 1;
1298  // To avoid overwriting data on the matrix, don't return
1299  // until the timer ISR has performed the swap at the right time.
1300  while (core->swapBuffers)
1301  ;
1302  }
1303 }
1304 
1305 #endif // ARDUINO || CIRCUITPYTHON
1306 
1307 #ifndef _PM_PORT_TYPE
1308 #define _PM_PORT_TYPE uint32_t
1309 #endif
1310 
1311 #endif // _PROTOMATTER_ARCH_H_
uint32_t _PM_timerGetCount(void *tptr)
Query a timer/counter peripheral&#39;s current count.
+
volatile uint8_t activeBuffer
Index of currently-displayed buf.
Definition: core.h:86
+
uint8_t numPlanes
Display bitplanes (1 to 6)
Definition: core.h:82
+
void _PM_convert_565(Protomatter_core *core, uint16_t *source, uint16_t width)
Converts image data from GFX16 canvas to the matrices weird internal format.
+
Protomatter_core * _PM_protoPtr
In core.c (via arch.h)
+
uint32_t bufferSize
Bytes per matrix buffer.
Definition: core.h:72
+
void _PM_row_handler(Protomatter_core *core)
Matrix "row handler" that&#39;s called by the timer interrupt. Handles row address lines and issuing data...
Definition: core.c:435
+
uint32_t _PM_timerStop(void *tptr)
Stop timer/counter peripheral.
+
void * rgbMask
PORT bit mask for each RGB pin.
Definition: core.h:64
+
#define _PM_chunkSize
Unroll data-stuffing loop to this size.
Definition: arch.h:902
+
bool doubleBuffer
2X buffers for clean switchover
Definition: core.h:84
+
void _PM_swapbuffer_maybe(Protomatter_core *core)
Pauses until the next vertical blank to avoid &#39;tearing&#39; animation (if display is double-buffered). If single-buffered, has no effect.
+
uint8_t bytesPerElement
Using 8, 16 or 32 bits of PORT?
Definition: core.h:77
+
volatile bool swapBuffers
If 1, awaiting double-buf switch.
Definition: core.h:90
+
uint8_t numRowPairs
Addressable row pairs.
Definition: core.h:83
+
void * screenData
Per-bitplane RGB data for matrix.
Definition: core.h:68
+
uint8_t parallel
Number of concurrent matrix outs.
Definition: core.h:79
+
void _PM_timerStart(void *tptr, uint32_t period)
Start (or restart) a timer/counter peripheral.
+
uint32_t clockMask
PORT bit mask for RGB clock.
Definition: core.h:65
+
Definition: core.h:58
+
+ + + + diff --git a/html/bc_s.png b/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/html/bdwn.png b/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +Adafruit Protomatter: Member List + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Adafruit_Protomatter Member List
+
+
+ +

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

+ + + + + + +
Adafruit_Protomatter(uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount, uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList, uint8_t clockPin, uint8_t latchPin, uint8_t oePin, bool doubleBuffer, void *timer=NULL)Adafruit_Protomatter
begin(void)Adafruit_Protomatter
getFrameCount(void)Adafruit_Protomatter
show(void)Adafruit_Protomatter
~Adafruit_Protomatter(void) (defined in Adafruit_Protomatter)Adafruit_Protomatter
+ + + + diff --git a/html/class_adafruit___protomatter.html b/html/class_adafruit___protomatter.html new file mode 100644 index 0000000..cbea817 --- /dev/null +++ b/html/class_adafruit___protomatter.html @@ -0,0 +1,256 @@ + + + + + + + +Adafruit Protomatter: Adafruit_Protomatter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
Adafruit_Protomatter Class Reference
+
+
+ +

Class representing the Arduino-facing side of the Protomatter library. Subclass of Adafruit_GFX's GFXcanvas16 to allow all the drawing operations. + More...

+ +

#include <Adafruit_Protomatter.h>

+
+Inheritance diagram for Adafruit_Protomatter:
+
+
+ + + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 Adafruit_Protomatter (uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount, uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList, uint8_t clockPin, uint8_t latchPin, uint8_t oePin, bool doubleBuffer, void *timer=NULL)
 Adafruit_Protomatter constructor. More...
 
ProtomatterStatus begin (void)
 Start a Protomatter matrix display running – initialize pins, timer and interrupt into existence. More...
 
+void show (void)
 Process data from GFXcanvas16 to the matrix framebuffer's internal format for display.
 
uint32_t getFrameCount (void)
 Returns current value of frame counter and resets its value to zero. Two calls to this, timed one second apart (or use math with other intervals), can be used to get a rough frames-per-second value for the matrix (since this is difficult to estimate beforehand). More...
 
+

Detailed Description

+

Class representing the Arduino-facing side of the Protomatter library. Subclass of Adafruit_GFX's GFXcanvas16 to allow all the drawing operations.

+

Constructor & Destructor Documentation

+ +

◆ Adafruit_Protomatter()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adafruit_Protomatter::Adafruit_Protomatter (uint16_t bitWidth,
uint8_t bitDepth,
uint8_t rgbCount,
uint8_t * rgbList,
uint8_t addrCount,
uint8_t * addrList,
uint8_t clockPin,
uint8_t latchPin,
uint8_t oePin,
bool doubleBuffer,
void * timer = NULL 
)
+
+ +

Adafruit_Protomatter constructor.

+
Parameters
+ + + + + + + + + + + + +
bitWidthTotal width of RGB matrix chain, in pixels. Usu. some multiple of 32, but maybe exceptions.
bitDepthColor "depth" in bitplanes, determines range of shades of red, green and blue. e.g. passing 4 bits = 16 shades ea. R,G,B = 16x16x16 = 4096 colors. Max is 6, since the GFX library works with "565" RGB colors (6 bits green, 5 red/blue).
rgbCountNumber of "sets" of RGB data pins, each set containing 6 pins (2 ea. R,G,B). Typically 1, indicating a single matrix (or matrix chain). In theory (but not yet extensively tested), multiple sets of pins can be driven in parallel, up to 5 on some devices (if the hardware design provides all those bits on one PORT).
rgbListA uint8_t array of pins (Arduino pin numbering), 6X the prior rgbCount value, corresponding to the 6 output color bits for a matrix (or chain). Order is upper-half red, green, blue, lower-half red, green blue (repeat for each add'l chain). All the RGB pins (plus the clock pin below on some architectures) MUST be on the same PORT register. It's recommended (but not required) that all RGB pins (and clock depending on arch) be within the same byte of a PORT (but do not need to be sequential or contiguous within that byte) for more efficient RAM utilization. For two concurrent chains, same principle but 16-bit word instead of byte.
addrCountNumber of row address lines required of matrix. Total pixel height is then 2 x 2^addrCount, e.g. 32-pixel-tall matrices have 4 row address lines.
addrListA uint8_t array of pins (Arduino pin numbering), one per row address line.
clockPinRGB clock pin (Arduino pin #).
latchPinRGB data latch pin (Arduino pin #).
oePinOutput enable pin (Arduino pin #), active low.
doubleBufferIf true, two matrix buffers are allocated, so changing display contents doesn't introduce artifacts mid-conversion. Requires ~2X RAM.
timerPointer to timer peripheral or timer-related struct (architecture-dependent), or NULL to use a default timer ID (also arch-dependent).
+
+
+ +
+
+

Member Function Documentation

+ +

◆ begin()

+ +
+
+ + + + + + + + +
ProtomatterStatus Adafruit_Protomatter::begin (void )
+
+ +

Start a Protomatter matrix display running – initialize pins, timer and interrupt into existence.

+
Returns
A ProtomatterStatus status, one of: PROTOMATTER_OK if everything is good. PROTOMATTER_ERR_PINS if data and/or clock pins are split across different PORTs. PROTOMATTER_ERR_MALLOC if insufficient RAM to allocate display memory. PROTOMATTER_ERR_ARG if a bad value was passed to the constructor.
+ +
+
+ +

◆ getFrameCount()

+ +
+
+ + + + + + + + +
uint32_t Adafruit_Protomatter::getFrameCount (void )
+
+ +

Returns current value of frame counter and resets its value to zero. Two calls to this, timed one second apart (or use math with other intervals), can be used to get a rough frames-per-second value for the matrix (since this is difficult to estimate beforehand).

+
Returns
Frame count since previous call to function, as a uint32_t.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_adafruit___protomatter.png b/html/class_adafruit___protomatter.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2b589c091c7c1aa3a83f5b506481fe915317d2 GIT binary patch literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^4L}^g!3-py-Rr#uq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg*Lk`)hEy=VoqMtGhysVJzW(9=|37Z) zV#@Npb*}Af+ma=H8ZtXAYFPyXmo(0p`B;ZhD1p7;+loEs9Ahi`!@o_jICExmE<@L1 z^=X~aKUF`L-8XGG{hBfALDYiBxpVG5=R0_2&o*m@bUo%vaitbMx9&8ZIAe2LZb6p* z-UX9(x!QeJh+cmzne$FuFk^1e+WN~&7gclaV@g;$Z;AlJ*Jw^T#tt@dhVEPZe?Q7C zC^@iV`TH-I-!uMFyRFCnpMA#6`ujo(j6x6e83Y7br5N^X;%9J)GCA;E*hhf3;7PwK z2m6WW2@IU5=s#mahsGrb27z>-gjj;9l^!QUZC`v^ + + + + + + +Adafruit Protomatter: Class Index + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
_ | a | p
+ + + + + +
  _  
+
  a  
+
  p  
+
_PM_pin   Adafruit_Protomatter   Protomatter_core   
+
_ | a | p
+
+ + + + diff --git a/html/closed.png b/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/html/core_8c.html b/html/core_8c.html new file mode 100644 index 0000000..93a13b9 --- /dev/null +++ b/html/core_8c.html @@ -0,0 +1,460 @@ + + + + + + + +Adafruit Protomatter: core.c File Reference + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
core.c File Reference
+
+
+
#include "core.h"
+#include "arch.h"
+#include <stddef.h>
+#include <string.h>
+
+ + + + + + + + + + + + + + + + + + + +

+Macros

+#define _PM_MAX_REFRESH_HZ   250
 Max matrix refresh rate.
 
+#define _PM_ROW_DELAY   8
 Delay time between row address line changes (ms)
 
#define _PM_clearReg(x)
 Clear non-RGB-data-or-clock control line (_PM_pin type) More...
 
#define _PM_setReg(x)
 Set non-RGB-data-or-clock control line (_PM_pin type) More...
 
#define PEW
 Bitbang one set of RGB data bits to matrix. More...
 
+#define PEW_UNROLL   PEW PEW PEW PEW PEW PEW PEW PEW
 8-way PEW unroll
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

ProtomatterStatus _PM_init (Protomatter_core *core, uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount, uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList, uint8_t clockPin, uint8_t latchPin, uint8_t oePin, bool doubleBuffer, void *timer)
 Initialize values in Protomatter_core structure. More...
 
ProtomatterStatus _PM_begin (Protomatter_core *core)
 Allocate display buffers and populate additional elements of a Protomatter matrix. More...
 
void _PM_stop (Protomatter_core *core)
 Disable (but do not deallocate) a Protomatter matrix. Disables matrix by setting OE pin HIGH and writing all-zero data to matrix shift registers, so it won't halt with lit LEDs. More...
 
void _PM_resume (Protomatter_core *core)
 Start or restart a matrix. Initialize counters, configure and start timer. More...
 
void _PM_free (Protomatter_core *core)
 Deallocate memory associated with Protomatter_core structure (e.g. screen data, pin lists for data and rows). Does not deallocate the structure itself. More...
 
void _PM_row_handler (Protomatter_core *core)
 Matrix "row handler" that's called by the timer interrupt. Handles row address lines and issuing data to matrix. More...
 
uint32_t _PM_getFrameCount (Protomatter_core *core)
 Returns current value of frame counter and resets its value to zero. Two calls to this, timed one second apart (or use math with other intervals), can be used to get a rough frames-per-second value for the matrix (since this is difficult to estimate beforehand). More...
 
+

Detailed Description

+

Part of Adafruit's Protomatter library for HUB75-style RGB LED matrices.

+

Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

+

Written by Phil "Paint Your Dragon" Burgess and Jeff Epler for Adafruit Industries, with contributions from the open source community.

+

BSD license, all text here must be included in any redistribution.

+

Macro Definition Documentation

+ +

◆ _PM_clearReg

+ +
+
+ + + + + + + + +
#define _PM_clearReg( x)
+
+Value:
(*(volatile _PM_PORT_TYPE *)((x).clearReg) = \
((x).bit))
#define _PM_PORT_TYPE
PORT register size/type.
Definition: arch.h:1308
+
+

Clear non-RGB-data-or-clock control line (_PM_pin type)

+ +
+
+ +

◆ _PM_setReg

+ +
+
+ + + + + + + + +
#define _PM_setReg( x)
+
+Value:
(*(volatile _PM_PORT_TYPE *)((x).setReg) = \
((x).bit))
#define _PM_PORT_TYPE
PORT register size/type.
Definition: arch.h:1308
+
+

Set non-RGB-data-or-clock control line (_PM_pin type)

+ +
+
+ +

◆ PEW

+ +
+
+ + + + +
#define PEW
+
+Value:
*set = *data++; /* Set RGB data high */ \
_PM_clockHoldLow; \
*set_full = clock; /* Set clock high */ \
_PM_clockHoldHigh; \
*clear_full = rgbclock; \
/* Clear RGB data + clock */
+

Bitbang one set of RGB data bits to matrix.

+ +
+
+

Function Documentation

+ +

◆ _PM_init()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProtomatterStatus _PM_init (Protomatter_corecore,
uint16_t bitWidth,
uint8_t bitDepth,
uint8_t rgbCount,
uint8_t * rgbList,
uint8_t addrCount,
uint8_t * addrList,
uint8_t clockPin,
uint8_t latchPin,
uint8_t oePin,
bool doubleBuffer,
void * timer 
)
+
+ +

Initialize values in Protomatter_core structure.

+
Parameters
+ + + + + + + + + + + + + +
corePointer to Protomatter_core structure.
bitWidthTotal width of RGB matrix chain, in pixels. Usu. some multiple of 32, but maybe exceptions.
bitDepthColor "depth" in bitplanes, determines range of shades of red, green and blue. e.g. passing 4 bits = 16 shades ea. R,G,B = 16x16x16 = 4096 colors.
rgbCountNumber of "sets" of RGB data pins, each set containing 6 pins (2 ea. R,G,B). Typically 1, indicating a single matrix (or matrix chain). In theory (but not yet extensively tested), multiple sets of pins can be driven in parallel, up to 5 on some devices (if the hardware design provides all those bits on one PORT).
rgbListA uint8_t array of pins (values are platform- dependent), 6X the prior rgbCount value, corresponding to the 6 output color bits for a matrix (or chain). Order is upper-half red, green, blue, lower-half red, green blue (repeat for each add'l chain). All the RGB pins (plus the clock pin below on some architectures) MUST be on the same PORT register. It's recommended (but not required) that all RGB pins (and clock depending on arch) be within the same byte of a PORT (but do not need to be sequential or contiguous within that byte) for more efficient RAM utilization. For two concurrent chains, same principle but 16-bit word.
addrCountNumber of row address lines required of matrix. Total pixel height is then 2 x 2^addrCount, e.g. 32-pixel-tall matrices have 4 row address lines.
addrListA uint8_t array of pins (platform-dependent pin numbering), one per row address line.
clockPinRGB clock pin (platform-dependent pin #).
latchPinRGB data latch pin (platform-dependent pin #).
oePinOutput enable pin (platform-dependent pin #), active low.
doubleBufferIf true, two matrix buffers are allocated, so changing display contents doesn't introduce artifacts mid-conversion. Requires ~2X RAM.
timerPointer to timer peripheral or timer-related struct (architecture-dependent), or NULL to use a default timer ID (also arch-dependent).
+
+
+
Returns
A ProtomatterStatus status, one of: PROTOMATTER_OK if everything is good. PROTOMATTER_ERR_PINS if data and/or clock pins are split across different PORTs. PROTOMATTER_ERR_MALLOC if insufficient RAM to allocate display memory. PROTOMATTER_ERR_ARG if a bad value (core or timer pointer) was passed in.
+ +
+
+ +

◆ _PM_begin()

+ +
+
+ + + + + + + + +
ProtomatterStatus _PM_begin (Protomatter_corecore)
+
+ +

Allocate display buffers and populate additional elements of a Protomatter matrix.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+
Returns
A ProtomatterStatus status, one of: PROTOMATTER_OK if everything is good. PROTOMATTER_ERR_PINS if data and/or clock pins are split across different PORTs. PROTOMATTER_ERR_MALLOC if insufficient RAM to allocate display memory. PROTOMATTER_ERR_ARG if a bad value.
+ +
+
+ +

◆ _PM_stop()

+ +
+
+ + + + + + + + +
void _PM_stop (Protomatter_corecore)
+
+ +

Disable (but do not deallocate) a Protomatter matrix. Disables matrix by setting OE pin HIGH and writing all-zero data to matrix shift registers, so it won't halt with lit LEDs.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_resume()

+ +
+
+ + + + + + + + +
void _PM_resume (Protomatter_corecore)
+
+ +

Start or restart a matrix. Initialize counters, configure and start timer.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_free()

+ +
+
+ + + + + + + + +
void _PM_free (Protomatter_corecore)
+
+ +

Deallocate memory associated with Protomatter_core structure (e.g. screen data, pin lists for data and rows). Does not deallocate the structure itself.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_row_handler()

+ +
+
+ + + + + + + + +
void _PM_row_handler (Protomatter_corecore)
+
+ +

Matrix "row handler" that's called by the timer interrupt. Handles row address lines and issuing data to matrix.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_getFrameCount()

+ +
+
+ + + + + + + + +
uint32_t _PM_getFrameCount (Protomatter_corecore)
+
+ +

Returns current value of frame counter and resets its value to zero. Two calls to this, timed one second apart (or use math with other intervals), can be used to get a rough frames-per-second value for the matrix (since this is difficult to estimate beforehand).

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+
Returns
Frame count since previous call to function, as a uint32_t.
+ +
+
+
+ + + + diff --git a/html/core_8h.html b/html/core_8h.html new file mode 100644 index 0000000..abd2881 --- /dev/null +++ b/html/core_8h.html @@ -0,0 +1,586 @@ + + + + + + + +Adafruit Protomatter: core.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
core.h File Reference
+
+
+
#include <stdbool.h>
+#include <stdint.h>
+
+

Go to the source code of this file.

+ + + + + + +

+Classes

struct  _PM_pin
 
struct  Protomatter_core
 
+ + + +

+Enumerations

enum  ProtomatterStatus { PROTOMATTER_OK, +PROTOMATTER_ERR_PINS, +PROTOMATTER_ERR_MALLOC, +PROTOMATTER_ERR_ARG + }
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

ProtomatterStatus _PM_init (Protomatter_core *core, uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount, uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList, uint8_t clockPin, uint8_t latchPin, uint8_t oePin, bool doubleBuffer, void *timer)
 Initialize values in Protomatter_core structure. More...
 
ProtomatterStatus _PM_begin (Protomatter_core *core)
 Allocate display buffers and populate additional elements of a Protomatter matrix. More...
 
void _PM_stop (Protomatter_core *core)
 Disable (but do not deallocate) a Protomatter matrix. Disables matrix by setting OE pin HIGH and writing all-zero data to matrix shift registers, so it won't halt with lit LEDs. More...
 
void _PM_resume (Protomatter_core *core)
 Start or restart a matrix. Initialize counters, configure and start timer. More...
 
void _PM_free (Protomatter_core *core)
 Deallocate memory associated with Protomatter_core structure (e.g. screen data, pin lists for data and rows). Does not deallocate the structure itself. More...
 
void _PM_row_handler (Protomatter_core *core)
 Matrix "row handler" that's called by the timer interrupt. Handles row address lines and issuing data to matrix. More...
 
uint32_t _PM_getFrameCount (Protomatter_core *core)
 Returns current value of frame counter and resets its value to zero. Two calls to this, timed one second apart (or use math with other intervals), can be used to get a rough frames-per-second value for the matrix (since this is difficult to estimate beforehand). More...
 
void _PM_timerStart (void *tptr, uint32_t period)
 Start (or restart) a timer/counter peripheral. More...
 
uint32_t _PM_timerStop (void *tptr)
 Stop timer/counter peripheral. More...
 
uint32_t _PM_timerGetCount (void *tptr)
 Query a timer/counter peripheral's current count. More...
 
void _PM_convert_565 (Protomatter_core *core, uint16_t *source, uint16_t width)
 Converts image data from GFX16 canvas to the matrices weird internal format. More...
 
void _PM_swapbuffer_maybe (Protomatter_core *core)
 Pauses until the next vertical blank to avoid 'tearing' animation (if display is double-buffered). If single-buffered, has no effect. More...
 
+

Detailed Description

+

Part of Adafruit's Protomatter library for HUB75-style RGB LED matrices.

+

Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

+

Written by Phil "Paint Your Dragon" Burgess and Jeff Epler for Adafruit Industries, with contributions from the open source community.

+

BSD license, all text here must be included in any redistribution.

+

Enumeration Type Documentation

+ +

◆ ProtomatterStatus

+ +
+
+ + + + +
enum ProtomatterStatus
+
+

Status type returned by some functions.

+ +
+
+

Function Documentation

+ +

◆ _PM_init()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProtomatterStatus _PM_init (Protomatter_corecore,
uint16_t bitWidth,
uint8_t bitDepth,
uint8_t rgbCount,
uint8_t * rgbList,
uint8_t addrCount,
uint8_t * addrList,
uint8_t clockPin,
uint8_t latchPin,
uint8_t oePin,
bool doubleBuffer,
void * timer 
)
+
+ +

Initialize values in Protomatter_core structure.

+
Parameters
+ + + + + + + + + + + + + +
corePointer to Protomatter_core structure.
bitWidthTotal width of RGB matrix chain, in pixels. Usu. some multiple of 32, but maybe exceptions.
bitDepthColor "depth" in bitplanes, determines range of shades of red, green and blue. e.g. passing 4 bits = 16 shades ea. R,G,B = 16x16x16 = 4096 colors.
rgbCountNumber of "sets" of RGB data pins, each set containing 6 pins (2 ea. R,G,B). Typically 1, indicating a single matrix (or matrix chain). In theory (but not yet extensively tested), multiple sets of pins can be driven in parallel, up to 5 on some devices (if the hardware design provides all those bits on one PORT).
rgbListA uint8_t array of pins (values are platform- dependent), 6X the prior rgbCount value, corresponding to the 6 output color bits for a matrix (or chain). Order is upper-half red, green, blue, lower-half red, green blue (repeat for each add'l chain). All the RGB pins (plus the clock pin below on some architectures) MUST be on the same PORT register. It's recommended (but not required) that all RGB pins (and clock depending on arch) be within the same byte of a PORT (but do not need to be sequential or contiguous within that byte) for more efficient RAM utilization. For two concurrent chains, same principle but 16-bit word.
addrCountNumber of row address lines required of matrix. Total pixel height is then 2 x 2^addrCount, e.g. 32-pixel-tall matrices have 4 row address lines.
addrListA uint8_t array of pins (platform-dependent pin numbering), one per row address line.
clockPinRGB clock pin (platform-dependent pin #).
latchPinRGB data latch pin (platform-dependent pin #).
oePinOutput enable pin (platform-dependent pin #), active low.
doubleBufferIf true, two matrix buffers are allocated, so changing display contents doesn't introduce artifacts mid-conversion. Requires ~2X RAM.
timerPointer to timer peripheral or timer-related struct (architecture-dependent), or NULL to use a default timer ID (also arch-dependent).
+
+
+
Returns
A ProtomatterStatus status, one of: PROTOMATTER_OK if everything is good. PROTOMATTER_ERR_PINS if data and/or clock pins are split across different PORTs. PROTOMATTER_ERR_MALLOC if insufficient RAM to allocate display memory. PROTOMATTER_ERR_ARG if a bad value (core or timer pointer) was passed in.
+ +
+
+ +

◆ _PM_begin()

+ +
+
+ + + + + + + + +
ProtomatterStatus _PM_begin (Protomatter_corecore)
+
+ +

Allocate display buffers and populate additional elements of a Protomatter matrix.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+
Returns
A ProtomatterStatus status, one of: PROTOMATTER_OK if everything is good. PROTOMATTER_ERR_PINS if data and/or clock pins are split across different PORTs. PROTOMATTER_ERR_MALLOC if insufficient RAM to allocate display memory. PROTOMATTER_ERR_ARG if a bad value.
+ +
+
+ +

◆ _PM_stop()

+ +
+
+ + + + + + + + +
void _PM_stop (Protomatter_corecore)
+
+ +

Disable (but do not deallocate) a Protomatter matrix. Disables matrix by setting OE pin HIGH and writing all-zero data to matrix shift registers, so it won't halt with lit LEDs.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_resume()

+ +
+
+ + + + + + + + +
void _PM_resume (Protomatter_corecore)
+
+ +

Start or restart a matrix. Initialize counters, configure and start timer.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_free()

+ +
+
+ + + + + + + + +
void _PM_free (Protomatter_corecore)
+
+ +

Deallocate memory associated with Protomatter_core structure (e.g. screen data, pin lists for data and rows). Does not deallocate the structure itself.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_row_handler()

+ +
+
+ + + + + + + + +
void _PM_row_handler (Protomatter_corecore)
+
+ +

Matrix "row handler" that's called by the timer interrupt. Handles row address lines and issuing data to matrix.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+ +

◆ _PM_getFrameCount()

+ +
+
+ + + + + + + + +
uint32_t _PM_getFrameCount (Protomatter_corecore)
+
+ +

Returns current value of frame counter and resets its value to zero. Two calls to this, timed one second apart (or use math with other intervals), can be used to get a rough frames-per-second value for the matrix (since this is difficult to estimate beforehand).

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+
Returns
Frame count since previous call to function, as a uint32_t.
+ +
+
+ +

◆ _PM_timerStart()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void _PM_timerStart (void * tptr,
uint32_t period 
)
+
+ +

Start (or restart) a timer/counter peripheral.

+
Parameters
+ + + +
tptrPointer to timer/counter peripheral OR a struct encapsulating information about a timer/counter periph (architecture-dependent).
periodTimer 'top' / rollover value.
+
+
+ +
+
+ +

◆ _PM_timerStop()

+ +
+
+ + + + + + + + +
uint32_t _PM_timerStop (void * tptr)
+
+ +

Stop timer/counter peripheral.

+
Parameters
+ + +
tptrPointer to timer/counter peripheral OR a struct encapsulating information about a timer/counter periph (architecture-dependent).
+
+
+
Returns
Counter value when timer was stopped.
+ +
+
+ +

◆ _PM_timerGetCount()

+ +
+
+ + + + + + + + +
uint32_t _PM_timerGetCount (void * tptr)
+
+ +

Query a timer/counter peripheral's current count.

+
Parameters
+ + +
tptrPointer to timer/counter peripheral OR a struct encapsulating information about a timer/counter periph (architecture-dependent).
+
+
+
Returns
Counter value.
+ +
+
+ +

◆ _PM_convert_565()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void _PM_convert_565 (Protomatter_corecore,
uint16_t * source,
uint16_t width 
)
+
+ +

Converts image data from GFX16 canvas to the matrices weird internal format.

+
Parameters
+ + + + +
corePointer to Protomatter_core structure.
sourcePointer to source image data (see Adafruit_GFX 16-bit canvas type for format).
widthWidth of canvas in pixels, as this may be different than the matrix pixel width due to row padding.
+
+
+ +
+
+ +

◆ _PM_swapbuffer_maybe()

+ +
+
+ + + + + + + + +
void _PM_swapbuffer_maybe (Protomatter_corecore)
+
+ +

Pauses until the next vertical blank to avoid 'tearing' animation (if display is double-buffered). If single-buffered, has no effect.

+
Parameters
+ + +
corePointer to Protomatter_core structure.
+
+
+ +
+
+
+ + + + diff --git a/html/core_8h_source.html b/html/core_8h_source.html new file mode 100644 index 0000000..026e6f0 --- /dev/null +++ b/html/core_8h_source.html @@ -0,0 +1,124 @@ + + + + + + + +Adafruit Protomatter: core.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
core.h
+
+
+Go to the documentation of this file.
1 
17 #ifndef _PROTOMATTER_CORE_H_
18 #define _PROTOMATTER_CORE_H_
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 #include <stdbool.h>
25 #include <stdint.h>
26 
28 typedef enum {
29  PROTOMATTER_OK, // Everything is hunky-dory!
30  PROTOMATTER_ERR_PINS, // Clock and/or data pins on different PORTs
31  PROTOMATTER_ERR_MALLOC, // Couldn't allocate memory for display
32  PROTOMATTER_ERR_ARG, // Bad input to function
34 
41 typedef struct {
42  volatile void *setReg;
43  volatile void *clearReg;
44  uint32_t bit;
45  uint8_t pin;
46 } _PM_pin;
47 
58 typedef struct {
59  void *timer;
60  void *setReg;
61  void *clearReg;
62  void *toggleReg;
63  uint8_t *rgbPins;
64  void *rgbMask;
65  uint32_t clockMask;
66  uint32_t rgbAndClockMask;
67  volatile void *addrPortToggle;
68  void *screenData;
72  uint32_t bufferSize;
73  uint32_t bitZeroPeriod;
74  uint32_t minPeriod;
75  volatile uint32_t frameCount;
76  uint16_t width;
77  uint8_t bytesPerElement;
78  uint8_t clockPin;
79  uint8_t parallel;
80  uint8_t numAddressLines;
81  uint8_t portOffset;
82  uint8_t numPlanes;
83  uint8_t numRowPairs;
84  bool doubleBuffer;
86  volatile uint8_t activeBuffer;
87  volatile uint8_t plane;
88  volatile uint8_t row;
89  volatile uint8_t prevRow;
90  volatile bool swapBuffers;
92 
93 // Protomatter core function prototypes. Environment-specific code (like the
94 // Adafruit_Protomatter class for Arduino) calls on these underlying things,
95 // and has to provide a few extras of its own (interrupt handlers and such).
96 // User code shouldn't need to invoke any of them directly.
97 
151 extern ProtomatterStatus _PM_init(Protomatter_core *core, uint16_t bitWidth,
152  uint8_t bitDepth, uint8_t rgbCount,
153  uint8_t *rgbList, uint8_t addrCount,
154  uint8_t *addrList, uint8_t clockPin,
155  uint8_t latchPin, uint8_t oePin,
156  bool doubleBuffer, void *timer);
157 
170 extern ProtomatterStatus _PM_begin(Protomatter_core *core);
171 
178 extern void _PM_stop(Protomatter_core *core);
179 
185 extern void _PM_resume(Protomatter_core *core);
186 
193 extern void _PM_free(Protomatter_core *core);
194 
200 extern void _PM_row_handler(Protomatter_core *core);
201 
211 extern uint32_t _PM_getFrameCount(Protomatter_core *core);
212 
220 extern void _PM_timerStart(void *tptr, uint32_t period);
221 
229 extern uint32_t _PM_timerStop(void *tptr);
230 
238 extern uint32_t _PM_timerGetCount(void *tptr);
239 
249 extern void _PM_convert_565(Protomatter_core *core, uint16_t *source,
250  uint16_t width);
251 
257 extern void _PM_swapbuffer_maybe(Protomatter_core *core);
258 
259 #ifdef __cplusplus
260 } // extern "C"
261 #endif
262 
263 #endif // _PROTOMATTER_CORE_H_
void * timer
Arch-specific timer/counter info.
Definition: core.h:59
+
_PM_pin oe
!OE (LOW out enable)
Definition: core.h:70
+
uint32_t bitZeroPeriod
Bitplane 0 timer period.
Definition: core.h:73
+
uint8_t numAddressLines
Number of address line pins.
Definition: core.h:80
+
uint32_t _PM_timerGetCount(void *tptr)
Query a timer/counter peripheral&#39;s current count.
+
uint32_t minPeriod
Plane 0 timer period for ~250Hz.
Definition: core.h:74
+
volatile uint8_t activeBuffer
Index of currently-displayed buf.
Definition: core.h:86
+
uint8_t numPlanes
Display bitplanes (1 to 6)
Definition: core.h:82
+
uint32_t bit
GPIO bitmask.
Definition: core.h:44
+
volatile void * clearReg
GPIO bit clear register.
Definition: core.h:43
+
volatile uint8_t plane
Current bitplane (changes in ISR)
Definition: core.h:87
+
void _PM_convert_565(Protomatter_core *core, uint16_t *source, uint16_t width)
Converts image data from GFX16 canvas to the matrices weird internal format.
+
void _PM_stop(Protomatter_core *core)
Disable (but do not deallocate) a Protomatter matrix. Disables matrix by setting OE pin HIGH and writ...
Definition: core.c:377
+
_PM_pin * addr
Array of address pins.
Definition: core.h:71
+
uint32_t bufferSize
Bytes per matrix buffer.
Definition: core.h:72
+
uint8_t portOffset
Active 8- or 16-bit pos. in PORT.
Definition: core.h:81
+
volatile void * addrPortToggle
See singleAddrPort below.
Definition: core.h:67
+
uint32_t _PM_timerStop(void *tptr)
Stop timer/counter peripheral.
+
uint8_t * rgbPins
Array of RGB data pins (mult of 6)
Definition: core.h:63
+
uint32_t rgbAndClockMask
PORT bit mask for RGB data + clock.
Definition: core.h:66
+
volatile uint8_t row
Current scanline (changes in ISR)
Definition: core.h:88
+
void * rgbMask
PORT bit mask for each RGB pin.
Definition: core.h:64
+
uint8_t pin
Some unique ID, e.g. Arduino pin #.
Definition: core.h:45
+
volatile uint32_t frameCount
For estimating refresh rate.
Definition: core.h:75
+
Definition: core.h:41
+
bool doubleBuffer
2X buffers for clean switchover
Definition: core.h:84
+
ProtomatterStatus _PM_begin(Protomatter_core *core)
Allocate display buffers and populate additional elements of a Protomatter matrix.
Definition: core.c:150
+
uint8_t clockPin
RGB clock pin identifier.
Definition: core.h:78
+
void _PM_swapbuffer_maybe(Protomatter_core *core)
Pauses until the next vertical blank to avoid &#39;tearing&#39; animation (if display is double-buffered). If single-buffered, has no effect.
+
uint8_t bytesPerElement
Using 8, 16 or 32 bits of PORT?
Definition: core.h:77
+
ProtomatterStatus
Definition: core.h:28
+
_PM_pin latch
RGB data latch.
Definition: core.h:69
+
void * toggleReg
RGBC bit toggle register ".
Definition: core.h:62
+
volatile bool swapBuffers
If 1, awaiting double-buf switch.
Definition: core.h:90
+
uint32_t _PM_getFrameCount(Protomatter_core *core)
Returns current value of frame counter and resets its value to zero. Two calls to this...
Definition: core.c:689
+
volatile uint8_t prevRow
Scanline from prior ISR.
Definition: core.h:89
+
bool singleAddrPort
If 1, all addr lines on same PORT.
Definition: core.h:85
+
uint8_t numRowPairs
Addressable row pairs.
Definition: core.h:83
+
uint16_t width
Matrix chain width in bits.
Definition: core.h:76
+
void * screenData
Per-bitplane RGB data for matrix.
Definition: core.h:68
+
uint8_t parallel
Number of concurrent matrix outs.
Definition: core.h:79
+
ProtomatterStatus _PM_init(Protomatter_core *core, uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount, uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList, uint8_t clockPin, uint8_t latchPin, uint8_t oePin, bool doubleBuffer, void *timer)
Initialize values in Protomatter_core structure.
Definition: core.c:89
+
void _PM_row_handler(Protomatter_core *core)
Matrix "row handler" that&#39;s called by the timer interrupt. Handles row address lines and issuing data...
Definition: core.c:435
+
void _PM_free(Protomatter_core *core)
Deallocate memory associated with Protomatter_core structure (e.g. screen data, pin lists for data an...
Definition: core.c:419
+
void * clearReg
RGBC bit clear register ".
Definition: core.h:61
+
void _PM_resume(Protomatter_core *core)
Start or restart a matrix. Initialize counters, configure and start timer.
Definition: core.c:404
+
void _PM_timerStart(void *tptr, uint32_t period)
Start (or restart) a timer/counter peripheral.
+
uint32_t clockMask
PORT bit mask for RGB clock.
Definition: core.h:65
+
void * setReg
RGBC bit set register (cast to use)
Definition: core.h:60
+
Definition: core.h:58
+
volatile void * setReg
GPIO bit set register.
Definition: core.h:42
+
+ + + + diff --git a/html/doc.png b/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/html/doxygen.css b/html/doxygen.css new file mode 100644 index 0000000..4f1ab91 --- /dev/null +++ b/html/doxygen.css @@ -0,0 +1,1596 @@ +/* The standard CSS for doxygen 1.8.13 */ + +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; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.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; +} + +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: 0px; + 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 { + 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; +} + +/* @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 { + 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 { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .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; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left: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.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left: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; +} + +dl.citelist dd { + margin:2px 0; + 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; +} + +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; +} + +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; +} + +.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.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +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 +} + + +/* @end */ diff --git a/html/doxygen.png b/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 zcmV;!4m|ORP)tMIv#Q0*~7*`IBSO7_x;@a8#Zk6_PeKR_s92J&)(m+);m9Iz3blw)z#Gi zP!9lj4$%+*>Hz@HCmM9L9|8c+0u=!H$O3?R0Kgx|#WP<6fKfC8fM-CQZT|_r@`>VO zX^Hgb|9cJqpdJA5$MCEK`F_2@2Y@s>^+;pF`~jdI0Pvr|vl4`=C)EH@1IFe7pdJ8F zH(qGi004~QnF)Ggga~8v08kGAs2hKTATxr7pwfNk|4#_AaT>w8P6TV+R2kbS$v==} zAjf`s0g#V8lB+b3)5oEI*q+{Yt$MZDruD2^;$+(_%Qn+%v0X-bJO=;@kiJ^ygLBnC z?1OVv_%aex1M@jKU|Z~$eI?PoF4Vj>fDzyo zAiLfpXY*a^Sj-S5D0S3@#V$sRW)g)_1e#$%8xdM>Jm7?!h zu0P2X=xoN>^!4DoPRgph2(2va07yfpXF+WH7EOg1GY%Zn z7~1A<(z7Q$ktEXhW_?GMpHp9l_UL18F3KOsxu81pqoBiNbFSGsof-W z6~eloMoz=4?OOnl2J268x5rOY`dCk0us(uS#Ud4yqOr@?=Q57a}tit|BhY>}~frH1sP`ScHS_d)oqH^lYy zZ%VP`#10MlE~P?cE(%(#(AUSv_T{+;t@$U}El}(1ig`vZo`Rm;+5&(AYzJ^Ae=h2X z@Re%vHwZU>|f0NI&%$*4eJweC5OROQrpPMA@*w|o z()A==l}(@bv^&>H1Ob3C=<^|hob?0+xJ?QQ3-ueQC}zy&JQNib!OqSO@-=>XzxlSF zAZ^U*1l6EEmg3r};_HY>&Jo_{dOPEFTWPmt=U&F#+0(O59^UIlHbNX+eF8UzyDR*T z(=5X$VF3!gm@RooS-&iiUYGG^`hMR(07zr_xP`d!^BH?uD>Phl8Rdifx3Af^Zr`Ku ztL+~HkVeL#bJ)7;`=>;{KNRvjmc}1}c58Sr#Treq=4{xo!ATy|c>iRSp4`dzMMVd@ zL8?uwXDY}Wqgh4mH`|$BTXpUIu6A1-cSq%hJw;@^Zr8TP=GMh*p(m(tN7@!^D~sl$ zz^tf4II4|};+irE$Fnm4NTc5%p{PRA`%}Zk`CE5?#h3|xcyQsS#iONZ z6H(@^i9td!$z~bZiJLTax$o>r(p}3o@< zyD7%(>ZYvy=6$U3e!F{Z`uSaYy`xQyl?b{}eg|G3&fz*`QH@mDUn)1%#5u`0m$%D} z?;tZ0u(mWeMV0QtzjgN!lT*pNRj;6510Wwx?Yi_=tYw|J#7@(Xe7ifDzXuK;JB;QO z#bg~K$cgm$@{QiL_3yr}y&~wuv=P=#O&Tj=Sr)aCUlYmZMcw?)T?c%0rUe1cS+o!qs_ zQ6Gp)-{)V!;=q}llyK3|^WeLKyjf%y;xHku;9(vM!j|~<7w1c*Mk-;P{T&yG) z@C-8E?QPynNQ<8f01D`2qexcVEIOU?y}MG)TAE6&VT5`rK8s(4PE;uQ92LTXUQ<>^ ztyQ@=@kRdh@ebUG^Z6NWWIL;_IGJ2ST>$t!$m$qvtj0Qmw8moN6GUV^!QKNK zHBXCtUH8)RY9++gH_TUV4^=-j$t}dD3qsN7GclJ^Zc&(j6&a_!$jCf}%c5ey`pm~1)@{yI3 zTdWyB+*X{JFw#z;PwRr5evb2!ueWF;v`B0HoUu4-(~aL=z;OXUUEtG`_$)Oxw6FKg zEzY`CyKaSBK3xt#8gA|r_|Kehn_HYVBMpEwbn9-fI*!u*eTA1ef8Mkl1=!jV4oYwWYM}i`A>_F4nhmlCIC6WLa zY%;4&@AlnaG11ejl61Jev21|r*m+?Kru3;1tFDl}#!OzUp6c>go4{C|^erwpG*&h6bspUPJag}oOkN2912Y3I?(eRc@U9>z#HPBHC?nps7H5!zP``90!Q1n80jo+B3TWXp!8Pe zwuKuLLI6l3Gv@+QH*Y}2wPLPQ1^EZhT#+Ed8q8Wo z1pTmIBxv14-{l&QVKxAyQF#8Q@NeJwWdKk>?cpiJLkJr+aZ!Me+Cfp!?FWSRf^j2k z73BRR{WSKaMkJ>1Nbx5dan5hg^_}O{Tj6u%iV%#QGz0Q@j{R^Ik)Z*+(YvY2ziBG)?AmJa|JV%4UT$k`hcOg5r9R?5>?o~JzK zJCrj&{i#hG>N7!B4kNX(%igb%kDj0fOQThC-8mtfap82PNRXr1D>lbgg)dYTQ(kbx z`Ee5kXG~Bh+BHQBf|kJEy6(ga%WfhvdQNDuOfQoe377l#ht&DrMGeIsI5C<&ai zWG$|hop2@@q5YDa)_-A?B02W;#fH!%k`daQLEItaJJ8Yf1L%8x;kg?)k)00P-lH+w z)5$QNV6r2$YtnV(4o=0^3{kmaXn*Dm0F*fU(@o)yVVjk|ln8ea6BMy%vZAhW9|wvA z8RoDkVoMEz1d>|5(k0Nw>22ZT){V<3$^C-cN+|~hKt2)){+l-?3m@-$c?-dlzQ)q- zZ)j%n^gerV{|+t}9m1_&&Ly!9$rtG4XX|WQ8`xYzGC~U@nYh~g(z9)bdAl#xH)xd5a=@|qql z|FzEil{P5(@gy!4ek05i$>`E^G~{;pnf6ftpLh$h#W?^#4UkPfa;;?bsIe&kz!+40 zI|6`F2n020)-r`pFaZ38F!S-lJM-o&inOw|66=GMeP@xQU5ghQH{~5Uh~TMTd;I9` z>YhVB`e^EVj*S7JF39ZgNf}A-0DwOcTT63ydN$I3b?yBQtUI*_fae~kPvzoD$zjX3 zoqBe#>12im4WzZ=f^4+u=!lA|#r%1`WB0-6*3BL#at`47#ebPpR|D1b)3BjT34nYY z%Ds%d?5$|{LgOIaRO{{oC&RK`O91$fqwM0(C_TALcozu*fWHb%%q&p-q{_8*2Zsi^ zh1ZCnr^UYa;4vQEtHk{~zi>wwMC5o{S=$P0X681y`SXwFH?Ewn{x-MOZynmc)JT5v zuHLwh;tLfxRrr%|k370}GofLl7thg>ACWWY&msqaVu&ry+`7+Ss>NL^%T1|z{IGMA zW-SKl=V-^{(f!Kf^#3(|T2W47d(%JVCI4JgRrT1pNz>+ietmFToNv^`gzC@&O-)+i zPQ~RwK8%C_vf%;%e>NyTp~dM5;!C|N0Q^6|CEb7Bw=Vz~$1#FA;Z*?mKSC)Hl-20s t8QyHj(g6VK0RYbl8UjE)0O0w=e*@m04r>stuEhWV002ovPDHLkV1hl;dM*F} literal 0 HcmV?d00001 diff --git a/html/dynsections.js b/html/dynsections.js new file mode 100644 index 0000000..85e1836 --- /dev/null +++ b/html/dynsections.js @@ -0,0 +1,97 @@ +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 + + + + + + +Adafruit Protomatter: File List + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+ + + + + + +
 Adafruit_Protomatter.cpp
 Adafruit_Protomatter.h
 arch.h
 core.c
 core.h
+
+
+ + + + diff --git a/html/folderclosed.png b/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/html/functions.html b/html/functions.html new file mode 100644 index 0000000..132581a --- /dev/null +++ b/html/functions.html @@ -0,0 +1,245 @@ + + + + + + + +Adafruit Protomatter: Class Members + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- g -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+
+ + + + diff --git a/html/functions_func.html b/html/functions_func.html new file mode 100644 index 0000000..70c934a --- /dev/null +++ b/html/functions_func.html @@ -0,0 +1,83 @@ + + + + + + + +Adafruit Protomatter: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/html/functions_vars.html b/html/functions_vars.html new file mode 100644 index 0000000..62e773a --- /dev/null +++ b/html/functions_vars.html @@ -0,0 +1,229 @@ + + + + + + + +Adafruit Protomatter: Class Members - Variables + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+
+ + + + diff --git a/html/globals.html b/html/globals.html new file mode 100644 index 0000000..2f46593 --- /dev/null +++ b/html/globals.html @@ -0,0 +1,167 @@ + + + + + + + +Adafruit Protomatter: File Members + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented file members with links to the documentation:
+ +

- _ -

+ + +

- p -

+
+ + + + diff --git a/html/globals_defs.html b/html/globals_defs.html new file mode 100644 index 0000000..0fccaa5 --- /dev/null +++ b/html/globals_defs.html @@ -0,0 +1,112 @@ + + + + + + + +Adafruit Protomatter: File Members + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/html/globals_enum.html b/html/globals_enum.html new file mode 100644 index 0000000..fe7a87d --- /dev/null +++ b/html/globals_enum.html @@ -0,0 +1,74 @@ + + + + + + + +Adafruit Protomatter: File Members + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
    +
  • ProtomatterStatus +: core.h +
  • +
+
+ + + + diff --git a/html/globals_func.html b/html/globals_func.html new file mode 100644 index 0000000..47f7aa2 --- /dev/null +++ b/html/globals_func.html @@ -0,0 +1,114 @@ + + + + + + + +Adafruit Protomatter: File Members + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/html/globals_vars.html b/html/globals_vars.html new file mode 100644 index 0000000..82508a3 --- /dev/null +++ b/html/globals_vars.html @@ -0,0 +1,74 @@ + + + + + + + +Adafruit Protomatter: File Members + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/html/hierarchy.html b/html/hierarchy.html new file mode 100644 index 0000000..25b9967 --- /dev/null +++ b/html/hierarchy.html @@ -0,0 +1,81 @@ + + + + + + + +Adafruit Protomatter: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + +
 C_PM_pin
 CGFXcanvas16
 CAdafruit_ProtomatterClass representing the Arduino-facing side of the Protomatter library. Subclass of Adafruit_GFX's GFXcanvas16 to allow all the drawing operations
 CProtomatter_core
+
+
+ + + + diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..019bd5e --- /dev/null +++ b/html/index.html @@ -0,0 +1,86 @@ + + + + + + + +Adafruit Protomatter: Adafruit Protomatter RGB LED matrix library. + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Adafruit Protomatter RGB LED matrix library.
+
+
+

+Introduction

+

This is documentation for Adafruit's protomatter library for HUB75-style RGB LED matrices. It is designed to work with various matrices sold by Adafruit ("HUB75" is a vague term and other similar matrices are not guaranteed to work). This file is the Arduino-specific calls; the underlying C code is more platform-neutral.

+

Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

+

+Dependencies

+

This library depends on Adafruit_GFX being present on your system. Please make sure you have installed the latest version before using this library.

+

+Author

+

Written by Phil "Paint Your Dragon" Burgess and Jeff Epler for Adafruit Industries, with contributions from the open source community.

+

+License

+

BSD license, all text here must be included in any redistribution.

+
+ + + + diff --git a/html/jquery.js b/html/jquery.js new file mode 100644 index 0000000..f5343ed --- /dev/null +++ b/html/jquery.js @@ -0,0 +1,87 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').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("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom: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({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{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"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,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}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + + +
+
+
_PM_pin Member List
+
+
+ +

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

+
+ + + + +
bit_PM_pin
clearReg_PM_pin
pin_PM_pin
setReg_PM_pin
+ + + + diff --git a/html/struct___p_m__pin.html b/html/struct___p_m__pin.html new file mode 100644 index 0000000..6100d30 --- /dev/null +++ b/html/struct___p_m__pin.html @@ -0,0 +1,103 @@ + + + + + + + +Adafruit Protomatter: _PM_pin Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
_PM_pin Struct Reference
+
+
+ +

#include <core.h>

+ + + + + + + + + + + + + + +

+Public Attributes

+volatile void * setReg
 GPIO bit set register.
 
+volatile void * clearReg
 GPIO bit clear register.
 
+uint32_t bit
 GPIO bitmask.
 
+uint8_t pin
 Some unique ID, e.g. Arduino pin #.
 
+

Detailed Description

+

Struct for matrix control lines NOT related to RGB data or clock, i.e. latch, OE and address lines. RGB data and clock ("RGBC") are handled differently as they have specific requirements (and might use a toggle register if present). The data conversion functions need bitmasks for RGB data but do NOT need the set or clear registers, so those items are also declared as separate things in the core structure that follows.

+

The documentation for this struct was generated from the following file: +
+ + + + diff --git a/html/struct_protomatter__core-members.html b/html/struct_protomatter__core-members.html new file mode 100644 index 0000000..ec14439 --- /dev/null +++ b/html/struct_protomatter__core-members.html @@ -0,0 +1,108 @@ + + + + + + + +Adafruit Protomatter: Member List + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Protomatter_core Member List
+
+ + + + + diff --git a/html/struct_protomatter__core.html b/html/struct_protomatter__core.html new file mode 100644 index 0000000..46db6eb --- /dev/null +++ b/html/struct_protomatter__core.html @@ -0,0 +1,215 @@ + + + + + + + +Adafruit Protomatter: Protomatter_core Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
Adafruit Protomatter +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
Protomatter_core Struct Reference
+
+
+ +

#include <core.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+void * timer
 Arch-specific timer/counter info.
 
+void * setReg
 RGBC bit set register (cast to use)
 
+void * clearReg
 RGBC bit clear register ".
 
+void * toggleReg
 RGBC bit toggle register ".
 
+uint8_t * rgbPins
 Array of RGB data pins (mult of 6)
 
+void * rgbMask
 PORT bit mask for each RGB pin.
 
+uint32_t clockMask
 PORT bit mask for RGB clock.
 
+uint32_t rgbAndClockMask
 PORT bit mask for RGB data + clock.
 
+volatile void * addrPortToggle
 See singleAddrPort below.
 
+void * screenData
 Per-bitplane RGB data for matrix.
 
+_PM_pin latch
 RGB data latch.
 
+_PM_pin oe
 !OE (LOW out enable)
 
+_PM_pinaddr
 Array of address pins.
 
+uint32_t bufferSize
 Bytes per matrix buffer.
 
+uint32_t bitZeroPeriod
 Bitplane 0 timer period.
 
+uint32_t minPeriod
 Plane 0 timer period for ~250Hz.
 
+volatile uint32_t frameCount
 For estimating refresh rate.
 
+uint16_t width
 Matrix chain width in bits.
 
+uint8_t bytesPerElement
 Using 8, 16 or 32 bits of PORT?
 
+uint8_t clockPin
 RGB clock pin identifier.
 
+uint8_t parallel
 Number of concurrent matrix outs.
 
+uint8_t numAddressLines
 Number of address line pins.
 
+uint8_t portOffset
 Active 8- or 16-bit pos. in PORT.
 
+uint8_t numPlanes
 Display bitplanes (1 to 6)
 
+uint8_t numRowPairs
 Addressable row pairs.
 
+bool doubleBuffer
 2X buffers for clean switchover
 
+bool singleAddrPort
 If 1, all addr lines on same PORT.
 
+volatile uint8_t activeBuffer
 Index of currently-displayed buf.
 
+volatile uint8_t plane
 Current bitplane (changes in ISR)
 
+volatile uint8_t row
 Current scanline (changes in ISR)
 
+volatile uint8_t prevRow
 Scanline from prior ISR.
 
+volatile bool swapBuffers
 If 1, awaiting double-buf switch.
 
+

Detailed Description

+

Struct with info about an RGB matrix chain and lots of state and buffer details for the library. Toggle-related items in this structure MUST be declared even if the device lacks GPIO bit-toggle registers (i.e. don't do an ifdef check around these). All hardware-specific details (including the presence or lack of toggle registers) are isolated to a single file – arch.h – which should ONLY be included by core.c, and ifdef'ing them would result in differing representations of this structure which must be shared between the library and calling code. (An alternative is to put any toggle-specific stuff at the end of the struct with an ifdef check, but that's just dirty pool and asking for trouble.)

+

The documentation for this struct was generated from the following file: +
+ + + + diff --git a/html/sync_off.png b/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/html/sync_on.png b/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/html/tab_a.png b/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/html/tab_b.png b/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/html/tabs.css b/html/tabs.css new file mode 100644 index 0000000..a28614b --- /dev/null +++ b/html/tabs.css @@ -0,0 +1 @@ +.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:0/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}#doc-content{overflow:auto;display:block;padding:0;margin:0;-webkit-overflow-scrolling:touch}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 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:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.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);-moz-border-radius:5px;-webkit-border-radius:5px;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{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;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{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;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{-moz-border-radius:0;-webkit-border-radius:0;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:white;text-shadow:0 1px 1px black}.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;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white 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;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);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:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.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;-moz-border-radius:5px;-webkit-border-radius:5px;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}} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..9d6a47f --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ + + + + + + Page Redirection + + + If you are not redirected automatically, follow the link to the documentation + + \ No newline at end of file