diff --git a/AudioRadioRelay_8ino-example.html b/AudioRadioRelay_8ino-example.html index b7f496b..274db6a 100644 --- a/AudioRadioRelay_8ino-example.html +++ b/AudioRadioRelay_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: AudioRadioRelay.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ + @@ -58,20 +58,26 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
AudioRadioRelay.ino
+
AudioRadioRelay.ino
-

For Arduino Due
+

For Arduino Due

-

Audio Relay & Peripheral Test Example:

-

This example demonstrates how to manage incoming and outgoing audio streams using the AAAudio library and nrf24l01+ radio modules on Arduino Due.

+

Audio Relay & Peripheral Test Example:

+

This example demonstrates how to manage incoming and outgoing audio streams using the AAAudio library and nrf24l01+ radio modules on Arduino Due.

  1. This example uses the onboard DAC to play the incoming audio data via DAC0
  2. The ADC is used to sample the DAC0 pin, and the data is made available
  3. @@ -132,12 +138,12 @@
    #include "myRadio.h"
    -
    AutoAnalog aaAudio;
    +
    AutoAnalog aaAudio;
    /*********************************************************/
    void DACC_Handler(void) {
    -
    aaAudio.dacHandler(); //Link the DAC ISR/IRQ library. Called by the MCU when DAC is ready for data
    +
    aaAudio.dacHandler(); //Link the DAC ISR/IRQ library. Called by the MCU when DAC is ready for data
    }
    /*********************************************************/
    @@ -147,9 +153,9 @@
    Serial.begin(115200);
    Serial.println("Analog Audio Begin");
    -
    aaAudio.begin(1, 1); //Setup aaAudio using both DAC and ADC
    +
    aaAudio.begin(1, 1); //Setup aaAudio using both DAC and ADC
    #if defined (ARDUINO_AVR)
    -
    aaAudio.autoAdjust = 0;
    +
    aaAudio.autoAdjust = 0;
    #endif
    setupRadio();
    }
    @@ -191,21 +197,21 @@
    if (pipeNo == 2) {
    radio.read(&dynSampleRate, 4); // Receive commands using pipe #2
    -
    aaAudio.setSampleRate(dynSampleRate); // Pipe 2 is being used for command data, pipe 1 & others for audio data
    +
    aaAudio.setSampleRate(dynSampleRate); // Pipe 2 is being used for command data, pipe 1 & others for audio data
    } else {
    #if !defined (ARDUINO_ARCH_AVR) //AVR (Uno, Nano can't handle extra processing)
    radio.stopListening(); // Prepare to send data out via radio
    #endif
    -
    radio.read(&aaAudio.dacBuffer, 32); // Read the available radio data
    +
    radio.read(&aaAudio.dacBuffer, 32); // Read the available radio data
    -
    aaAudio.feedDAC(0, 32); // Feed the DAC with the received data
    +
    aaAudio.feedDAC(0, 32); // Feed the DAC with the received data
    #if !defined (ARDUINO_ARCH_AVR)
    -
    aaAudio.getADC(32); // Grab the available data from the ADC
    +
    aaAudio.getADC(32); // Grab the available data from the ADC
    //Send the received ADC data via radio
    -
    radio.startFastWrite(&aaAudio.adcBuffer, 32, 1);
    +
    radio.startFastWrite(&aaAudio.adcBuffer, 32, 1);
    #endif
    /*Note: The data initially recieved can directly be sent via radio, but
    @@ -221,11 +227,11 @@
    /*********************************************************/
    - +
    void dacHandler(void)
    -
    uint8_t adcBuffer[MAX_BUFFER_SIZE]
    - -
    uint8_t dacBuffer[MAX_BUFFER_SIZE]
    +
    uint8_t adcBuffer[MAX_BUFFER_SIZE]
    + +
    uint8_t dacBuffer[MAX_BUFFER_SIZE]
    void getADC(uint32_t samples=MAX_BUFFER_SIZE)
    void setSampleRate(uint32_t sampRate=0, bool stereo=true)
    void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
    @@ -233,7 +239,7 @@
diff --git a/AutoAnalogAudio_8cpp.html b/AutoAnalogAudio_8cpp.html index fd47c0c..171c8c7 100644 --- a/AutoAnalogAudio_8cpp.html +++ b/AutoAnalogAudio_8cpp.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: src/esp32/AutoAnalogAudio.cpp File Reference @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
AutoAnalogAudio.cpp File Reference
+
AutoAnalogAudio.cpp File Reference

Go to the source code of this file.

Detailed Description

-

AutoAnalogAudio streaming via DAC & ADC by TMRh20

-

Copyright (C) 2016-2020 TMRh20 - tmrh2.nosp@m.0@gm.nosp@m.ail.c.nosp@m.om, github.com/TMRh20

-

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

-

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

-

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

+

AutoAnalogAudio streaming via DAC & ADC by TMRh20

+

Copyright (C) 2016-2020 TMRh20 - tmrh2.nosp@m.0@gm.nosp@m.ail.c.nosp@m.om, github.com/TMRh20

+

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

+

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

+

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file AutoAnalogAudio.cpp.

diff --git a/AutoAnalogAudio_8cpp_source.html b/AutoAnalogAudio_8cpp_source.html index a716754..43b5dc1 100644 --- a/AutoAnalogAudio_8cpp_source.html +++ b/AutoAnalogAudio_8cpp_source.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: src/esp32/AutoAnalogAudio.cpp Source File @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
AutoAnalogAudio.cpp
+
AutoAnalogAudio.cpp
-Go to the documentation of this file.
1 
-
22 /****************************************************************************/
-
23 
-
24 #if defined (ESP32)
-
25 
-
26 #include "../AutoAnalogAudio.h"
-
27 #include "driver/i2s.h"
-
28 #include "driver/adc.h"
-
29 #include "freertos/FreeRTOS.h"
-
30 #include "freertos/task.h"
-
31 #include "esp_event.h"
-
32 
-
33 
-
34 /****************************************************************************/
-
35 /* Public Functions */
-
36 /****************************************************************************/
-
37 
-
38  volatile bool dacTaskActive;
-
39  volatile bool dacTaskCreated;
-
40  uint32_t adcSamples;
-
41  uint16_t tmpADCBuffer16[MAX_BUFFER_SIZE];
-
42  volatile uint32_t lastAdcTime;
-
43  uint8_t *adcPtr = NULL;
-
44 
-
45  uint8_t dacVar;
-
46 
- -
48 
-
49  adcBitsPerSample = 16;
-
50  dacBitsPerSample = 16;
-
51 
-
52  dacTaskActive = false;
-
53  dacTaskCreated = false;
-
54  dacEnabled = false;
-
55  dacTaskHandle = NULL;
-
56  i2sStopped = true;
-
57  dacVar = 1;
-
58  adcPtr = &adcBuffer[0];
-
59 
-
60  sampleRate = 0;
-
61  lastDacSample = 0;
-
62  adcChannel = (adc1_channel_t)0;
-
63 
-
64  for(int i=0; i<MAX_BUFFER_SIZE; i++){
-
65  dacBuffer[i] = 0;
-
66  dacBuffer16[i] = 0;
-
67  }
-
68  adcSamples = 0;
-
69  lastAdcTime = 0;
-
70 
-
71 }
-
72 
-
73 /****************************************************************************/
-
74 
-
75 void DACC_Handler();
-
76 
-
77 /****************************************************************************/
-
78 
-
79 void adcTask(void *args){
-
80  for( ;; ){
-
81  if(*(uint32_t*)args > 0){
-
82  size_t bytesRead = 0;
-
83  i2s_read(I2S_NUM_0, &tmpADCBuffer16, *(uint32_t*)args * 2, &bytesRead, 500 / portTICK_PERIOD_MS);
-
84  adcSamples = 0;
-
85  lastAdcTime = millis();
-
86  }else{
-
87  if(millis() - lastAdcTime > 150){
-
88  vTaskDelay( 5 / portTICK_PERIOD_MS);
-
89  }
-
90  }
-
91  }
-
92 }
-
93 
-
94 /****************************************************************************/
-
95 
-
96 uint32_t dacTTimer = 0;
-
97 
-
98 void dacTask(void *args){
-
99  for( ;; ){
-
100 
-
101  if(*(uint8_t*)args == 1 && dacTaskActive == true){
-
102  DACC_Handler();
-
103  }else{
-
104  *(uint8_t*)args = 3;
-
105  vTaskDelay( 10 / portTICK_PERIOD_MS);
-
106 
-
107  }
-
108  }
-
109 }
-
110 
-
111 /****************************************************************************/
-
112 
-
113 void AutoAnalog::begin(bool enADC, bool enDAC){
-
114 
-
115  i2s_mode_t myMode = (i2s_mode_t)I2S_MODE_MASTER;
-
116 
-
117 
-
118  if(enADC){
-
119  myMode = (i2s_mode_t)(myMode | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN);
-
120  }
-
121  if(enDAC){
-
122  myMode = (i2s_mode_t)(myMode | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN);
-
123  }
-
124 
-
125  i2s_cfg = {
-
126  .mode = (i2s_mode_t)myMode,
-
127  .sample_rate = 16000, // The format of the signal using ADC_BUILT_IN
-
128  .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB
-
129  .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
-
130  .communication_format = I2S_COMM_FORMAT_I2S_LSB,
-
131  .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
-
132  .dma_buf_count = 2,
-
133  .dma_buf_len = MAX_BUFFER_SIZE,
-
134  .use_apll = false,
-
135  .tx_desc_auto_clear = false,
-
136  .fixed_mclk = 0
-
137  };
-
138  i2s_driver_install(I2S_NUM_0, &i2s_cfg, 0, NULL);
-
139 
-
140 
-
141  if(enADC){
-
142  i2s_set_adc_mode(ADC_UNIT_1, adcChannel); //pin 32
-
143  adc1_config_channel_atten(adcChannel, ADC_ATTEN_DB_11);
-
144  i2s_adc_enable(I2S_NUM_0);
-
145  }
-
146  if(enDAC){
-
147  i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN);
-
148  dacEnabled = true;
-
149  }
-
150 
-
151  sampleRate = 16000;
-
152 
-
153  setSampleRate(sampleRate,true);
-
154 
-
155 
-
156 }
-
157 
-
158 /****************************************************************************/
-
159 
-
160 void AutoAnalog::dacInterrupts(bool enabled, bool withinTask){
-
161 
-
162  if(enabled){
-
163  if(dacTaskCreated == false){
-
164  dacTaskCreated = true;
-
165  //Serial.print("Cr Task ");
-
166  dacVar = 1;
-
167  dacTaskActive = true;
-
168  xTaskCreate(dacTask,"DAC Task",3062,&dacVar,tskIDLE_PRIORITY + 1,&dacTaskHandle);
-
169  }
-
170  }else{
-
171  if(dacTaskCreated == true){
-
172  dacTaskCreated = false;
-
173  dacTaskActive = false;
-
174  //Serial.println("Dac Int false");
-
175 
-
176  if(dacTaskHandle != NULL){
-
177  if(dacVar == 1 && !withinTask){
-
178  //Serial.println("Set Dac Var 2");
-
179  dacVar = 2;
-
180  while(dacVar != 3){ delay(3); }
-
181  }
-
182 
-
183  //Serial.println("Del Task");
-
184  vTaskDelete(dacTaskHandle);
-
185  }
-
186 
-
187  }
-
188  }
-
189 
-
190 }
-
191 
-
192 /****************************************************************************/
-
193 
-
194 void AutoAnalog::rampIn(uint8_t sample){
-
195 
-
196 
-
197  uint8_t tmpBuf[255];
-
198  uint8_t zeroBuff[MAX_BUFFER_SIZE];
-
199  memset(zeroBuff,0,MAX_BUFFER_SIZE);
-
200 
-
201  uint16_t counter = 0;
-
202  for(uint16_t i=0; i<sample; i++){
-
203  tmpBuf[i] = i;
-
204  counter++;
-
205  }
-
206 
-
207  size_t bytesWritten = 0;
-
208  size_t bytesWritten2 = 0;
-
209 
-
210  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
211  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
212  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
213 
-
214  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE-counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
215  i2s_write_expand(I2S_NUM_0,&tmpBuf[0],counter,8,16,&bytesWritten2, 500 / portTICK_PERIOD_MS);
-
216 }
-
217 
-
218 /****************************************************************************/
-
219 
-
220 void AutoAnalog::rampOut(uint8_t sample){
-
221 
-
222 
-
223  uint8_t tmpBuf[255];
-
224  uint8_t zeroBuff[MAX_BUFFER_SIZE];
-
225  memset(zeroBuff,0,MAX_BUFFER_SIZE);
-
226 
-
227  uint16_t counter = 0;
-
228  for(uint8_t i=lastDacSample; i > 0; i--){
-
229  tmpBuf[counter++] = i;
-
230  }
-
231  size_t bytesWritten = 0;
-
232 
-
233  i2s_write_expand(I2S_NUM_0,&tmpBuf[0],counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
234  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE-counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
235  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
236  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
237  i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
238 
-
239 }
-
240 
-
241 /****************************************************************************/
-
242 
-
243 void AutoAnalog::setSampleRate(uint32_t sampRate, bool stereo){
-
244 
-
245  //if(sampRate == sampleRate){ return; }
-
246 
-
247  sampleRate = sampRate;
-
248  //i2s_stop(I2S_NUM_0);
-
249  //i2s_driver_uninstall(I2S_NUM_0);
-
250  //delay(5);
-
251  //i2s_driver_install(I2S_NUM_0, &i2s_cfg, 0, NULL);
-
252  if(stereo == false){
-
253  i2s_set_clk(I2S_NUM_0, sampRate, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO);
-
254  }else{
-
255  i2s_set_clk(I2S_NUM_0, sampRate/2, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_STEREO);
-
256  }
-
257 
-
258 
-
259 }
-
260 
-
261 /****************************************************************************/
-
262 
- -
264 
-
265 
-
266 
-
267 }
-
268 
-
269 /****************************************************************************/
-
270 
-
271 void AutoAnalog::enableAdcChannel(uint8_t pinAx){
-
272 
-
273  adcChannel = (adc1_channel_t)pinAx;
-
274 
-
275 }
-
276 
-
277 /****************************************************************************/
-
278 
-
279 void AutoAnalog::disableAdcChannel(uint8_t pinAx){
-
280 
-
281  /*if(pinAx > 6){ return; }
-
282  pinAx = 7 - pinAx;
-
283  ADC->ADC_CHDR |= 1<< pinAx;*/
-
284 
-
285 }
-
286 
-
287 /****************************************************************************/
-
288 
-
289 void AutoAnalog::getADC(uint32_t samples){
-
290 
-
291  if(!adcTaskCreated){
-
292  adcTaskCreated = true;
-
293  xTaskCreate(adcTask,"ADC Task",2048,&adcSamples,tskIDLE_PRIORITY + 1,NULL);
-
294  //Serial.println("Cr ADC");
-
295  }
-
296  while(adcSamples > 0){ delayMicroseconds(100); };
-
297  //Serial.println("Get ADC");
-
298  uint16_t offset = (int)adcChannel * 0x1000 + 0xFFF; // 4high bits == channel. Data is inverted.
-
299  for(uint32_t i=0; i<samples;i++){
-
300  tmpADCBuffer16[i] = offset - tmpADCBuffer16[i];
-
301  adcBuffer16[i] = tmpADCBuffer16[i];
-
302  }
-
303  //Serial.println("samps");
-
304  adcSamples = samples;
-
305 
-
306 
-
307 
-
308 
-
309 }
-
310 
-
311 /****************************************************************************/
-
312 
-
313 void AutoAnalog::feedDAC(uint8_t dacChannel, uint32_t samples, bool startInterrupts){
-
314 
-
315 
-
316  //uint8_t buf[MAX_BUFFER_SIZE * 2];
-
317  size_t bytesWritten = 0;
-
318 
-
319  if(dacBitsPerSample == 16){
-
320  for(int i=0; i<samples; i++){
-
321  dacBuffer[i] = (uint8_t)dacBuffer16[i];
-
322  }
-
323  }
-
324 
-
325  /*if(startInterrupts == true){
-
326 
-
327  //uint8_t zeroSample[MAX_BUFFER_SIZE ];
-
328  memset(buf,0,MAX_BUFFER_SIZE*2);
-
329  i2s_write_expand(I2S_NUM_0,&buf[0],(MAX_BUFFER_SIZE*2) - dacBuffer[0],8,16,&bytesWritten, 100 / portTICK_PERIOD_MS);
-
330  //i2s_write_expand(I2S_NUM_0,&zeroSample,(MAX_BUFFER_SIZE),8,16,&bytesWritten, 100 / portTICK_PERIOD_MS);
-
331 
-
332  for(uint i=0; i <= (dacBuffer[0] * 2); i++){
-
333  uint test = i / 2;
-
334  i2s_write_expand(I2S_NUM_0,&test,1,8,16,&bytesWritten, 100 / portTICK_PERIOD_MS);
-
335  }
-
336  }*/
-
337 
-
338  /*if(i2sStopped){
-
339  i2sStopped = false;
-
340  i2s_start(I2S_NUM_0);
-
341  }*/
-
342 
-
343  if(dacEnabled == false){
-
344  //dacEnabled = true;
-
345  //i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN);
-
346  }
-
347 
-
348  i2s_write_expand(I2S_NUM_0,&dacBuffer[0],samples,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
-
349  lastDacSample = dacBuffer[bytesWritten-1];
-
350 
-
351 
-
352  if(startInterrupts == true){
-
353  dacTaskActive = true;
-
354  //i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN);
-
355  dacInterrupts(true);
-
356 
-
357  }
-
358 
-
359 
-
360 
-
361 }
-
362 
-
363 /****************************************************************************/
-
364 /* Private Functions */
-
365 /****************************************************************************/
-
366 
-
367 void AutoAnalog::dacBufferStereo(uint8_t dacChannel){
-
368 
-
369 
-
370 
-
371 }
-
372 
-
373 /****************************************************************************/
-
374 
-
375 uint32_t AutoAnalog::frequencyToTimerCount(uint32_t frequency){
-
376  //return VARIANT_MCK / 2UL / frequency;
-
377  return 0;
-
378 }
-
379 
-
380 /****************************************************************************/
-
381 
-
382 void AutoAnalog::adcSetup(void){
-
383 
-
384 
-
385 }
-
386 
-
387 /****************************************************************************/
-
388 
-
389 void AutoAnalog::adcInterrupts(bool enabled){
-
390 
-
391 }
-
392 
-
393 /****************************************************************************/
-
394 
-
395 void AutoAnalog::dacSetup(void){
-
396 
-
397 
-
398 }
-
399 
-
400 /****************************************************************************/
-
401 
-
402 
-
403 void AutoAnalog::disableDAC(bool withinTask){
-
404 
-
405  dacTaskActive = false;
-
406  if(!withinTask){
-
407  dacInterrupts(false,false);
-
408  }
-
409 
-
410 
-
411  //i2s_set_dac_mode(I2S_DAC_CHANNEL_DISABLE);
-
412  i2s_zero_dma_buffer(I2S_NUM_0);
-
413  //dacEnabled = false;
-
414  if(withinTask){
-
415  dacInterrupts(false,true);
-
416  }
-
417 
-
418 }
-
419 
-
420 /****************************************************************************/
-
421 
-
422 void AutoAnalog::dacHandler(void){
-
423 
-
424 
-
425 }
-
426 
-
427 /****************************************************************************/
-
428 
-
429 void AutoAnalog::tcSetup (uint32_t sampRate){
-
430 
-
431 
-
432 
-
433 }
-
434 
-
435 /****************************************************************************/
-
436 
-
437 void AutoAnalog::tc2Setup (uint32_t sampRate)
-
438 {
-
439 
-
440 }
-
441 
-
442 /****************************************************************************/
-
443 
-
444 
-
445 
-
446 #endif //#if defined (ESP32)
+Go to the documentation of this file.
1
+
22/****************************************************************************/
+
23
+
24#if defined (ESP32)
+
25
+
26#include "../AutoAnalogAudio.h"
+
27#include "driver/i2s.h"
+
28#include "driver/adc.h"
+
29#include "freertos/FreeRTOS.h"
+
30#include "freertos/task.h"
+
31#include "esp_event.h"
+
32
+
33
+
34/****************************************************************************/
+
35/* Public Functions */
+
36/****************************************************************************/
+
37
+
38 volatile bool dacTaskActive;
+
39 volatile bool dacTaskCreated;
+
40 uint32_t adcSamples;
+
41 uint16_t tmpADCBuffer16[MAX_BUFFER_SIZE];
+
42 volatile uint32_t lastAdcTime;
+
43 uint8_t *adcPtr = NULL;
+
44
+
45 uint8_t dacVar;
+
46
+ +
48
+ + +
51
+
52 dacTaskActive = false;
+
53 dacTaskCreated = false;
+
54 dacEnabled = false;
+
55 dacTaskHandle = NULL;
+
56 i2sStopped = true;
+
57 dacVar = 1;
+
58 adcPtr = &adcBuffer[0];
+
59
+
60 sampleRate = 0;
+
61 lastDacSample = 0;
+
62 adcChannel = (adc1_channel_t)0;
+
63
+
64 for(int i=0; i<MAX_BUFFER_SIZE; i++){
+
65 dacBuffer[i] = 0;
+
66 dacBuffer16[i] = 0;
+
67 }
+
68 adcSamples = 0;
+
69 lastAdcTime = 0;
+
70
+
71}
+
72
+
73/****************************************************************************/
+
74
+
75void DACC_Handler();
+
76
+
77/****************************************************************************/
+
78
+
79void adcTask(void *args){
+
80 for( ;; ){
+
81 if(*(uint32_t*)args > 0){
+
82 size_t bytesRead = 0;
+
83 i2s_read(I2S_NUM_0, &tmpADCBuffer16, *(uint32_t*)args * 2, &bytesRead, 500 / portTICK_PERIOD_MS);
+
84 adcSamples = 0;
+
85 lastAdcTime = millis();
+
86 }else{
+
87 if(millis() - lastAdcTime > 150){
+
88 vTaskDelay( 5 / portTICK_PERIOD_MS);
+
89 }
+
90 }
+
91 }
+
92}
+
93
+
94/****************************************************************************/
+
95
+
96uint32_t dacTTimer = 0;
+
97
+
98void dacTask(void *args){
+
99 for( ;; ){
+
100
+
101 if(*(uint8_t*)args == 1 && dacTaskActive == true){
+
102 DACC_Handler();
+
103 }else{
+
104 *(uint8_t*)args = 3;
+
105 vTaskDelay( 10 / portTICK_PERIOD_MS);
+
106
+
107 }
+
108 }
+
109}
+
110
+
111/****************************************************************************/
+
112
+
113void AutoAnalog::begin(bool enADC, bool enDAC){
+
114
+
115 i2s_mode_t myMode = (i2s_mode_t)I2S_MODE_MASTER;
+
116
+
117
+
118 if(enADC){
+
119 myMode = (i2s_mode_t)(myMode | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN);
+
120 }
+
121 if(enDAC){
+
122 myMode = (i2s_mode_t)(myMode | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN);
+
123 }
+
124
+
125 i2s_cfg = {
+
126 .mode = (i2s_mode_t)myMode,
+
127 .sample_rate = 16000, // The format of the signal using ADC_BUILT_IN
+
128 .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB
+
129 .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
+
130 .communication_format = I2S_COMM_FORMAT_I2S_LSB,
+
131 .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
+
132 .dma_buf_count = 2,
+
133 .dma_buf_len = MAX_BUFFER_SIZE,
+
134 .use_apll = false,
+
135 .tx_desc_auto_clear = false,
+
136 .fixed_mclk = 0
+
137 };
+
138 i2s_driver_install(I2S_NUM_0, &i2s_cfg, 0, NULL);
+
139
+
140
+
141 if(enADC){
+
142 i2s_set_adc_mode(ADC_UNIT_1, adcChannel); //pin 32
+
143 adc1_config_channel_atten(adcChannel, ADC_ATTEN_DB_11);
+
144 i2s_adc_enable(I2S_NUM_0);
+
145 }
+
146 if(enDAC){
+
147 i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN);
+
148 dacEnabled = true;
+
149 }
+
150
+
151 sampleRate = 16000;
+
152
+
153 setSampleRate(sampleRate,true);
+
154
+
155
+
156}
+
157
+
158/****************************************************************************/
+
159
+
160void AutoAnalog::dacInterrupts(bool enabled, bool withinTask){
+
161
+
162 if(enabled){
+
163 if(dacTaskCreated == false){
+
164 dacTaskCreated = true;
+
165 //Serial.print("Cr Task ");
+
166 dacVar = 1;
+
167 dacTaskActive = true;
+
168 xTaskCreate(dacTask,"DAC Task",3062,&dacVar,tskIDLE_PRIORITY + 1,&dacTaskHandle);
+
169 }
+
170 }else{
+
171 if(dacTaskCreated == true){
+
172 dacTaskCreated = false;
+
173 dacTaskActive = false;
+
174 //Serial.println("Dac Int false");
+
175
+
176 if(dacTaskHandle != NULL){
+
177 if(dacVar == 1 && !withinTask){
+
178 //Serial.println("Set Dac Var 2");
+
179 dacVar = 2;
+
180 while(dacVar != 3){ delay(3); }
+
181 }
+
182
+
183 //Serial.println("Del Task");
+
184 vTaskDelete(dacTaskHandle);
+
185 }
+
186
+
187 }
+
188 }
+
189
+
190}
+
191
+
192/****************************************************************************/
+
193
+
194void AutoAnalog::rampIn(uint8_t sample){
+
195
+
196
+
197 uint8_t tmpBuf[255];
+
198 uint8_t zeroBuff[MAX_BUFFER_SIZE];
+
199 memset(zeroBuff,0,MAX_BUFFER_SIZE);
+
200
+
201 uint16_t counter = 0;
+
202 for(uint16_t i=0; i<sample; i++){
+
203 tmpBuf[i] = i;
+
204 counter++;
+
205 }
+
206
+
207 size_t bytesWritten = 0;
+
208 size_t bytesWritten2 = 0;
+
209
+
210 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
211 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
212 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
213
+
214 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE-counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
215 i2s_write_expand(I2S_NUM_0,&tmpBuf[0],counter,8,16,&bytesWritten2, 500 / portTICK_PERIOD_MS);
+
216}
+
217
+
218/****************************************************************************/
+
219
+
220void AutoAnalog::rampOut(uint8_t sample){
+
221
+
222
+
223 uint8_t tmpBuf[255];
+
224 uint8_t zeroBuff[MAX_BUFFER_SIZE];
+
225 memset(zeroBuff,0,MAX_BUFFER_SIZE);
+
226
+
227 uint16_t counter = 0;
+
228 for(uint8_t i=lastDacSample; i > 0; i--){
+
229 tmpBuf[counter++] = i;
+
230 }
+
231 size_t bytesWritten = 0;
+
232
+
233 i2s_write_expand(I2S_NUM_0,&tmpBuf[0],counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
234 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE-counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
235 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
236 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
237 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
238
+
239}
+
240
+
241/****************************************************************************/
+
242
+
243void AutoAnalog::setSampleRate(uint32_t sampRate, bool stereo){
+
244
+
245 //if(sampRate == sampleRate){ return; }
+
246
+
247 sampleRate = sampRate;
+
248 //i2s_stop(I2S_NUM_0);
+
249 //i2s_driver_uninstall(I2S_NUM_0);
+
250 //delay(5);
+
251 //i2s_driver_install(I2S_NUM_0, &i2s_cfg, 0, NULL);
+
252 if(stereo == false){
+
253 i2s_set_clk(I2S_NUM_0, sampRate, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO);
+
254 }else{
+
255 i2s_set_clk(I2S_NUM_0, sampRate/2, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_STEREO);
+
256 }
+
257
+
258
+
259}
+
260
+
261/****************************************************************************/
+
262
+ +
264
+
265
+
266
+
267}
+
268
+
269/****************************************************************************/
+
270
+
271void AutoAnalog::enableAdcChannel(uint8_t pinAx){
+
272
+
273 adcChannel = (adc1_channel_t)pinAx;
+
274
+
275}
+
276
+
277/****************************************************************************/
+
278
+
279void AutoAnalog::disableAdcChannel(uint8_t pinAx){
+
280
+
281 /*if(pinAx > 6){ return; }
+
282 pinAx = 7 - pinAx;
+
283 ADC->ADC_CHDR |= 1<< pinAx;*/
+
284
+
285}
+
286
+
287/****************************************************************************/
+
288
+
289void AutoAnalog::getADC(uint32_t samples){
+
290
+
291 if(!adcTaskCreated){
+
292 adcTaskCreated = true;
+
293 xTaskCreate(adcTask,"ADC Task",2048,&adcSamples,tskIDLE_PRIORITY + 1,NULL);
+
294 //Serial.println("Cr ADC");
+
295 }
+
296 while(adcSamples > 0){ delayMicroseconds(100); };
+
297 //Serial.println("Get ADC");
+
298 uint16_t offset = (int)adcChannel * 0x1000 + 0xFFF; // 4high bits == channel. Data is inverted.
+
299 for(uint32_t i=0; i<samples;i++){
+
300 tmpADCBuffer16[i] = offset - tmpADCBuffer16[i];
+
301 adcBuffer16[i] = tmpADCBuffer16[i];
+
302 }
+
303 //Serial.println("samps");
+
304 adcSamples = samples;
+
305
+
306
+
307
+
308
+
309}
+
310
+
311/****************************************************************************/
+
312
+
313void AutoAnalog::feedDAC(uint8_t dacChannel, uint32_t samples, bool startInterrupts){
+
314
+
315
+
316 //uint8_t buf[MAX_BUFFER_SIZE * 2];
+
317 size_t bytesWritten = 0;
+
318
+
319 if(dacBitsPerSample == 16){
+
320 for(int i=0; i<samples; i++){
+
321 dacBuffer[i] = (uint8_t)dacBuffer16[i];
+
322 }
+
323 }
+
324
+
325 /*if(startInterrupts == true){
+
326
+
327 //uint8_t zeroSample[MAX_BUFFER_SIZE ];
+
328 memset(buf,0,MAX_BUFFER_SIZE*2);
+
329 i2s_write_expand(I2S_NUM_0,&buf[0],(MAX_BUFFER_SIZE*2) - dacBuffer[0],8,16,&bytesWritten, 100 / portTICK_PERIOD_MS);
+
330 //i2s_write_expand(I2S_NUM_0,&zeroSample,(MAX_BUFFER_SIZE),8,16,&bytesWritten, 100 / portTICK_PERIOD_MS);
+
331
+
332 for(uint i=0; i <= (dacBuffer[0] * 2); i++){
+
333 uint test = i / 2;
+
334 i2s_write_expand(I2S_NUM_0,&test,1,8,16,&bytesWritten, 100 / portTICK_PERIOD_MS);
+
335 }
+
336 }*/
+
337
+
338 /*if(i2sStopped){
+
339 i2sStopped = false;
+
340 i2s_start(I2S_NUM_0);
+
341 }*/
+
342
+
343 if(dacEnabled == false){
+
344 //dacEnabled = true;
+
345 //i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN);
+
346 }
+
347
+
348 i2s_write_expand(I2S_NUM_0,&dacBuffer[0],samples,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
+
349 lastDacSample = dacBuffer[bytesWritten-1];
+
350
+
351
+
352 if(startInterrupts == true){
+
353 dacTaskActive = true;
+
354 //i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN);
+
355 dacInterrupts(true);
+
356
+
357 }
+
358
+
359
+
360
+
361}
+
362
+
363/****************************************************************************/
+
364/* Private Functions */
+
365/****************************************************************************/
+
366
+
367void AutoAnalog::dacBufferStereo(uint8_t dacChannel){
+
368
+
369
+
370
+
371}
+
372
+
373/****************************************************************************/
+
374
+
375uint32_t AutoAnalog::frequencyToTimerCount(uint32_t frequency){
+
376 //return VARIANT_MCK / 2UL / frequency;
+
377 return 0;
+
378}
+
379
+
380/****************************************************************************/
+
381
+
382void AutoAnalog::adcSetup(void){
+
383
+
384
+
385}
+
386
+
387/****************************************************************************/
+
388
+
389void AutoAnalog::adcInterrupts(bool enabled){
+
390
+
391}
+
392
+
393/****************************************************************************/
+
394
+
395void AutoAnalog::dacSetup(void){
+
396
+
397
+
398}
+
399
+
400/****************************************************************************/
+
401
+
402
+
403void AutoAnalog::disableDAC(bool withinTask){
+
404
+
405 dacTaskActive = false;
+
406 if(!withinTask){
+
407 dacInterrupts(false,false);
+
408 }
+
409
+
410
+
411 //i2s_set_dac_mode(I2S_DAC_CHANNEL_DISABLE);
+
412 i2s_zero_dma_buffer(I2S_NUM_0);
+
413 //dacEnabled = false;
+
414 if(withinTask){
+
415 dacInterrupts(false,true);
+
416 }
+
417
+
418}
+
419
+
420/****************************************************************************/
+
421
+
422void AutoAnalog::dacHandler(void){
+
423
+
424
+
425}
+
426
+
427/****************************************************************************/
+
428
+
429void AutoAnalog::tcSetup (uint32_t sampRate){
+
430
+
431
+
432
+
433}
+
434
+
435/****************************************************************************/
+
436
+
437void AutoAnalog::tc2Setup (uint32_t sampRate)
+
438{
+
439
+
440}
+
441
+
442/****************************************************************************/
+
443
+
444
+
445
+
446#endif //#if defined (ESP32)
void adcInterrupts(bool enabled=true)
void dacHandler(void)
-
uint8_t dacBitsPerSample
+
uint8_t dacBitsPerSample
void rampIn(uint8_t sample)
-
uint8_t adcBuffer[MAX_BUFFER_SIZE]
+
uint8_t adcBuffer[MAX_BUFFER_SIZE]
-
uint8_t dacBuffer[MAX_BUFFER_SIZE]
-
TaskHandle_t dacTaskHandle
+
uint8_t dacBuffer[MAX_BUFFER_SIZE]
+
TaskHandle_t dacTaskHandle
void getADC(uint32_t samples=MAX_BUFFER_SIZE)
-
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
+
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
void rampOut(uint8_t sample)
void disableDAC(bool withinTask=false)
-
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
+
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void dacInterrupts(bool enabled=true, bool withinTask=false)
void enableAdcChannel(uint8_t pinAx)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
-
uint8_t adcBitsPerSample
+
uint8_t adcBitsPerSample
void triggerADC()
void begin(bool enADC, bool enDAC)
void disableAdcChannel(uint8_t pinAx)
diff --git a/AutoAnalogAudio_8h.html b/AutoAnalogAudio_8h.html index 9e71315..f115a57 100644 --- a/AutoAnalogAudio_8h.html +++ b/AutoAnalogAudio_8h.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: src/AutoAnalogAudio.h File Reference @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
#include "AutoAnalog_config.h"

Go to the source code of this file.

-

+

Classes

class  AutoAnalog
 
- @@ -94,12 +100,12 @@

+

Macros

#define AAA_CHANNEL0   0
 
 

Detailed Description

-

Class declaration for AutoAnalogAudio

+

Class declaration for AutoAnalogAudio

Definition in file AutoAnalogAudio.h.

Macro Definition Documentation

- -

◆ AAA_CHANNEL0

+ +

◆ AAA_CHANNEL0

@@ -110,12 +116,12 @@

-

Definition at line 32 of file AutoAnalogAudio.h.

+

Definition at line 33 of file AutoAnalogAudio.h.

- -

◆ AAA_CHANNEL1

+ +

◆ AAA_CHANNEL1

@@ -126,12 +132,12 @@

-

Definition at line 33 of file AutoAnalogAudio.h.

+

Definition at line 34 of file AutoAnalogAudio.h.

- -

◆ AAA_MODE_STEREO

+ +

◆ AAA_MODE_STEREO

@@ -142,14 +148,14 @@

-

Definition at line 34 of file AutoAnalogAudio.h.

+

Definition at line 35 of file AutoAnalogAudio.h.

diff --git a/AutoAnalogAudio_8h_source.html b/AutoAnalogAudio_8h_source.html index 31a085d..5535629 100644 --- a/AutoAnalogAudio_8h_source.html +++ b/AutoAnalogAudio_8h_source.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: src/AutoAnalogAudio.h Source File @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
AutoAnalogAudio.h
+
AutoAnalogAudio.h
-Go to the documentation of this file.
1  /*
-
2  AutoAnalogAudio streaming via DAC & ADC by TMRh20
-
3  Copyright (C) 2016-2020 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
-
4 
-
5  This program is free software: you can redistribute it and/or modify
-
6  it under the terms of the GNU General Public License as published by
-
7  the Free Software Foundation, either version 3 of the License, or
-
8  (at your option) any later version.
-
9 
-
10  This program is distributed in the hope that it will be useful,
-
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
-
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-
13  GNU General Public License for more details.
-
14 
-
15  You should have received a copy of the GNU General Public License
-
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
-
17  */
-
24 #ifndef __AUTO_ANALOG_H__
-
25 #define __AUTO_ANALOG_H__
-
26 
-
27 #include "AutoAnalog_config.h"
-
28 #if defined (ESP32)
-
29  #include "driver/i2s.h"
-
30 #endif
-
31 
-
32 #define AAA_CHANNEL0 0
-
33 #define AAA_CHANNEL1 1
-
34 #define AAA_MODE_STEREO 2
-
35 
- -
37 {
-
38 
-
39 public:
-
40 
- -
49 
-
51  void begin(bool enADC, bool enDAC);
-
52 
-
56  void triggerADC();
-
57 
-
66  void getADC(uint32_t samples = MAX_BUFFER_SIZE);
-
67 
-
74  void feedDAC(uint8_t dacChannel = 0, uint32_t samples = MAX_BUFFER_SIZE, bool startInterrupts = false);
-
75 
-
81  uint8_t dacBuffer[MAX_BUFFER_SIZE];
-
82 
-
88  uint8_t adcBuffer[MAX_BUFFER_SIZE];
-
89 
-
95  uint16_t dacBuffer16[MAX_BUFFER_SIZE];
-
96 
-
102  uint16_t adcBuffer16[MAX_BUFFER_SIZE];
-
103 
-
108  void setSampleRate(uint32_t sampRate = 0, bool stereo = true);
-
109 
-
111  void dacHandler(void);
-
112 
- -
118 
-
119 
- -
129 
- -
140 
-
148  void enableAdcChannel(uint8_t pinAx);
-
149 
-
154  void disableAdcChannel(uint8_t pinAx);
-
155 
-
160  void disableDAC(bool withinTask = false);
-
161 
-
172  void adcInterrupts(bool enabled = true);
-
173 
-
174  void dacInterrupts(bool enabled = true, bool withinTask = false);
-
175 
-
176  #if defined (ESP32) || defined (DOXYGEN_FORCED)
-
180  void rampOut(uint8_t sample);
-
181  void rampIn(uint8_t sample);
-
182  TaskHandle_t dacTaskHandle;
-
183  #endif
-
184 
-
187 private:
-
188 
-
197 #if defined (ARDUINO_ARCH_SAM)
-
198  bool whichDma = 0;
-
199  bool whichDac;
-
200  bool dacChan;
-
201 
-
202  uint8_t aCtr = 0; /* Internal counter for ADC data */
-
203  uint16_t realBuf[MAX_BUFFER_SIZE]; /* Internal DAC buffer */
-
204  uint16_t adcDma[MAX_BUFFER_SIZE]; /* Buffers for ADC DMA transfers */
-
205  uint16_t dataReady; /* Internal indicator for DAC data */
-
206 
-
207  uint32_t dataTimer; /* Internal timer tracks timing of incoming data */
-
208  uint32_t sampleCount; /* Internal counter for delaying analysis of timing */
-
209  uint32_t tcTicks; /* Stores the current TC0 Ch0 counter value */
-
210  uint32_t tcTicks2; /* Stores the current TC0 Ch1 counter value */
-
211  uint32_t adjustDivider; /* Internal variables for adjusting timers on-the-fly */
-
212 
-
213  uint32_t dacNumSamples; /* Internal variable for number of samples sent to the DAC */
-
214  uint32_t adcNumSamples;
-
215  uint16_t adjustCtr; /* Internal variables for adjusting timers on-the-fly */
-
216  uint16_t adjustCtr2; /* Internal variables for adjusting timers on-the-fly */
-
217  uint32_t adcLastAdjust;
-
218 #endif
-
219  void adcSetup(void); /* Enable the ADC */
-
220  void dacSetup(void); /* Enable the DAC */
-
221 
-
222  void dacBufferStereo(uint8_t dacChannel);
-
223 
-
224  void tcSetup(uint32_t sampRate = 0); /* Sets up Timer TC0 Channel 0 */
-
225  void tc2Setup(uint32_t sampRate = 0); /* Sets up Timer TC0 Channel 1 */
-
226 
-
227  uint32_t frequencyToTimerCount(uint32_t Frequency); /* Function to calculate timer counters */
-
228 
-
229 #if defined ESP32
-
230 
-
231  uint32_t sampleRate;
-
232  i2s_config_t i2s_cfg;
-
233 
-
234  bool i2sStopped;
-
235  adc1_channel_t adcChannel;
-
236 
-
237  bool taskCreated;
-
238 
-
239  bool dacEnabled;
-
240  uint8_t lastDacSample;
-
241  i2s_event_t myI2SQueue[5];
-
242  //void dacTask(void *args);
-
243 
-
244  bool adcTaskCreated;
-
245  bool adcDisabled;
-
246 
-
247  #define DELAY_250MS (250 / portTICK_PERIOD_MS)
-
248 
-
249 #endif
-
251 };
-
252 
-
253 
-
254 
-
255 #endif
-
256 
-
257 
- +Go to the documentation of this file.
1 /*
+
2 AutoAnalogAudio streaming via DAC & ADC by TMRh20
+
3 Copyright (C) 2016-2020 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
+
4
+
5 This program is free software: you can redistribute it and/or modify
+
6 it under the terms of the GNU General Public License as published by
+
7 the Free Software Foundation, either version 3 of the License, or
+
8 (at your option) any later version.
+
9
+
10 This program is distributed in the hope that it will be useful,
+
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
+
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
13 GNU General Public License for more details.
+
14
+
15 You should have received a copy of the GNU General Public License
+
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
+
17 */
+
24#ifndef __AUTO_ANALOG_H__
+
25#define __AUTO_ANALOG_H__
+
26
+
27#include "AutoAnalog_config.h"
+
28#if defined (ESP32)
+
29 #include "driver/i2s.h"
+
30#endif
+
31
+
32
+
33#define AAA_CHANNEL0 0
+
34#define AAA_CHANNEL1 1
+
35#define AAA_MODE_STEREO 2
+
36
+ +
38{
+
39
+
40public:
+
41
+ +
50
+
52 void begin(bool enADC, bool enDAC);
+
53
+
57 void triggerADC();
+
58
+
67 void getADC(uint32_t samples = MAX_BUFFER_SIZE);
+
68
+
75 void feedDAC(uint8_t dacChannel = 0, uint32_t samples = MAX_BUFFER_SIZE, bool startInterrupts = false);
+
76
+
82 uint8_t dacBuffer[MAX_BUFFER_SIZE];
+
83
+
89 uint8_t adcBuffer[MAX_BUFFER_SIZE];
+
90
+
96 uint16_t dacBuffer16[MAX_BUFFER_SIZE];
+
97
+
103 #if !defined(ARDUINO_ARCH_NRF52840) && !defined (ARDUINO_ARCH_NRF52) || defined ARDUINO_NRF52840_FEATHER
+
104 uint16_t adcBuffer16[MAX_BUFFER_SIZE];
+
105 #else
+
106 inline static int16_t adcBuffer16[MAX_BUFFER_SIZE];
+
107 #endif
+
108
+
113 void setSampleRate(uint32_t sampRate = 0, bool stereo = true);
+
114
+
116 void dacHandler(void);
+
117
+ +
123
+
124
+ +
134
+ +
145
+
153 void enableAdcChannel(uint8_t pinAx);
+
154
+
159 void disableAdcChannel(uint8_t pinAx);
+
160
+
165 void disableDAC(bool withinTask = false);
+
166
+
177 void adcInterrupts(bool enabled = true);
+
178
+
179 void dacInterrupts(bool enabled = true, bool withinTask = false);
+
180
+
181 #if defined (ESP32) || defined (DOXYGEN_FORCED)
+
185 void rampOut(uint8_t sample);
+
186 void rampIn(uint8_t sample);
+
187 TaskHandle_t dacTaskHandle;
+
188 #endif
+
189
+
192#if defined (ARDUINO_ARCH_NRF52840) || defined (ARDUINO_ARCH_NRF52) && !defined ARDUINO_NRF52840_FEATHER
+
193 inline static uint8_t aCtr;
+
194 inline static uint32_t aSize;
+
195 inline static uint16_t *buf0 = NULL;
+
196 inline static uint16_t *buf1 = NULL;
+
197 inline static void (*_onReceive)(uint16_t *buf, uint32_t buf_len) = NULL;
+
198 inline static void adcCallback(uint16_t *buf, uint32_t buf_len);
+
199 inline static void set_callback(void(*function)(uint16_t *buf, uint32_t buf_len));
+
200 inline static bool adcReady;
+
201 inline static uint16_t dacBuf0[MAX_BUFFER_SIZE];
+
202 inline static uint16_t dacBuf1[MAX_BUFFER_SIZE];
+
203 bool micOn;
+
204 int pwrPin;
+
205 int dinPin;
+
206 int clkPin;
+
207 int8_t gain;
+
208 inline static uint32_t sampleCounter;
+
209#endif
+
210
+
211#if defined ARDUINO_NRF52840_FEATHER
+
212 uint16_t dacBuf0[MAX_BUFFER_SIZE];
+
213 uint16_t dacBuf1[MAX_BUFFER_SIZE];
+
214#endif
+
215
+
216private:
+
217
+
226#if defined (ARDUINO_ARCH_SAM)
+
227 bool whichDma = 0;
+
228 bool whichDac;
+
229 bool dacChan;
+
230
+
231 uint8_t aCtr = 0; /* Internal counter for ADC data */
+
232 uint16_t realBuf[MAX_BUFFER_SIZE]; /* Internal DAC buffer */
+
233 uint16_t adcDma[MAX_BUFFER_SIZE]; /* Buffers for ADC DMA transfers */
+
234 uint16_t dataReady; /* Internal indicator for DAC data */
+
235
+
236 uint32_t dataTimer; /* Internal timer tracks timing of incoming data */
+
237 uint32_t sampleCount; /* Internal counter for delaying analysis of timing */
+
238 uint32_t tcTicks; /* Stores the current TC0 Ch0 counter value */
+
239 uint32_t tcTicks2; /* Stores the current TC0 Ch1 counter value */
+
240 uint32_t adjustDivider; /* Internal variables for adjusting timers on-the-fly */
+
241
+
242 uint32_t dacNumSamples; /* Internal variable for number of samples sent to the DAC */
+
243 uint32_t adcNumSamples;
+
244 uint16_t adjustCtr; /* Internal variables for adjusting timers on-the-fly */
+
245 uint16_t adjustCtr2; /* Internal variables for adjusting timers on-the-fly */
+
246 uint32_t adcLastAdjust;
+
247#endif
+
248 void adcSetup(void); /* Enable the ADC */
+
249 void dacSetup(void); /* Enable the DAC */
+
250
+
251 void dacBufferStereo(uint8_t dacChannel);
+
252
+
253 void tcSetup(uint32_t sampRate = 0); /* Sets up Timer TC0 Channel 0 */
+
254 void tc2Setup(uint32_t sampRate = 0); /* Sets up Timer TC0 Channel 1 */
+
255
+
256 uint32_t frequencyToTimerCount(uint32_t Frequency); /* Function to calculate timer counters */
+
257
+
258#if defined ESP32
+
259
+
260 uint32_t sampleRate;
+
261 i2s_config_t i2s_cfg;
+
262
+
263 bool i2sStopped;
+
264 adc1_channel_t adcChannel;
+
265
+
266 bool taskCreated;
+
267
+
268 bool dacEnabled;
+
269 uint8_t lastDacSample;
+
270 i2s_event_t myI2SQueue[5];
+
271 //void dacTask(void *args);
+
272
+
273 bool adcTaskCreated;
+
274 bool adcDisabled;
+
275
+
276 #define DELAY_250MS (250 / portTICK_PERIOD_MS)
+
277
+
278#endif
+
280};
+
281
+
282
+
283
+
284#endif
+
285
+
286
+
void adcInterrupts(bool enabled=true)
void dacHandler(void)
-
uint8_t dacBitsPerSample
+
uint8_t dacBitsPerSample
void rampIn(uint8_t sample)
-
uint8_t adcBuffer[MAX_BUFFER_SIZE]
- +
uint8_t adcBuffer[MAX_BUFFER_SIZE]
+ -
uint8_t dacBuffer[MAX_BUFFER_SIZE]
-
TaskHandle_t dacTaskHandle
+
uint8_t dacBuffer[MAX_BUFFER_SIZE]
+
TaskHandle_t dacTaskHandle
void getADC(uint32_t samples=MAX_BUFFER_SIZE)
-
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
+
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
void rampOut(uint8_t sample)
void disableDAC(bool withinTask=false)
-
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
+
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void dacInterrupts(bool enabled=true, bool withinTask=false)
void enableAdcChannel(uint8_t pinAx)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
-
uint8_t adcBitsPerSample
+
uint8_t adcBitsPerSample
void triggerADC()
void begin(bool enADC, bool enDAC)
void disableAdcChannel(uint8_t pinAx)
diff --git a/MultiChannelAdcStream_8ino-example.html b/MultiChannelAdcStream_8ino-example.html index 0cc0d31..2b04d97 100644 --- a/MultiChannelAdcStream_8ino-example.html +++ b/MultiChannelAdcStream_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: MultiChannelAdcStream.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,21 +58,27 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
MultiChannelAdcStream.ino
+
MultiChannelAdcStream.ino
-

For Arduino Due
+

For Arduino Due

-

Multi Channel ADC Sampling Example:

-

This example demonstrates how to capture a steady stream of ADC data on multiple channels. Currently pins A0-A6 are supported.

-

See AnalogAudio_config.h to change the MAX_BUFFER_SIZE allowing larger chunks of data

+

Multi Channel ADC Sampling Example:

+

This example demonstrates how to capture a steady stream of ADC data on multiple channels. Currently pins A0-A6 are supported.

+

See AnalogAudio_config.h to change the MAX_BUFFER_SIZE allowing larger chunks of data

/*
AutoAnalogAudio streaming via DAC & ADC by TMRh20
Copyright (C) 2016 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
@@ -116,28 +122,28 @@
*/
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
/*********************************************************/
void setup() {
-
Serial.begin(115200);
+
Serial.begin(115200);
Serial.println("Analog Audio Begin");
-
aaAudio.begin(1, 0); //Setup aaAudio using ADC only
-
aaAudio.autoAdjust = 0; //Disable auto adjust of timers
-
aaAudio.adcBitsPerSample = 12; //Sample at 12-bits
-
aaAudio.setSampleRate(32); //Get 32 samples every second
+
aaAudio.begin(1, 0); //Setup aaAudio using ADC only
+
aaAudio.autoAdjust = 0; //Disable auto adjust of timers
+
aaAudio.adcBitsPerSample = 12; //Sample at 12-bits
+
aaAudio.setSampleRate(32); //Get 32 samples every second
//AAAudio samples on analog pin A0 by default
//Enable sampling on two pins at once
-
aaAudio.enableAdcChannel(1); //Channels correspond to pin numbers (A1 == channel 1)
+
aaAudio.enableAdcChannel(1); //Channels correspond to pin numbers (A1 == channel 1)
//aaAudio.enableAdcChannel(2); //Optionally enable a third channel on pin A2
//aaAudio.disableAdcChannel(0); //Optionally disable pin A0 and only sample 1 pin
//Start loading ADC buffers
-
aaAudio.getADC(32);
+
aaAudio.getADC(32);
}
/*********************************************************/
@@ -148,14 +154,14 @@
// Note: This function only blocks if the ADC is currently sampling and autoAdjust is set to 0
// As long as any additional code completes before the ADC is finished sampling, a continuous stream of ADC data
// at the defined sample rate will be available
-
aaAudio.getADC(32);
+
aaAudio.getADC(32);
// Sum all the samples into a float
float pinA0Samples = 0.0;
float pinA1Samples = 0.0;
for (int i = 0; i < 32; i += 2) {
-
pinA1Samples += aaAudio.adcBuffer16[i]; //Samples from highest pin number (A1)
-
pinA0Samples += aaAudio.adcBuffer16[i + 1]; //Samples from next lowest pin number (A0)
+
pinA1Samples += aaAudio.adcBuffer16[i]; //Samples from highest pin number (A1)
+
pinA0Samples += aaAudio.adcBuffer16[i + 1]; //Samples from next lowest pin number (A0)
}
// Divide the total by the number of samples
@@ -173,18 +179,18 @@
/*********************************************************/
- - + +
void getADC(uint32_t samples=MAX_BUFFER_SIZE)
-
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
+
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void enableAdcChannel(uint8_t pinAx)
-
uint8_t adcBitsPerSample
+
uint8_t adcBitsPerSample
void begin(bool enADC, bool enDAC)
diff --git a/NRF52_PDM_PWMTest_8ino-example.html b/NRF52_PDM_PWMTest_8ino-example.html new file mode 100644 index 0000000..be4dc6b --- /dev/null +++ b/NRF52_PDM_PWMTest_8ino-example.html @@ -0,0 +1,122 @@ + + + + + + + +Auto Analog Audio: NRF52_PDM_PWMTest.ino + + + + + + + + + + +
+
+ + + + + + +
+
Auto Analog Audio v1.44 +
+
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
NRF52_PDM_PWMTest.ino
+
+
+

For Arduino XIAO 52840 Sense
+

+

Recording (pin A0) and playback (pin 5)

+

This example demonstrates recording and playback on a single device using PDM microphone and PWM output

+
+
AutoAnalog aaAudio;
+
+
// REQUIRES MBed Enabled Core for NRF52 (XIAO 52840 Sense)
+
+
void setup() {
+
+
//Startup the PDM Microphone and PWM(pseudo DAC) on pin 5
+
aaAudio.begin(1, 1);
+
aaAudio.autoAdjust = 0;
+
aaAudio.adcBitsPerSample = 16; // 16-bit audio at 16khz is the default on NRF52 and cannot be modified currently (in progress)
+
aaAudio.dacBitsPerSample = 16;
+
aaAudio.setSampleRate(16000);
+
+
}
+
+
void loop() {
+
+
aaAudio.getADC(320); // Get 320 Samples from the ADC
+
for (int i = 0; i < 320; i++) { // Copy them into the DAC Buffer and change from signed to unsigned ( + 0x8000)
+
aaAudio.dacBuffer16[i] = (uint16_t)(aaAudio.adcBuffer16[i] + 0x8000);
+
}
+
aaAudio.feedDAC(320); // Feed the DAC with the ADC data
+
}
+ + +
uint8_t dacBitsPerSample
+ +
void getADC(uint32_t samples=MAX_BUFFER_SIZE)
+
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
+
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
+
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
+
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
+
uint8_t adcBitsPerSample
+
void begin(bool enADC, bool enDAC)
+
+ + + + diff --git a/SdAudioAuto_8ino-example.html b/SdAudioAuto_8ino-example.html index 20bc93b..ccb3ee7 100644 --- a/SdAudioAuto_8ino-example.html +++ b/SdAudioAuto_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: SdAudioAuto.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,20 +58,26 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
SdAudioAuto.ino
+
SdAudioAuto.ino
-

For Arduino Due
+

For Arduino Due

-

Auto SDAudio Example:

-

This example demonstrates how to play *.wav files from SD Card using interrupts.

+

Auto SDAudio Example:

+

This example demonstrates how to play *.wav files from SD Card using interrupts.

/*
AutoAnalogAudio streaming via DAC & ADC by TMRh20
Copyright (C) 2016 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
@@ -105,7 +111,7 @@
#include <SD.h>
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
File myFile;
@@ -114,8 +120,8 @@
/*********************************************************/
void DACC_Handler(void) {
-
aaAudio.feedDAC(channelSelection); //Feed the DAC with the data loaded into the dacBuffer
-
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
+
aaAudio.feedDAC(channelSelection); //Feed the DAC with the data loaded into the dacBuffer
+
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
loadBuffer(); //Call the loadBuffer() function defined below to buffer from SD Card
}
@@ -131,8 +137,8 @@
Serial.println("SD ok");
Serial.println("Analog Audio Begin");
-
aaAudio.begin(0, 1); //Setup aaAudio using DAC
-
aaAudio.autoAdjust = 0;
+
aaAudio.begin(0, 1); //Setup aaAudio using DAC
+
aaAudio.autoAdjust = 0;
}
/*********************************************************/
@@ -143,9 +149,9 @@
char input = Serial.read();
switch (input) {
//Play an 8-bit, 22Khz, Stereo WAV file
-
case '1': aaAudio.dacBitsPerSample = 8; aaAudio.setSampleRate(24000); playAudio("M8b24kM.wav"); break;
+
case '1': aaAudio.dacBitsPerSample = 8; aaAudio.setSampleRate(24000); playAudio("M8b24kM.wav"); break;
//Play an 8-bit, 32Khz, Stereo WAV file
-
case '2': aaAudio.dacBitsPerSample = 8; aaAudio.setSampleRate(48000); playAudio("M8b24kS.wav"); break;
+
case '2': aaAudio.dacBitsPerSample = 8; aaAudio.setSampleRate(48000); playAudio("M8b24kS.wav"); break;
case '3': channelSelection = 0; break;
case '4': channelSelection = 1; break;
case '5': channelSelection = 2; break;
@@ -160,7 +166,7 @@
void playAudio(char *audioFile) {
if (myFile) {
-
aaAudio.disableDAC();
+
aaAudio.disableDAC();
myFile.close();
}
@@ -173,7 +179,7 @@
//Load one buffer
loadBuffer();
//Feed the DAC to start playback
-
aaAudio.feedDAC();
+
aaAudio.feedDAC();
}
}
@@ -184,15 +190,15 @@
if (myFile) {
if (myFile.available()) {
-
if (aaAudio.dacBitsPerSample == 8) {
+
if (aaAudio.dacBitsPerSample == 8) {
//Load 32 samples into the 8-bit dacBuffer
-
myFile.read((byte*)aaAudio.dacBuffer, MAX_BUFFER_SIZE);
+
myFile.read((byte*)aaAudio.dacBuffer, MAX_BUFFER_SIZE);
} else {
//Load 32 samples (64 bytes) into the 16-bit dacBuffer
-
myFile.read((byte*)aaAudio.dacBuffer16, MAX_BUFFER_SIZE * 2);
+
myFile.read((byte*)aaAudio.dacBuffer16, MAX_BUFFER_SIZE * 2);
//Convert the 16-bit samples to 12-bit
for (int i = 0; i < MAX_BUFFER_SIZE; i++) {
-
aaAudio.dacBuffer16[i] = (aaAudio.dacBuffer16[i] + 0x8000) >> 4;
+
aaAudio.dacBuffer16[i] = (aaAudio.dacBuffer16[i] + 0x8000) >> 4;
}
}
} else {
@@ -204,20 +210,20 @@
/*********************************************************/
- +
void dacHandler(void)
-
uint8_t dacBitsPerSample
- -
uint8_t dacBuffer[MAX_BUFFER_SIZE]
+
uint8_t dacBitsPerSample
+ +
uint8_t dacBuffer[MAX_BUFFER_SIZE]
void disableDAC(bool withinTask=false)
-
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
+
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
void begin(bool enADC, bool enDAC)
diff --git a/SdAudioBasic_8ino-example.html b/SdAudioBasic_8ino-example.html index c44a9a1..93594bd 100644 --- a/SdAudioBasic_8ino-example.html +++ b/SdAudioBasic_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: SdAudioBasic.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,20 +58,26 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
SdAudioBasic.ino
+
SdAudioBasic.ino
-

For Arduino Due
+

For Arduino Due

-

Basic SDAudio Example:

-

This example demonstrates how to play *.wav files from SD Card.

+

Basic SDAudio Example:

+

This example demonstrates how to play *.wav files from SD Card.

/*
AutoAnalogAudio streaming via DAC & ADC by TMRh20
Copyright (C) 2016 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
@@ -101,12 +107,12 @@
#include <SD.h>
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
/*********************************************************/
void DACC_Handler(void) {
-
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
+
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
}
/*********************************************************/
@@ -122,12 +128,12 @@
Serial.println("init ok");
Serial.println("Analog Audio Begin");
-
aaAudio.begin(0, 1); //Setup aaAudio using DAC
-
aaAudio.autoAdjust = 0;
+
aaAudio.begin(0, 1); //Setup aaAudio using DAC
+
aaAudio.autoAdjust = 0;
//Setup for audio at 8-bit, 16khz, mono
-
aaAudio.dacBitsPerSample = 8;
-
aaAudio.setSampleRate(16000);
+
aaAudio.dacBitsPerSample = 8;
+
aaAudio.setSampleRate(16000);
}
@@ -169,27 +175,27 @@
//Load 32 samples into the 8-bit dacBuffer
if (myFile.available()) {
for (int i = 0; i < 32; i++) {
-
aaAudio.dacBuffer[i] = myFile.read();
+
aaAudio.dacBuffer[i] = myFile.read();
}
//Feed the dac with the buffer of data
-
aaAudio.feedDAC(0, 32);
+
aaAudio.feedDAC(0, 32);
}
}
- +
void dacHandler(void)
-
uint8_t dacBitsPerSample
- -
uint8_t dacBuffer[MAX_BUFFER_SIZE]
+
uint8_t dacBitsPerSample
+ +
uint8_t dacBuffer[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
void begin(bool enADC, bool enDAC)
diff --git a/SdAudioRecording_8ino-example.html b/SdAudioRecording_8ino-example.html index 1add66c..557c0de 100644 --- a/SdAudioRecording_8ino-example.html +++ b/SdAudioRecording_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: SdAudioRecording.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,20 +58,26 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
SdAudioRecording.ino
+
SdAudioRecording.ino
-

For Arduino Due
+

For Arduino Due

-

Wav Recording SDAudio Example:

-

This example demonstrates recording standard format *.wav files for playback on any PC or audio device.

+

Wav Recording SDAudio Example:

+

This example demonstrates recording standard format *.wav files for playback on any PC or audio device.

/*
AutoAnalogAudio streaming via DAC & ADC by TMRh20
Copyright (C) 2016 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
@@ -107,14 +113,14 @@
#define AUDIO_DEBUG
#define RECORD_DEBUG
-
const char newWavFile[] = "test.wav";
+
const char newWavFile[] = "/test.wav";
/*********************************************************/
#include <SPI.h>
#include <SD.h>
/*********************************************************/
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
File myFile;
File recFile;
/*********************************************************/
@@ -124,7 +130,7 @@
void setup() {
-
Serial.begin(115200);
+
Serial.begin(115200);
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD init failed!");
@@ -132,13 +138,14 @@
}
Serial.println("SD ok\nAnalog Audio Begin");
-
aaAudio.begin(1, 1); // Start AAAudio with ADC & DAC
-
aaAudio.autoAdjust = 0; // Disable automatic timer adjustment
+
aaAudio.begin(1, 1); // Start AAAudio with ADC & DAC
+
aaAudio.autoAdjust = 0; // Disable automatic timer adjustment
}
/*********************************************************/
uint32_t displayTimer = 0;
+
bool recording = false;
void loop() {
@@ -155,33 +162,38 @@
char input = Serial.read();
switch (input) {
-
case '1': playAudio("M8b24kM.wav"); break; //Play a *.wav file by name - 8bit, 24khz, Mono
-
case '2': playAudio("M8b24kS.wav"); break; //Play 8bit, 24khz, Stereo
-
case '3': playAudio("M16b24kS.wav"); break; //Play 16bit, 24khz, Stereo
-
case '4': playAudio("M8b44kST.wav"); break; //Play 8bit, 44khz, Stereo
+
case '1': playAudio("/M8b24kM.wav"); break; //Play a *.wav file by name - 8bit, 24khz, Mono
+
case '2': playAudio("/M8b24kS.wav"); break; //Play 8bit, 24khz, Stereo
+
case '3': playAudio("/M16b24kS.wav"); break; //Play 16bit, 24khz, Stereo
+
case '4': playAudio("/M8b44kST.wav"); break; //Play 8bit, 44khz, Stereo
case '5': channelSelection = 0; break; //Play the audio on DAC0
case '6': channelSelection = 1; break; //Play the audio on DAC1
case '7': channelSelection = 2; break; //Play the audio on DAC0 & DAC1
case '8': Serial.println("OK"); break;
-
case '9': startRecording(newWavFile, 11000); break; //Start recording @11khz,8-bit,Mono
-
case '0': stopRecording(newWavFile, 11000); break; //Stop the recording and finalize the file
+
case '9': startRecording(newWavFile, 24000); recording = true; break; //Start recording @11khz,8-bit,Mono
+
case '0': stopRecording(newWavFile, 24000); recording = false; break; //Stop the recording and finalize the file
case 'p': playAudio(newWavFile); break; //Play back the recorded audio
case 'D': SD.remove(newWavFile); break; //Delete the file and start fresh
}
}
-
}
-
/*********************************************************/
+
#if defined (ESP32)
+
if(recording){
+
ADC_Handler();
+
}
+
#endif
+
}
+
/*********************************************************/
- - + +
void begin(bool enADC, bool enDAC)
diff --git a/SdAudioWavPlayer_8ino-example.html b/SdAudioWavPlayer_8ino-example.html index b0649ad..0b5a4d6 100644 --- a/SdAudioWavPlayer_8ino-example.html +++ b/SdAudioWavPlayer_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: SdAudioWavPlayer.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,20 +58,26 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
SdAudioWavPlayer.ino
+
SdAudioWavPlayer.ino
-

For Arduino Due
+

For Arduino Due

-

Wav Player SDAudio Example:

-

This example demonstrates a simple *.wav player with a few features

+

Wav Player SDAudio Example:

+

This example demonstrates a simple *.wav player with a few features

/*
AutoAnalogAudio streaming via DAC & ADC by TMRh20
Copyright (C) 2016 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
@@ -112,7 +118,7 @@
#include <SD.h>
/*********************************************************/
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
File myFile;
/*********************************************************/
#include "myWAV.h"
@@ -120,7 +126,7 @@
void setup() {
-
Serial.begin(115200);
+
Serial.begin(115200);
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD init failed!");
@@ -128,8 +134,8 @@
}
Serial.println("SD ok\nAnalog Audio Begin");
-
aaAudio.begin(0, 1); // Start AAAudio with only the DAC
-
aaAudio.autoAdjust = 0; // Disable automatic timer adjustment
+
aaAudio.begin(0, 1); // Start AAAudio with only the DAC
+
aaAudio.autoAdjust = 0; // Disable automatic timer adjustment
}
@@ -157,13 +163,13 @@
- - + +
void begin(bool enADC, bool enDAC)
diff --git a/SimpleAdcStream_8ino-example.html b/SimpleAdcStream_8ino-example.html index dfc74b5..a8c2199 100644 --- a/SimpleAdcStream_8ino-example.html +++ b/SimpleAdcStream_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: SimpleAdcStream.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ + @@ -58,21 +58,27 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
SimpleAdcStream.ino
+
SimpleAdcStream.ino
-

For Arduino Due
+

For Arduino Due

-

Simple ADC capturing Example:

-

This example demonstrates how to capture a steady stream of ADC data

-

See AnalogAudio_config.h to change the MAX_BUFFER_SIZE allowing larger chunks

+

Simple ADC capturing Example:

+

This example demonstrates how to capture a steady stream of ADC data

+

See AnalogAudio_config.h to change the MAX_BUFFER_SIZE allowing larger chunks

/*
AutoAnalogAudio streaming via DAC & ADC by TMRh20
Copyright (C) 2016 TMRh20 - tmrh20@gmail.com, github.com/TMRh20
@@ -114,7 +120,7 @@
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
/*********************************************************/
@@ -126,13 +132,13 @@
Serial.begin(115200);
Serial.println("Analog Audio Begin");
-
aaAudio.begin(1, 0); //Setup aaAudio using ADC only
-
aaAudio.autoAdjust = 0; //Disable auto adjust of timers
-
aaAudio.adcBitsPerSample = 12; //Sample at 12-bits
-
aaAudio.setSampleRate(32); //Get 32 samples every second
+
aaAudio.begin(1, 0); //Setup aaAudio using ADC only
+
aaAudio.autoAdjust = 0; //Disable auto adjust of timers
+
aaAudio.adcBitsPerSample = 12; //Sample at 12-bits
+
aaAudio.setSampleRate(32); //Get 32 samples every second
//Start loading ADC buffers
-
aaAudio.getADC(32);
+
aaAudio.getADC(32);
}
/*********************************************************/
@@ -143,12 +149,12 @@
// Note: This function only blocks if the ADC is currently sampling and autoAdjust is set to 0
// As long as any additional code completes before the ADC is finished sampling, a continuous stream of ADC data
// at the defined sample rate will be available
-
aaAudio.getADC(32);
+
aaAudio.getADC(32);
// Sum all the samples into a float
float allSamples = 0.0;
for (int i = 0; i < 32; i++) {
-
allSamples += aaAudio.adcBuffer16[i];
+
allSamples += aaAudio.adcBuffer16[i];
}
// Divide the total by the number of samples
@@ -163,17 +169,17 @@
/*********************************************************/
- - + +
void getADC(uint32_t samples=MAX_BUFFER_SIZE)
-
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
+
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
-
uint8_t adcBitsPerSample
+
uint8_t adcBitsPerSample
void begin(bool enADC, bool enDAC)
diff --git a/SimpleSine12Bit_8ino-example.html b/SimpleSine12Bit_8ino-example.html index ecb3d0e..dfd7a3e 100644 --- a/SimpleSine12Bit_8ino-example.html +++ b/SimpleSine12Bit_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: SimpleSine12Bit.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ + @@ -58,21 +58,27 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
SimpleSine12Bit.ino
+
SimpleSine12Bit.ino
-

For Arduino Due
+

For Arduino Due

-

Simple Sine Wave Generation Example:

-

This example demonstrates simple generation of a 12-bit sine wave

-

Send a number 1 or 2 over Serial to change frequency, +/- to adjust volume

+

Simple Sine Wave Generation Example:

+

This example demonstrates simple generation of a 12-bit sine wave

+

Send a number 1 or 2 over Serial to change frequency, +/- to adjust volume

/*
AutoAnalogAudio streaming via DAC & ADC by TMRh20
@@ -101,10 +107,10 @@
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
void DACC_Handler(void) {
-
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
+
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
}
@@ -113,10 +119,10 @@
Serial.begin(115200);
Serial.println("Analog Audio Begin");
-
aaAudio.begin(0, 1); //Setup aaAudio using DAC
-
aaAudio.autoAdjust = 0; //Disable automatic timer adjustment
-
aaAudio.setSampleRate(16000); //Set the sample rate to 16khz
-
aaAudio.dacBitsPerSample = 12; //Use 12-bit samples for the DAC
+
aaAudio.begin(0, 1); //Setup aaAudio using DAC
+
aaAudio.autoAdjust = 0; //Disable automatic timer adjustment
+
aaAudio.setSampleRate(16000); //Set the sample rate to 16khz
+
aaAudio.dacBitsPerSample = 12; //Use 12-bit samples for the DAC
arraysetup(); //Load the DAC buffer using a 32-step sine wave
}
@@ -130,7 +136,7 @@
//AutoAdjust is disabled above, so this function will block until the DAC is ready for more data
//All other processing needs to be completed before the DAC is out of data
//In this example, the DAC is being fed data in chunks of 32 bytes or 32 8-bit samples
-
aaAudio.feedDAC(0, 32);
+
aaAudio.feedDAC(0, 32);
//Choose between two different frequencies via Serial command
//Adjust the volume by sending a '+' or '-' over Serial
@@ -152,90 +158,90 @@
//Load a 32-step sine wave into the dacBuffer
//Shift the values according to volume
void arraysetup(void) {
-
aaAudio.dacBuffer16[0] = 0x800 >> shiftVal;
-
aaAudio.dacBuffer16[1] = 0x990 >> shiftVal;
-
aaAudio.dacBuffer16[2] = 0xB10 >> shiftVal;
-
aaAudio.dacBuffer16[3] = 0xC72 >> shiftVal;
-
aaAudio.dacBuffer16[4] = 0xDA8 >> shiftVal;
-
aaAudio.dacBuffer16[5] = 0xEA7 >> shiftVal;
-
aaAudio.dacBuffer16[6] = 0xF64 >> shiftVal;
-
aaAudio.dacBuffer16[7] = 0xFD9 >> shiftVal;
-
aaAudio.dacBuffer16[8] = 0xFFF >> shiftVal;
-
aaAudio.dacBuffer16[9] = 0xFD9 >> shiftVal;
-
aaAudio.dacBuffer16[10] = 0xF64 >> shiftVal;
-
aaAudio.dacBuffer16[11] = 0xEA7 >> shiftVal;
-
aaAudio.dacBuffer16[12] = 0xDA8 >> shiftVal;
-
aaAudio.dacBuffer16[13] = 0xC72 >> shiftVal;
-
aaAudio.dacBuffer16[14] = 0xB10 >> shiftVal;
-
aaAudio.dacBuffer16[15] = 0x990 >> shiftVal;
-
aaAudio.dacBuffer16[16] = 0x800 >> shiftVal;
-
aaAudio.dacBuffer16[17] = 0x670 >> shiftVal;
-
aaAudio.dacBuffer16[18] = 0x4F0 >> shiftVal;
-
aaAudio.dacBuffer16[19] = 0x38E >> shiftVal;
-
aaAudio.dacBuffer16[20] = 0x258 >> shiftVal;
-
aaAudio.dacBuffer16[21] = 0x159 >> shiftVal;
-
aaAudio.dacBuffer16[22] = 0x9C >> shiftVal;
-
aaAudio.dacBuffer16[23] = 0x27 >> shiftVal;
-
aaAudio.dacBuffer16[24] = 0x0 >> shiftVal;
-
aaAudio.dacBuffer16[25] = 0x27 >> shiftVal;
-
aaAudio.dacBuffer16[26] = 0x9c >> shiftVal;
-
aaAudio.dacBuffer16[27] = 0x159 >> shiftVal;
-
aaAudio.dacBuffer16[28] = 0x258 >> shiftVal;
-
aaAudio.dacBuffer16[29] = 0x38E >> shiftVal;
-
aaAudio.dacBuffer16[30] = 0x4F0 >> shiftVal;
-
aaAudio.dacBuffer16[31] = 0x670 >> shiftVal;
+
aaAudio.dacBuffer16[0] = 0x800 >> shiftVal;
+
aaAudio.dacBuffer16[1] = 0x990 >> shiftVal;
+
aaAudio.dacBuffer16[2] = 0xB10 >> shiftVal;
+
aaAudio.dacBuffer16[3] = 0xC72 >> shiftVal;
+
aaAudio.dacBuffer16[4] = 0xDA8 >> shiftVal;
+
aaAudio.dacBuffer16[5] = 0xEA7 >> shiftVal;
+
aaAudio.dacBuffer16[6] = 0xF64 >> shiftVal;
+
aaAudio.dacBuffer16[7] = 0xFD9 >> shiftVal;
+
aaAudio.dacBuffer16[8] = 0xFFF >> shiftVal;
+
aaAudio.dacBuffer16[9] = 0xFD9 >> shiftVal;
+
aaAudio.dacBuffer16[10] = 0xF64 >> shiftVal;
+
aaAudio.dacBuffer16[11] = 0xEA7 >> shiftVal;
+
aaAudio.dacBuffer16[12] = 0xDA8 >> shiftVal;
+
aaAudio.dacBuffer16[13] = 0xC72 >> shiftVal;
+
aaAudio.dacBuffer16[14] = 0xB10 >> shiftVal;
+
aaAudio.dacBuffer16[15] = 0x990 >> shiftVal;
+
aaAudio.dacBuffer16[16] = 0x800 >> shiftVal;
+
aaAudio.dacBuffer16[17] = 0x670 >> shiftVal;
+
aaAudio.dacBuffer16[18] = 0x4F0 >> shiftVal;
+
aaAudio.dacBuffer16[19] = 0x38E >> shiftVal;
+
aaAudio.dacBuffer16[20] = 0x258 >> shiftVal;
+
aaAudio.dacBuffer16[21] = 0x159 >> shiftVal;
+
aaAudio.dacBuffer16[22] = 0x9C >> shiftVal;
+
aaAudio.dacBuffer16[23] = 0x27 >> shiftVal;
+
aaAudio.dacBuffer16[24] = 0x0 >> shiftVal;
+
aaAudio.dacBuffer16[25] = 0x27 >> shiftVal;
+
aaAudio.dacBuffer16[26] = 0x9c >> shiftVal;
+
aaAudio.dacBuffer16[27] = 0x159 >> shiftVal;
+
aaAudio.dacBuffer16[28] = 0x258 >> shiftVal;
+
aaAudio.dacBuffer16[29] = 0x38E >> shiftVal;
+
aaAudio.dacBuffer16[30] = 0x4F0 >> shiftVal;
+
aaAudio.dacBuffer16[31] = 0x670 >> shiftVal;
}
//Load a 16-step sine wave into the dacBuffer
//Shift the values according to volume
void arraysetup2(void) {
-
aaAudio.dacBuffer16[0] = 0x800 >> shiftVal;
-
aaAudio.dacBuffer16[1] = 0xB10 >> shiftVal;
-
aaAudio.dacBuffer16[2] = 0xDA8 >> shiftVal;
-
aaAudio.dacBuffer16[3] = 0xF64 >> shiftVal;
-
aaAudio.dacBuffer16[4] = 0xFFF >> shiftVal;
-
aaAudio.dacBuffer16[5] = 0xF64 >> shiftVal;
-
aaAudio.dacBuffer16[6] = 0xDA8 >> shiftVal;
-
aaAudio.dacBuffer16[7] = 0xB10 >> shiftVal;
-
aaAudio.dacBuffer16[8] = 0x800 >> shiftVal;
-
aaAudio.dacBuffer16[9] = 0x4F0 >> shiftVal;
-
aaAudio.dacBuffer16[10] = 0x258 >> shiftVal;
-
aaAudio.dacBuffer16[11] = 0x9C >> shiftVal;
-
aaAudio.dacBuffer16[12] = 0x0 >> shiftVal;
-
aaAudio.dacBuffer16[13] = 0x9C >> shiftVal;
-
aaAudio.dacBuffer16[14] = 0x258 >> shiftVal;
-
aaAudio.dacBuffer16[15] = 0x4F0 >> shiftVal;
-
aaAudio.dacBuffer16[16] = 0x800 >> shiftVal;
-
aaAudio.dacBuffer16[17] = 0xB10 >> shiftVal;
-
aaAudio.dacBuffer16[18] = 0xDA8 >> shiftVal;
-
aaAudio.dacBuffer16[19] = 0xF64 >> shiftVal;
-
aaAudio.dacBuffer16[20] = 0x1000 >> shiftVal;
-
aaAudio.dacBuffer16[21] = 0xF64 >> shiftVal;
-
aaAudio.dacBuffer16[22] = 0xDA8 >> shiftVal;
-
aaAudio.dacBuffer16[23] = 0xB10 >> shiftVal;
-
aaAudio.dacBuffer16[24] = 0x800 >> shiftVal;
-
aaAudio.dacBuffer16[25] = 0x4F0 >> shiftVal;
-
aaAudio.dacBuffer16[26] = 0x258 >> shiftVal;
-
aaAudio.dacBuffer16[27] = 0x9C >> shiftVal;
-
aaAudio.dacBuffer16[28] = 0x0 >> shiftVal;
-
aaAudio.dacBuffer16[29] = 0x9C >> shiftVal;
-
aaAudio.dacBuffer16[30] = 0x258 >> shiftVal;
-
aaAudio.dacBuffer16[31] = 0x4F0 >> shiftVal;
+
aaAudio.dacBuffer16[0] = 0x800 >> shiftVal;
+
aaAudio.dacBuffer16[1] = 0xB10 >> shiftVal;
+
aaAudio.dacBuffer16[2] = 0xDA8 >> shiftVal;
+
aaAudio.dacBuffer16[3] = 0xF64 >> shiftVal;
+
aaAudio.dacBuffer16[4] = 0xFFF >> shiftVal;
+
aaAudio.dacBuffer16[5] = 0xF64 >> shiftVal;
+
aaAudio.dacBuffer16[6] = 0xDA8 >> shiftVal;
+
aaAudio.dacBuffer16[7] = 0xB10 >> shiftVal;
+
aaAudio.dacBuffer16[8] = 0x800 >> shiftVal;
+
aaAudio.dacBuffer16[9] = 0x4F0 >> shiftVal;
+
aaAudio.dacBuffer16[10] = 0x258 >> shiftVal;
+
aaAudio.dacBuffer16[11] = 0x9C >> shiftVal;
+
aaAudio.dacBuffer16[12] = 0x0 >> shiftVal;
+
aaAudio.dacBuffer16[13] = 0x9C >> shiftVal;
+
aaAudio.dacBuffer16[14] = 0x258 >> shiftVal;
+
aaAudio.dacBuffer16[15] = 0x4F0 >> shiftVal;
+
aaAudio.dacBuffer16[16] = 0x800 >> shiftVal;
+
aaAudio.dacBuffer16[17] = 0xB10 >> shiftVal;
+
aaAudio.dacBuffer16[18] = 0xDA8 >> shiftVal;
+
aaAudio.dacBuffer16[19] = 0xF64 >> shiftVal;
+
aaAudio.dacBuffer16[20] = 0x1000 >> shiftVal;
+
aaAudio.dacBuffer16[21] = 0xF64 >> shiftVal;
+
aaAudio.dacBuffer16[22] = 0xDA8 >> shiftVal;
+
aaAudio.dacBuffer16[23] = 0xB10 >> shiftVal;
+
aaAudio.dacBuffer16[24] = 0x800 >> shiftVal;
+
aaAudio.dacBuffer16[25] = 0x4F0 >> shiftVal;
+
aaAudio.dacBuffer16[26] = 0x258 >> shiftVal;
+
aaAudio.dacBuffer16[27] = 0x9C >> shiftVal;
+
aaAudio.dacBuffer16[28] = 0x0 >> shiftVal;
+
aaAudio.dacBuffer16[29] = 0x9C >> shiftVal;
+
aaAudio.dacBuffer16[30] = 0x258 >> shiftVal;
+
aaAudio.dacBuffer16[31] = 0x4F0 >> shiftVal;
}
- +
void dacHandler(void)
-
uint8_t dacBitsPerSample
- -
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
+
uint8_t dacBitsPerSample
+ +
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
void begin(bool enADC, bool enDAC)
diff --git a/SimpleSine_8ino-example.html b/SimpleSine_8ino-example.html index a9714d7..5df789c 100644 --- a/SimpleSine_8ino-example.html +++ b/SimpleSine_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: SimpleSine.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ + @@ -58,21 +58,27 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
SimpleSine.ino
+
SimpleSine.ino
-

For Arduino Due
+

For Arduino Due

-

Simple Sine Wave Generation Example:

-

This example demonstrates simple generation of a sine wave & optionally broadcasting the audio via radio

-

Send a number 1 or 2 over Serial to change frequency, +/- to adjust volume

+

Simple Sine Wave Generation Example:

+

This example demonstrates simple generation of a sine wave & optionally broadcasting the audio via radio

+

Send a number 1 or 2 over Serial to change frequency, +/- to adjust volume

Note
This code depends on radio.h located in the same directory.
/*
@@ -104,10 +110,10 @@
//#include <RF24.h>
//#include "myRadio.h"
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
void DACC_Handler(void) {
-
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
+
aaAudio.dacHandler(); //Link the DAC ISR/IRQ to the library. Called by the MCU when DAC is ready for data
}
@@ -119,9 +125,9 @@
//Optional: Setup the radio to broadcast the generated audio
//setupRadio();
-
aaAudio.begin(0, 1); //Setup aaAudio using DAC
-
aaAudio.autoAdjust = 0; //Disable automatic timer adjustment
-
aaAudio.setSampleRate(16050); //Set the sample rate to 16khz
+
aaAudio.begin(0, 1); //Setup aaAudio using DAC
+
aaAudio.autoAdjust = 0; //Disable automatic timer adjustment
+
aaAudio.setSampleRate(16050); //Set the sample rate to 16khz
arraysetup(); //Load the DAC buffer using a 32-step sine wave
}
@@ -136,7 +142,7 @@
//AutoAdjust is disabled above, so this function will block until the DAC is ready for more data
//All other processing needs to be completed before the DAC is out of data
//In this example, the DAC is being fed data in chunks of 32 bytes or 32 8-bit samples
-
aaAudio.feedDAC(0, 32);
+
aaAudio.feedDAC(0, 32);
//Optional: Broadcast the audio over radio
//radio.startFastWrite(&aaAudio.dacBuffer,32, 1);
@@ -162,88 +168,88 @@
//Load a 32-step sine wave into the dacBuffer
//Shift the values according to volume
void arraysetup(void) {
-
aaAudio.dacBuffer[0] = 127 >> shiftVal;
-
aaAudio.dacBuffer[1] = 152 >> shiftVal;
-
aaAudio.dacBuffer[2] = 176 >> shiftVal;
-
aaAudio.dacBuffer[3] = 198 >> shiftVal;
-
aaAudio.dacBuffer[4] = 217 >> shiftVal;
-
aaAudio.dacBuffer[5] = 233 >> shiftVal;
-
aaAudio.dacBuffer[6] = 245 >> shiftVal;
-
aaAudio.dacBuffer[7] = 252 >> shiftVal;
-
aaAudio.dacBuffer[8] = 254 >> shiftVal;
-
aaAudio.dacBuffer[9] = 252 >> shiftVal;
-
aaAudio.dacBuffer[10] = 245 >> shiftVal;
-
aaAudio.dacBuffer[11] = 233 >> shiftVal;
-
aaAudio.dacBuffer[12] = 217 >> shiftVal;
-
aaAudio.dacBuffer[13] = 198 >> shiftVal;
-
aaAudio.dacBuffer[14] = 176 >> shiftVal;
-
aaAudio.dacBuffer[15] = 152 >> shiftVal;
-
aaAudio.dacBuffer[16] = 128 >> shiftVal;
-
aaAudio.dacBuffer[17] = 103 >> shiftVal;
-
aaAudio.dacBuffer[18] = 79 >> shiftVal;
-
aaAudio.dacBuffer[19] = 57 >> shiftVal;
-
aaAudio.dacBuffer[20] = 38 >> shiftVal;
-
aaAudio.dacBuffer[21] = 22 >> shiftVal;
-
aaAudio.dacBuffer[22] = 10 >> shiftVal;
-
aaAudio.dacBuffer[23] = 3 >> shiftVal;
-
aaAudio.dacBuffer[24] = 0 >> shiftVal;
-
aaAudio.dacBuffer[25] = 3 >> shiftVal;
-
aaAudio.dacBuffer[26] = 10 >> shiftVal;
-
aaAudio.dacBuffer[27] = 22 >> shiftVal;
-
aaAudio.dacBuffer[28] = 38 >> shiftVal;
-
aaAudio.dacBuffer[29] = 57 >> shiftVal;
-
aaAudio.dacBuffer[30] = 79 >> shiftVal;
-
aaAudio.dacBuffer[31] = 103 >> shiftVal;
+
aaAudio.dacBuffer[0] = 127 >> shiftVal;
+
aaAudio.dacBuffer[1] = 152 >> shiftVal;
+
aaAudio.dacBuffer[2] = 176 >> shiftVal;
+
aaAudio.dacBuffer[3] = 198 >> shiftVal;
+
aaAudio.dacBuffer[4] = 217 >> shiftVal;
+
aaAudio.dacBuffer[5] = 233 >> shiftVal;
+
aaAudio.dacBuffer[6] = 245 >> shiftVal;
+
aaAudio.dacBuffer[7] = 252 >> shiftVal;
+
aaAudio.dacBuffer[8] = 254 >> shiftVal;
+
aaAudio.dacBuffer[9] = 252 >> shiftVal;
+
aaAudio.dacBuffer[10] = 245 >> shiftVal;
+
aaAudio.dacBuffer[11] = 233 >> shiftVal;
+
aaAudio.dacBuffer[12] = 217 >> shiftVal;
+
aaAudio.dacBuffer[13] = 198 >> shiftVal;
+
aaAudio.dacBuffer[14] = 176 >> shiftVal;
+
aaAudio.dacBuffer[15] = 152 >> shiftVal;
+
aaAudio.dacBuffer[16] = 128 >> shiftVal;
+
aaAudio.dacBuffer[17] = 103 >> shiftVal;
+
aaAudio.dacBuffer[18] = 79 >> shiftVal;
+
aaAudio.dacBuffer[19] = 57 >> shiftVal;
+
aaAudio.dacBuffer[20] = 38 >> shiftVal;
+
aaAudio.dacBuffer[21] = 22 >> shiftVal;
+
aaAudio.dacBuffer[22] = 10 >> shiftVal;
+
aaAudio.dacBuffer[23] = 3 >> shiftVal;
+
aaAudio.dacBuffer[24] = 0 >> shiftVal;
+
aaAudio.dacBuffer[25] = 3 >> shiftVal;
+
aaAudio.dacBuffer[26] = 10 >> shiftVal;
+
aaAudio.dacBuffer[27] = 22 >> shiftVal;
+
aaAudio.dacBuffer[28] = 38 >> shiftVal;
+
aaAudio.dacBuffer[29] = 57 >> shiftVal;
+
aaAudio.dacBuffer[30] = 79 >> shiftVal;
+
aaAudio.dacBuffer[31] = 103 >> shiftVal;
}
//Load a 16-step sine wave into the dacBuffer
//Shift the values according to volume
void arraysetup2(void) {
-
aaAudio.dacBuffer[0] = 127 >> shiftVal;
-
aaAudio.dacBuffer[1] = 176 >> shiftVal;
-
aaAudio.dacBuffer[2] = 217 >> shiftVal;
-
aaAudio.dacBuffer[3] = 245 >> shiftVal;
-
aaAudio.dacBuffer[4] = 254 >> shiftVal;
-
aaAudio.dacBuffer[5] = 245 >> shiftVal;
-
aaAudio.dacBuffer[6] = 217 >> shiftVal;
-
aaAudio.dacBuffer[7] = 176 >> shiftVal;
-
aaAudio.dacBuffer[8] = 128 >> shiftVal;
-
aaAudio.dacBuffer[9] = 79 >> shiftVal;
-
aaAudio.dacBuffer[10] = 38 >> shiftVal;
-
aaAudio.dacBuffer[11] = 10 >> shiftVal;
-
aaAudio.dacBuffer[12] = 0 >> shiftVal;
-
aaAudio.dacBuffer[13] = 10 >> shiftVal;
-
aaAudio.dacBuffer[14] = 38 >> shiftVal;
-
aaAudio.dacBuffer[15] = 79 >> shiftVal;
-
aaAudio.dacBuffer[16] = 127 >> shiftVal;
-
aaAudio.dacBuffer[17] = 176 >> shiftVal;
-
aaAudio.dacBuffer[18] = 217 >> shiftVal;
-
aaAudio.dacBuffer[19] = 245 >> shiftVal;
-
aaAudio.dacBuffer[20] = 254 >> shiftVal;
-
aaAudio.dacBuffer[21] = 245 >> shiftVal;
-
aaAudio.dacBuffer[22] = 217 >> shiftVal;
-
aaAudio.dacBuffer[23] = 176 >> shiftVal;
-
aaAudio.dacBuffer[24] = 128 >> shiftVal;
-
aaAudio.dacBuffer[25] = 79 >> shiftVal;
-
aaAudio.dacBuffer[26] = 38 >> shiftVal;
-
aaAudio.dacBuffer[27] = 10 >> shiftVal;
-
aaAudio.dacBuffer[28] = 0 >> shiftVal;
-
aaAudio.dacBuffer[29] = 10 >> shiftVal;
-
aaAudio.dacBuffer[30] = 38 >> shiftVal;
-
aaAudio.dacBuffer[31] = 79 >> shiftVal;
+
aaAudio.dacBuffer[0] = 127 >> shiftVal;
+
aaAudio.dacBuffer[1] = 176 >> shiftVal;
+
aaAudio.dacBuffer[2] = 217 >> shiftVal;
+
aaAudio.dacBuffer[3] = 245 >> shiftVal;
+
aaAudio.dacBuffer[4] = 254 >> shiftVal;
+
aaAudio.dacBuffer[5] = 245 >> shiftVal;
+
aaAudio.dacBuffer[6] = 217 >> shiftVal;
+
aaAudio.dacBuffer[7] = 176 >> shiftVal;
+
aaAudio.dacBuffer[8] = 128 >> shiftVal;
+
aaAudio.dacBuffer[9] = 79 >> shiftVal;
+
aaAudio.dacBuffer[10] = 38 >> shiftVal;
+
aaAudio.dacBuffer[11] = 10 >> shiftVal;
+
aaAudio.dacBuffer[12] = 0 >> shiftVal;
+
aaAudio.dacBuffer[13] = 10 >> shiftVal;
+
aaAudio.dacBuffer[14] = 38 >> shiftVal;
+
aaAudio.dacBuffer[15] = 79 >> shiftVal;
+
aaAudio.dacBuffer[16] = 127 >> shiftVal;
+
aaAudio.dacBuffer[17] = 176 >> shiftVal;
+
aaAudio.dacBuffer[18] = 217 >> shiftVal;
+
aaAudio.dacBuffer[19] = 245 >> shiftVal;
+
aaAudio.dacBuffer[20] = 254 >> shiftVal;
+
aaAudio.dacBuffer[21] = 245 >> shiftVal;
+
aaAudio.dacBuffer[22] = 217 >> shiftVal;
+
aaAudio.dacBuffer[23] = 176 >> shiftVal;
+
aaAudio.dacBuffer[24] = 128 >> shiftVal;
+
aaAudio.dacBuffer[25] = 79 >> shiftVal;
+
aaAudio.dacBuffer[26] = 38 >> shiftVal;
+
aaAudio.dacBuffer[27] = 10 >> shiftVal;
+
aaAudio.dacBuffer[28] = 0 >> shiftVal;
+
aaAudio.dacBuffer[29] = 10 >> shiftVal;
+
aaAudio.dacBuffer[30] = 38 >> shiftVal;
+
aaAudio.dacBuffer[31] = 79 >> shiftVal;
}
- +
void dacHandler(void)
- -
uint8_t dacBuffer[MAX_BUFFER_SIZE]
+ +
uint8_t dacBuffer[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
void begin(bool enADC, bool enDAC)
diff --git a/WirelessMicrophone_8ino-example.html b/WirelessMicrophone_8ino-example.html index 4636939..8ed3b80 100644 --- a/WirelessMicrophone_8ino-example.html +++ b/WirelessMicrophone_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: WirelessMicrophone.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ + @@ -58,21 +58,27 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
WirelessMicrophone.ino
+
WirelessMicrophone.ino
-

For Arduino Due
+

For Arduino Due

-

Simple Wireless Microphone:

-

Demonstration of a single wireless microphone/recording via ADC

-

The outgoing audio format is 8bit, mono, 16khz
+

Simple Wireless Microphone:

+

Demonstration of a single wireless microphone/recording via ADC

+

The outgoing audio format is 8bit, mono, 16khz
NRF24L01+ radios can support around 16-44khz sample rate w/12-bit samples, 88khz+ with 8-bit samples

Note
This code depends on radio.h located in the same directory.
/*
@@ -123,12 +129,12 @@
#include "myRadio.h"
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
/*********************************************************/
void DACC_Handler(void) {
-
aaAudio.dacHandler(); //Link the DAC ISR/IRQ library. Called by the MCU when DAC is ready for data
+
aaAudio.dacHandler(); //Link the DAC ISR/IRQ library. Called by the MCU when DAC is ready for data
}
/*********************************************************/
@@ -138,10 +144,10 @@
Serial.begin(115200);
Serial.println("Analog Audio Begin");
-
aaAudio.begin(1, 0); //Setup aaAudio using ADC only
-
aaAudio.autoAdjust = 0;
-
aaAudio.adcBitsPerSample = 8;
-
aaAudio.setSampleRate(16050);
+
aaAudio.begin(1, 0); //Setup aaAudio using ADC only
+
aaAudio.autoAdjust = 0;
+
aaAudio.adcBitsPerSample = 8;
+
aaAudio.setSampleRate(16050);
setupRadio();
}
@@ -166,25 +172,25 @@
}
// With autoAdjust disabled, getADC() will block until the ADC data is ready
-
aaAudio.getADC(32);
-
radio.writeFast(&aaAudio.adcBuffer, 32);
+
aaAudio.getADC(32);
+
radio.writeFast(&aaAudio.adcBuffer, 32);
}
/*********************************************************/
- +
void dacHandler(void)
-
uint8_t adcBuffer[MAX_BUFFER_SIZE]
- +
uint8_t adcBuffer[MAX_BUFFER_SIZE]
+
void getADC(uint32_t samples=MAX_BUFFER_SIZE)
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
-
uint8_t adcBitsPerSample
+
uint8_t adcBitsPerSample
void begin(bool enADC, bool enDAC)
diff --git a/WirelessSpeaker_8ino-example.html b/WirelessSpeaker_8ino-example.html index 4d769ef..fcf485a 100644 --- a/WirelessSpeaker_8ino-example.html +++ b/WirelessSpeaker_8ino-example.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: WirelessSpeaker.ino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ + @@ -58,21 +58,27 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
WirelessSpeaker.ino
+
WirelessSpeaker.ino
-

For Arduino Due
+

For Arduino Due

-

Simple Wireless Speaker:

-

Demonstration of a single wireless speaker/wireless audio

-

The incoming audio format is 16bit mono
+

Simple Wireless Speaker:

+

Demonstration of a single wireless speaker/wireless audio

+

The incoming audio format is 16bit mono
NRF24L01+ radios can support around 16-44khz sample rate w/16-bit samples, 88khz+ with 8-bit samples

Note
This code depends on radio.h located in the same directory.
/*
@@ -122,12 +128,12 @@
#include "myRadio.h"
-
AutoAnalog aaAudio;
+
AutoAnalog aaAudio;
/*********************************************************/
void DACC_Handler(void) {
-
aaAudio.dacHandler(); //Link the DAC ISR/IRQ library. Called by the MCU when DAC is ready for data
+
aaAudio.dacHandler(); //Link the DAC ISR/IRQ library. Called by the MCU when DAC is ready for data
}
/*********************************************************/
@@ -137,9 +143,9 @@
Serial.begin(115200);
Serial.println("Analog Audio Begin");
-
aaAudio.begin(0, 1); //Setup aaAudio using both DAC and ADC
-
aaAudio.autoAdjust = 1;
-
aaAudio.dacBitsPerSample = 12;
+
aaAudio.begin(0, 1); //Setup aaAudio using both DAC and ADC
+
aaAudio.autoAdjust = 1;
+
aaAudio.dacBitsPerSample = 12;
setupRadio();
}
@@ -187,19 +193,19 @@
if (pipeNo == 2) {
radio.read(&dynSampleRate, 4); // Receive commands using pipe #2
-
aaAudio.setSampleRate(dynSampleRate); // Pipe 2 is being used for command data, pipe 1 & others for audio data
+
aaAudio.setSampleRate(dynSampleRate); // Pipe 2 is being used for command data, pipe 1 & others for audio data
} else {
-
radio.read(&aaAudio.dacBuffer16, 32); // Read the available radio data
+
radio.read(&aaAudio.dacBuffer16, 32); // Read the available radio data
for (int i = 0; i < 16; i++) { //Convert signed 16-bit variables into unsigned 12-bit
-
aaAudio.dacBuffer16[i] += 0x8000;
-
aaAudio.dacBuffer16[i] = aaAudio.dacBuffer16[i] >> 4;
+
aaAudio.dacBuffer16[i] += 0x8000;
+
aaAudio.dacBuffer16[i] = aaAudio.dacBuffer16[i] >> 4;
}
//Received 32 bytes: 16 samples of 16-bits each
//Send them to the DAC using the channel selected via Serial command
-
aaAudio.feedDAC(channelSelection, 16);
+
aaAudio.feedDAC(channelSelection, 16);
}
}
}
@@ -207,18 +213,18 @@
/*********************************************************/
- +
void dacHandler(void)
-
uint8_t dacBitsPerSample
- -
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
+
uint8_t dacBitsPerSample
+ +
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
void setSampleRate(uint32_t sampRate=0, bool stereo=true)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
void begin(bool enADC, bool enDAC)
diff --git a/annotated.html b/annotated.html index 50c5b33..49d3fac 100644 --- a/annotated.html +++ b/annotated.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Class List @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ + @@ -58,14 +58,20 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
Class List
+
Class List
Here are the classes, structs, unions and interfaces with brief descriptions:
@@ -76,7 +82,7 @@
diff --git a/bc_sd.png b/bc_sd.png new file mode 100644 index 0000000..31ca888 Binary files /dev/null and b/bc_sd.png differ diff --git a/classAutoAnalog-members.html b/classAutoAnalog-members.html index 1bdd586..fada69f 100644 --- a/classAutoAnalog-members.html +++ b/classAutoAnalog-members.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Member List @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
AutoAnalog Member List
+
AutoAnalog Member List

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

- + - + - + - + - + - + - + - + - + - + - +
adcBitsPerSampleAutoAnalog
adcBufferAutoAnalog
adcBufferAutoAnalog
adcBuffer16AutoAnalog
adcInterrupts(bool enabled=true)AutoAnalog
adcInterrupts(bool enabled=true)AutoAnalog
autoAdjustAutoAnalog
AutoAnalog()AutoAnalog
AutoAnalog()AutoAnalog
begin(bool enADC, bool enDAC)AutoAnalog
dacBitsPerSampleAutoAnalog
dacBitsPerSampleAutoAnalog
dacBufferAutoAnalog
dacBuffer16AutoAnalog
dacBuffer16AutoAnalog
dacHandler(void)AutoAnalog
dacInterrupts(bool enabled=true, bool withinTask=false)AutoAnalog
dacInterrupts(bool enabled=true, bool withinTask=false)AutoAnalog
dacTaskHandleAutoAnalog
disableAdcChannel(uint8_t pinAx)AutoAnalog
disableAdcChannel(uint8_t pinAx)AutoAnalog
disableDAC(bool withinTask=false)AutoAnalog
enableAdcChannel(uint8_t pinAx)AutoAnalog
enableAdcChannel(uint8_t pinAx)AutoAnalog
feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)AutoAnalog
getADC(uint32_t samples=MAX_BUFFER_SIZE)AutoAnalog
getADC(uint32_t samples=MAX_BUFFER_SIZE)AutoAnalog
rampIn(uint8_t sample)AutoAnalog
rampOut(uint8_t sample)AutoAnalog
rampOut(uint8_t sample)AutoAnalog
setSampleRate(uint32_t sampRate=0, bool stereo=true)AutoAnalog
triggerADC()AutoAnalog
triggerADC()AutoAnalog
diff --git a/classAutoAnalog.html b/classAutoAnalog.html index 6b55bde..647a511 100644 --- a/classAutoAnalog.html +++ b/classAutoAnalog.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: AutoAnalog Class Reference @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
AutoAnalog Class Reference
+
AutoAnalog Class Reference

#include <AutoAnalogAudio.h>

- @@ -122,13 +128,13 @@

User Interface

Main methods to drive the library

+

Main methods to drive the library

uint8_t dacBuffer [MAX_BUFFER_SIZE]
 
 

Detailed Description

-
Examples
AudioRadioRelay.ino, MultiChannelAdcStream.ino, SdAudioAuto.ino, SdAudioBasic.ino, SdAudioRecording.ino, SdAudioWavPlayer.ino, SimpleAdcStream.ino, SimpleSine.ino, SimpleSine12Bit.ino, WirelessMicrophone.ino, and WirelessSpeaker.ino.
+

Constructor & Destructor Documentation

- -

◆ AutoAnalog()

+ +

◆ AutoAnalog()

@@ -145,8 +151,8 @@

Member Function Documentation

- -

◆ begin()

+ +

◆ begin()

- -

◆ triggerADC()

+ +

◆ triggerADC()

@@ -194,8 +200,8 @@

-

◆ getADC()

+ +

◆ getADC()

@@ -209,7 +215,7 @@

-

Load the current ADC data into the ADC Data Buffer

+

Load the current ADC data into the ADC Data Buffer

Parameters
@@ -217,13 +223,13 @@

Note
Changes to the number of samples will not take place until one buffer has been returned with the previous number of samples
-
Examples
AudioRadioRelay.ino, MultiChannelAdcStream.ino, SimpleAdcStream.ino, and WirelessMicrophone.ino.
+
Examples
AudioRadioRelay.ino, MultiChannelAdcStream.ino, NRF52_PDM_PWMTest.ino, SimpleAdcStream.ino, and WirelessMicrophone.ino.
- -

◆ feedDAC()

+ +

◆ feedDAC()

samplesThe number of samples to retrieve from the ADC
@@ -262,13 +268,13 @@

Examples
AudioRadioRelay.ino, SdAudioAuto.ino, SdAudioBasic.ino, SimpleSine.ino, SimpleSine12Bit.ino, and WirelessSpeaker.ino.
+
Examples
AudioRadioRelay.ino, NRF52_PDM_PWMTest.ino, SdAudioAuto.ino, SdAudioBasic.ino, SimpleSine.ino, SimpleSine12Bit.ino, and WirelessSpeaker.ino.
- -

◆ setSampleRate()

+ +

◆ setSampleRate()

dacChannel0 for DAC0, 1 for DAC1, 2 for alternating DAC0/DAC1
sampRateThis sets the defined sample rate ie: 32000 is 32Khz
stereoOnly used for the ESP32, this sets stereo or mono output and affects the sample rate
-
Examples
AudioRadioRelay.ino, MultiChannelAdcStream.ino, SdAudioAuto.ino, SdAudioBasic.ino, SimpleAdcStream.ino, SimpleSine.ino, SimpleSine12Bit.ino, WirelessMicrophone.ino, and WirelessSpeaker.ino.
+
Examples
AudioRadioRelay.ino, MultiChannelAdcStream.ino, NRF52_PDM_PWMTest.ino, SdAudioAuto.ino, SdAudioBasic.ino, SimpleAdcStream.ino, SimpleSine.ino, SimpleSine12Bit.ino, WirelessMicrophone.ino, and WirelessSpeaker.ino.

- -

◆ dacHandler()

+ +

◆ dacHandler()

- -

◆ enableAdcChannel()

+ +

◆ enableAdcChannel()

- -

◆ disableAdcChannel()

+ +

◆ disableAdcChannel()

- -

◆ disableDAC()

+ +

◆ disableDAC()

@@ -382,7 +388,7 @@

-

Disable the DAC

Parameters
+

Disable the DAC

Parameters
withinTaskOnly used for ESP32, set to true if calling from within a task itself, see included example
@@ -393,8 +399,8 @@

-

◆ adcInterrupts()

+ +

◆ adcInterrupts()

- -

◆ dacInterrupts()

+ +

◆ dacInterrupts()

@@ -443,8 +449,8 @@

-

◆ rampOut()

+ +

◆ rampOut()

@@ -458,7 +464,7 @@

-

Rampout and RampIn functions ramp the signal in/out to minimize 'pop' sound made when en/disabling the DAC

Parameters
+

Rampout and RampIn functions ramp the signal in/out to minimize 'pop' sound made when en/disabling the DAC

Parameters
sampleFor ESP32 only, provide the first or last sample to ramp the signal in/out
@@ -467,8 +473,8 @@

-

◆ rampIn()

+ +

◆ rampIn()

@@ -486,8 +492,8 @@

Member Data Documentation

- -

◆ dacBuffer

+ +

◆ dacBuffer

@@ -497,18 +503,18 @@

-

DAC data buffer for 8-bit samples

-

8-bit user samples are loaded directly into this buffer before calling feedDAC()
+

DAC data buffer for 8-bit samples

+

8-bit user samples are loaded directly into this buffer before calling feedDAC()

See also
dacBitsPerSample
Examples
AudioRadioRelay.ino, SdAudioAuto.ino, SdAudioBasic.ino, and SimpleSine.ino.
-

Definition at line 81 of file AutoAnalogAudio.h.

+

Definition at line 82 of file AutoAnalogAudio.h.

- -

◆ adcBuffer

+ +

◆ adcBuffer

@@ -518,18 +524,18 @@

-

ADC Data buffer for 8-bit samples

-

8-bit samples are read directly from this buffer after calling getADC()
+

ADC Data buffer for 8-bit samples

+

8-bit samples are read directly from this buffer after calling getADC()

See also
adcBitsPerSample
Examples
AudioRadioRelay.ino, and WirelessMicrophone.ino.
-

Definition at line 88 of file AutoAnalogAudio.h.

+

Definition at line 89 of file AutoAnalogAudio.h.

- -

◆ dacBuffer16

+ +

◆ dacBuffer16

@@ -539,18 +545,18 @@

-

DAC data buffer for 10 or 12-bit samples

-

10 or 12-bit user samples are loaded directly into this buffer before calling feedDAC()
+

DAC data buffer for 10 or 12-bit samples

+

10 or 12-bit user samples are loaded directly into this buffer before calling feedDAC()

See also
dacBitsPerSample
-
Examples
SdAudioAuto.ino, SimpleSine12Bit.ino, and WirelessSpeaker.ino.
+
Examples
NRF52_PDM_PWMTest.ino, SdAudioAuto.ino, SimpleSine12Bit.ino, and WirelessSpeaker.ino.
-

Definition at line 95 of file AutoAnalogAudio.h.

+

Definition at line 96 of file AutoAnalogAudio.h.

- -

◆ adcBuffer16

+ +

◆ adcBuffer16

@@ -560,18 +566,18 @@

-

ADC Data buffer for 10 or 12-bit samples

-

10 or 12-bit samples are read directly from this buffer after calling getADC()
+

ADC Data buffer for 10 or 12-bit samples

+

10 or 12-bit samples are read directly from this buffer after calling getADC()

See also
adcBitsPerSample
-
Examples
MultiChannelAdcStream.ino, and SimpleAdcStream.ino.
+
Examples
MultiChannelAdcStream.ino, NRF52_PDM_PWMTest.ino, and SimpleAdcStream.ino.
-

Definition at line 102 of file AutoAnalogAudio.h.

+

Definition at line 104 of file AutoAnalogAudio.h.

- -

◆ autoAdjust

+ +

◆ autoAdjust

- -

◆ adcBitsPerSample

+ +

◆ adcBitsPerSample

- -

◆ dacBitsPerSample

+ +

◆ dacBitsPerSample

- -

◆ dacTaskHandle

+ +

◆ dacTaskHandle

@@ -654,7 +660,7 @@

-

Definition at line 182 of file AutoAnalogAudio.h.

+

Definition at line 187 of file AutoAnalogAudio.h.

@@ -664,7 +670,7 @@

diff --git a/classes.html b/classes.html index 0138fc2..9ae2466 100644 --- a/classes.html +++ b/classes.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Class Index @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +

@@ -58,26 +58,32 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
Class Index
+
Class Index
diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dir_68267d1309a1af8e8297ef4c3efbcdba.html index 9f6602f..11ce43e 100644 --- a/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: src Directory Reference @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
src Directory Reference
+
src Directory Reference
- - +

+

Directories

directory  esp32
directory  esp32
 
- - +

+

Files

file  AutoAnalogAudio.h [code]
file  AutoAnalogAudio.h [code]
 
diff --git a/dir_d35e8d9c847c512a0480f8070ffef7ed.html b/dir_d35e8d9c847c512a0480f8070ffef7ed.html index b9c7656..11b22b7 100644 --- a/dir_d35e8d9c847c512a0480f8070ffef7ed.html +++ b/dir_d35e8d9c847c512a0480f8070ffef7ed.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: src/esp32 Directory Reference @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
esp32 Directory Reference
+
esp32 Directory Reference
- - +

+

Files

file  AutoAnalogAudio.cpp [code]
file  AutoAnalogAudio.cpp [code]
 
diff --git a/docd.png b/docd.png new file mode 100644 index 0000000..d7c94fd Binary files /dev/null and b/docd.png differ diff --git a/doxygen.css b/doxygen.css index ffbff02..89dee6c 100644 --- a/doxygen.css +++ b/doxygen.css @@ -1,29 +1,374 @@ -/* The standard CSS for doxygen 1.9.1 */ +/* The standard CSS for doxygen 1.9.5*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.png'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.png'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} -body, table, div, p, dl { - font: 400 14px/22px Roboto,sans-serif; +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 10px; + width: 10px; +} +::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-thumb-color); + border-radius: 8px; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); } -p.reference, p.definition { - font: 400 14px/22px Roboto,sans-serif; +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; } /* @group Heading Levels */ -h1.groupheader { - font-size: 150%; -} - .title { - font: 400 14px/28px Roboto,sans-serif; + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; font-size: 150%; font-weight: bold; margin: 10px 2px; } +h1.groupheader { + font-size: 150%; +} + h2.groupheader { - border-bottom: 1px solid #879ECB; - color: #354C7B; + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); font-size: 150%; font-weight: normal; margin-top: 1.75em; @@ -46,22 +391,13 @@ h1, h2, h3, h4, h5, h6 { } h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px cyan; + text-shadow: 0 0 15px var(--glow-color); } dt { font-weight: bold; } -ul.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; -} - p.startli, p.startdd { margin-top: 2px; } @@ -113,7 +449,6 @@ h3.version { } div.navtab { - border-right: 1px solid #A3B4D7; padding-right: 15px; text-align: right; line-height: 110%; @@ -127,16 +462,17 @@ td.navtab { padding-right: 6px; padding-left: 6px; } + td.navtabHL { - background-image: url('tab_a.png'); + background-image: var(--nav-gradient-active-image); background-repeat:repeat-x; padding-right: 6px; padding-left: 6px; } td.navtabHL a, td.navtabHL a:visited { - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); } a.navtab { @@ -148,7 +484,7 @@ div.qindex{ width: 100%; line-height: 140%; font-size: 130%; - color: #A0A0A0; + color: var(--index-separator-color); } dt.alphachar{ @@ -157,7 +493,7 @@ dt.alphachar{ } .alphachar a{ - color: black; + color: var(--index-header-color); } .alphachar a:hover, .alphachar a:visited{ @@ -176,8 +512,12 @@ dt.alphachar{ line-height: 1.15em; } +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + .classindex dl.odd { - background-color: #F8F9FC; + background-color: var(--index-odd-item-bg-color); } @media(min-width: 1120px) { @@ -196,23 +536,19 @@ dt.alphachar{ /* @group Link Styling */ a { - color: #3D578C; + color: var(--page-link-color); font-weight: normal; text-decoration: none; } .contents a:visited { - color: #4665A2; + color: var(--page-visited-link-color); } a:hover { text-decoration: underline; } -.contents a.qindexHL:visited { - color: #FFFFFF; -} - a.el { font-weight: bold; } @@ -221,12 +557,39 @@ a.elRef { } a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; + color: var(--code-link-color); } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; -} + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } /* @end */ @@ -235,7 +598,7 @@ dl.el { } ul { - overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ + overflow: visible; } #side-nav ul { @@ -254,27 +617,29 @@ ul { } pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); 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-family: var(--font-family-monospace); font-size: 105%; } div.fragment { - padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ - margin: 4px 8px 4px 2px; - background-color: #FBFCFD; - border: 1px solid #C4CFE5; + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); } div.line { - font-family: monospace, fixed; + font-family: var(--font-family-monospace); font-size: 13px; min-height: 13px; line-height: 1.0; @@ -306,24 +671,28 @@ div.line:after { } div.line.glow { - background-color: cyan; - box-shadow: 0 0 10px cyan; + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); } span.lineno { padding-right: 4px; + margin-right: 9px; text-align: right; - border-right: 2px solid #0F0; - background-color: #E8E8E8; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); white-space: pre; } -span.lineno a { - background-color: #D8D8D8; +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); } span.lineno a:hover { - background-color: #C8C8C8; + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); } .lineno { @@ -335,24 +704,6 @@ span.lineno a:hover { 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; @@ -374,8 +725,7 @@ div.groupText { } body { - background-color: white; - color: black; + color: var(--page-foreground-color); margin: 0; } @@ -385,29 +735,15 @@ div.contents { 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; +p.formulaDsp { + text-align: center; } -tr.memlist { - background-color: #EEF1F7; +img.dark-mode-visible { + display: none; } - -p.formulaDsp { - text-align: center; +img.light-mode-visible { + display: none; } img.formulaDsp { @@ -437,89 +773,70 @@ address.footer { img.footer { border: 0px; vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; } /* @group Code Colorization */ span.keyword { - color: #008000 + color: var(--code-keyword-color); } span.keywordtype { - color: #604020 + color: var(--code-type-keyword-color); } span.keywordflow { - color: #e08000 + color: var(--code-flow-keyword-color); } span.comment { - color: #800000 + color: var(--code-comment-color); } span.preprocessor { - color: #806020 + color: var(--code-preprocessor-color); } span.stringliteral { - color: #002080 + color: var(--code-string-literal-color); } span.charliteral { - color: #008080 + color: var(--code-char-literal-color); } span.vhdldigit { - color: #ff00ff + color: var(--code-vhdl-digit-color); } span.vhdlchar { - color: #000000 + color: var(--code-vhdl-char-color); } span.vhdlkeyword { - color: #700070 + color: var(--code-vhdl-keyword-color); } span.vhdllogic { - color: #ff0000 + color: var(--code-vhdl-logic-color); } blockquote { - background-color: #F7F8FB; - border-left: 2px solid #9CAFD4; + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); margin: 0 24px 0 4px; padding: 0 12px 0 16px; } -blockquote.DocNodeRTL { - border-left: 0; - border-right: 2px solid #9CAFD4; - margin: 0 4px 0 24px; - padding: 0 16px 0 12px; -} - /* @end */ -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - td.tiny { font-size: 75%; } @@ -527,18 +844,19 @@ td.tiny { .dirtab { padding: 4px; border-collapse: collapse; - border: 1px solid #A3B4D7; + border: 1px solid var(--table-cell-border-color); } th.dirtab { - background: #EBEFF6; + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); font-weight: bold; } hr { height: 0px; border: none; - border-top: 1px solid #4A6AAA; + border-top: 1px solid var(--separator-color); } hr.footer { @@ -566,14 +884,14 @@ table.memberdecls { } .memberdecls td.glow, .fieldtable tr.glow { - background-color: cyan; - box-shadow: 0 0 15px cyan; + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; + background-color: var(--memdecl-background-color); border: none; margin: 4px; padding: 1px 0 0 8px; @@ -581,11 +899,11 @@ table.memberdecls { .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; - color: #555; + color: var(--memdecl-foreground-color); } .memSeparator { - border-bottom: 1px solid #DEE4F0; + border-bottom: 1px solid var(--memdecl-separator-color); line-height: 1px; margin: 0px; padding: 0px; @@ -600,7 +918,7 @@ table.memberdecls { } .memTemplParams { - color: #4665A2; + color: var(--memdecl-template-color); white-space: nowrap; font-size: 80%; } @@ -613,15 +931,15 @@ table.memberdecls { .memtitle { padding: 8px; - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); border-top-right-radius: 4px; border-top-left-radius: 4px; margin-bottom: -1px; - background-image: url('nav_f.png'); + background-image: var(--memdef-title-gradient-image); background-repeat: repeat-x; - background-color: #E2E8F2; + background-color: var(--memdef-title-background-color); line-height: 1.25; font-weight: 300; float:left; @@ -636,20 +954,11 @@ table.memberdecls { .memtemplate { font-size: 80%; - color: #4665A2; + color: var(--memdef-template-color); 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%; } @@ -668,7 +977,7 @@ table.memberdecls { } .memitem.glow { - box-shadow: 0 0 15px cyan; + box-shadow: 0 0 15px var(--glow-color); } .memname { @@ -681,41 +990,32 @@ table.memberdecls { } .memproto, dl.reflist dt { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); padding: 6px 0px 6px 0px; - color: #253555; + color: var(--memdef-proto-text-color); font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-color: #DFE5F1; - /* opera specific markup */ + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); 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-family: var(--font-family-monospace); font-size: 65%; } .memdoc, dl.reflist dd { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); 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; + background-color: var(--memdef-doc-background-color); /* opera specific markup */ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; @@ -748,7 +1048,7 @@ dl.reflist dd { } .paramname { - color: #602020; + color: var(--memdef-param-name-color); white-space: nowrap; } .paramname em { @@ -761,20 +1061,20 @@ dl.reflist dd { .params, .retval, .exception, .tparams { margin-left: 0px; padding-left: 0px; -} +} .params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { font-weight: bold; vertical-align: top; } - + .params .paramtype, .tparams .paramtype { font-style: italic; vertical-align: top; -} - +} + .params .paramdir, .tparams .paramdir { - font-family: "courier new",courier,monospace; + font-family: var(--font-family-monospace); vertical-align: top; } @@ -798,13 +1098,13 @@ span.mlabels { } 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; + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); text-shadow: none; - color: white; + color: var(--label-foreground-color); margin-right: 4px; padding: 2px 3px; border-radius: 3px; @@ -821,8 +1121,8 @@ span.mlabel { div.directory { margin: 10px 0px; - border-top: 1px solid #9CAFD4; - border-bottom: 1px solid #9CAFD4; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); width: 100%; } @@ -858,9 +1158,14 @@ div.directory { border-left: 1px solid rgba(0,0,0,0.05); } +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + .directory tr.even { padding-left: 6px; - background-color: #F7F8FB; + background-color: var(--index-even-item-bg-color); } .directory img { @@ -878,11 +1183,11 @@ div.directory { cursor: pointer; padding-left: 2px; padding-right: 2px; - color: #3D578C; + color: var(--page-link-color); } .arrow { - color: #9CAFD4; + color: var(--nav-arrow-color); -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; @@ -896,14 +1201,15 @@ div.directory { } .icon { - font-family: Arial, Helvetica; + font-family: var(--font-family-icon); + line-height: normal; font-weight: bold; font-size: 12px; height: 14px; width: 16px; display: inline-block; - background-color: #728DC1; - color: white; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); text-align: center; border-radius: 4px; margin-left: 2px; @@ -942,17 +1248,13 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('doc.png'); + background-image:var(--icon-doc-image); 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 { @@ -967,7 +1269,7 @@ div.dynheader { address { font-style: normal; - color: #2A3D61; + color: var(--footer-foreground-color); } table.doxtable caption { @@ -981,28 +1283,23 @@ table.doxtable { } table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; + border: 1px solid var(--table-cell-border-color); padding: 3px 7px 2px; } table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); font-size: 110%; padding-bottom: 4px; padding-top: 5px; } table.fieldtable { - /*width: 100%;*/ margin-bottom: 10px; - border: 1px solid #A8B8D9; + border: 1px solid var(--memdef-border-color); 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); } @@ -1012,8 +1309,8 @@ table.fieldtable { .fieldtable td.fieldtype, .fieldtable td.fieldname { white-space: nowrap; - border-right: 1px solid #A8B8D9; - border-bottom: 1px solid #A8B8D9; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); vertical-align: top; } @@ -1022,14 +1319,13 @@ table.fieldtable { } .fieldtable td.fielddoc { - border-bottom: 1px solid #A8B8D9; - /*width: 100%;*/ + border-bottom: 1px solid var(--memdef-border-color); } .fieldtable td.fielddoc p:first-child { margin-top: 0px; -} - +} + .fieldtable td.fielddoc p:last-child { margin-bottom: 2px; } @@ -1039,22 +1335,18 @@ table.fieldtable { } .fieldtable th { - background-image:url('nav_f.png'); + background-image: var(--memdef-title-gradient-image); background-repeat:repeat-x; - background-color: #E2E8F2; + background-color: var(--memdef-title-background-color); font-size: 90%; - color: #253555; + color: var(--memdef-proto-text-color); 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; + border-bottom: 1px solid var(--memdef-border-color); } @@ -1062,7 +1354,7 @@ table.fieldtable { top: 0px; left: 10px; height: 36px; - background-image: url('tab_b.png'); + background-image: var(--nav-gradient-image); z-index: 101; overflow: hidden; font-size: 13px; @@ -1071,13 +1363,13 @@ table.fieldtable { .navpath ul { font-size: 11px; - background-image:url('tab_b.png'); + background-image: var(--nav-gradient-image); background-repeat:repeat-x; background-position: 0 -5px; height:30px; line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); overflow:hidden; margin:0px; padding:0px; @@ -1089,10 +1381,10 @@ table.fieldtable { float:left; padding-left:10px; padding-right:15px; - background-image:url('bc_s.png'); + background-image:var(--nav-breadcrumb-image); background-repeat:no-repeat; background-position:right; - color:#364D7C; + color: var(--nav-foreground-color); } .navpath li.navelem a @@ -1101,15 +1393,16 @@ table.fieldtable { 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; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; } .navpath li.navelem a:hover { - color:#6884BD; + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); } .navpath li.footer @@ -1121,7 +1414,7 @@ table.fieldtable { background-image:none; background-repeat:no-repeat; background-position:right; - color:#364D7C; + color: var(--footer-foreground-color); font-size: 8pt; } @@ -1133,7 +1426,7 @@ div.summary padding-right: 5px; width: 50%; text-align: right; -} +} div.summary a { @@ -1148,7 +1441,7 @@ table.classindex margin-right: 3%; width: 94%; border: 0; - border-spacing: 0; + border-spacing: 0; padding: 0; } @@ -1166,11 +1459,11 @@ div.ingroups a div.header { - background-image:url('nav_h.png'); + background-image: var(--header-gradient-image); background-repeat:repeat-x; - background-color: #F9FAFC; + background-color: var(--header-background-color); margin: 0px; - border-bottom: 1px solid #C4CFE5; + border-bottom: 1px solid var(--header-separator-color); } div.headertitle @@ -1193,11 +1486,6 @@ dl.section { padding-left: 0px; } -dl.section.DocNodeRTL { - margin-right: 0px; - padding-right: 0px; -} - dl.note { margin-left: -7px; padding-left: 3px; @@ -1205,16 +1493,6 @@ dl.note { border-color: #D0C000; } -dl.note.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #D0C000; -} - dl.warning, dl.attention { margin-left: -7px; padding-left: 3px; @@ -1222,16 +1500,6 @@ dl.warning, dl.attention { border-color: #FF0000; } -dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #FF0000; -} - dl.pre, dl.post, dl.invariant { margin-left: -7px; padding-left: 3px; @@ -1239,16 +1507,6 @@ dl.pre, dl.post, dl.invariant { border-color: #00D000; } -dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00D000; -} - dl.deprecated { margin-left: -7px; padding-left: 3px; @@ -1256,16 +1514,6 @@ dl.deprecated { border-color: #505050; } -dl.deprecated.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #505050; -} - dl.todo { margin-left: -7px; padding-left: 3px; @@ -1273,16 +1521,6 @@ dl.todo { border-color: #00C0E0; } -dl.todo.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00C0E0; -} - dl.test { margin-left: -7px; padding-left: 3px; @@ -1290,16 +1528,6 @@ dl.test { border-color: #3030E0; } -dl.test.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #3030E0; -} - dl.bug { margin-left: -7px; padding-left: 3px; @@ -1307,21 +1535,16 @@ dl.bug { border-color: #C08050; } -dl.bug.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #C08050; -} - dl.section dd { margin-bottom: 6px; } +#projectrow +{ + height: 56px; +} + #projectlogo { text-align: center; @@ -1337,25 +1560,29 @@ dl.section dd { #projectalign { vertical-align: middle; + padding-left: 0.5em; } #projectname { - font: 300% Tahoma, Arial,sans-serif; + font-size: 200%; + font-family: var(--font-family-title); margin: 0px; padding: 2px 0px; } - + #projectbrief { - font: 120% Tahoma, Arial,sans-serif; + font-size: 90%; + font-family: var(--font-family-title); margin: 0px; padding: 0px; } #projectnumber { - font: 50% Tahoma, Arial,sans-serif; + font-size: 50%; + font-family: 50% var(--font-family-title); margin: 0px; padding: 0px; } @@ -1365,7 +1592,8 @@ dl.section dd { padding: 0px; margin: 0px; width: 100%; - border-bottom: 1px solid #5373B4; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); } .image @@ -1398,17 +1626,12 @@ dl.section dd { font-weight: bold; } -div.zoom -{ - border: 1px solid #90A5CE; -} - dl.citelist { margin-bottom:50px; } dl.citelist dt { - color:#334975; + color:var(--citation-label-color); float:left; font-weight:bold; margin-right:10px; @@ -1424,8 +1647,8 @@ dl.citelist dd { div.toc { padding: 14px 25px; - background-color: #F4F6FA; - border: 1px solid #D8DFEE; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); border-radius: 7px 7px 7px 7px; float: right; height: auto; @@ -1433,28 +1656,17 @@ div.toc { width: 200px; } -.PageDocRTL-title div.toc { - float: left !important; - text-align: right; -} - div.toc li { background: url("bdwn.png") no-repeat scroll 0 5px transparent; - font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + font: 10px/1.2 var(--font-family-toc); margin-top: 5px; padding-left: 10px; padding-top: 2px; } -.PageDocRTL-title div.toc li { - background-position-x: right !important; - padding-left: 0 !important; - padding-right: 10px; -} - div.toc h3 { - font: bold 12px/1.2 Arial,FreeSans,sans-serif; - color: #4665A2; + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); border-bottom: 0 none; margin: 0; } @@ -1463,7 +1675,7 @@ div.toc ul { list-style: none outside none; border: medium none; padding: 0px; -} +} div.toc li.level1 { margin-left: 0px; @@ -1487,29 +1699,13 @@ span.emoji { */ } -.PageDocRTL-title div.toc li.level1 { - margin-left: 0 !important; - margin-right: 0; -} - -.PageDocRTL-title div.toc li.level2 { - margin-left: 0 !important; - margin-right: 15px; -} - -.PageDocRTL-title div.toc li.level3 { - margin-left: 0 !important; - margin-right: 30px; -} - -.PageDocRTL-title div.toc li.level4 { - margin-left: 0 !important; - margin-right: 45px; +span.obfuscator { + display: none; } .inherit_header { font-weight: bold; - color: gray; + color: var(--inherit-header-color); cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; @@ -1541,11 +1737,12 @@ tr.heading h2 { #powerTip { cursor: default; - white-space: nowrap; - background-color: white; - border: 1px solid gray; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); border-radius: 4px 4px 4px 4px; - box-shadow: 1px 1px 7px gray; + box-shadow: var(--tooltip-shadow); display: none; font-size: smaller; max-width: 80%; @@ -1556,7 +1753,7 @@ tr.heading h2 { } #powerTip div.ttdoc { - color: grey; + color: var(--tooltip-doc-color); font-style: italic; } @@ -1564,18 +1761,24 @@ tr.heading h2 { font-weight: bold; } +#powerTip a { + color: var(--tooltip-link-color); +} + #powerTip div.ttname { font-weight: bold; } #powerTip div.ttdeci { - color: #006318; + color: var(--tooltip-declaration-color); } #powerTip div { margin: 0px; padding: 0px; - font: 12px/16px Roboto,sans-serif; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; } #powerTip:before, #powerTip:after { @@ -1620,12 +1823,12 @@ tr.heading h2 { } #powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: #FFFFFF; + border-top-color: var(--tooltip-background-color); border-width: 10px; margin: 0px -10px; } -#powerTip.n:before { - border-top-color: #808080; +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); border-width: 11px; margin: 0px -11px; } @@ -1648,13 +1851,13 @@ tr.heading h2 { } #powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: #FFFFFF; + border-bottom-color: var(--tooltip-background-color); border-width: 10px; margin: 0px -10px; } #powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: #808080; + border-bottom-color: var(--tooltip-border-color); border-width: 11px; margin: 0px -11px; } @@ -1675,13 +1878,13 @@ tr.heading h2 { left: 100%; } #powerTip.e:after { - border-left-color: #FFFFFF; + border-left-color: var(--tooltip-border-color); border-width: 10px; top: 50%; margin-top: -10px; } #powerTip.e:before { - border-left-color: #808080; + border-left-color: var(--tooltip-border-color); border-width: 11px; top: 50%; margin-top: -11px; @@ -1691,13 +1894,13 @@ tr.heading h2 { right: 100%; } #powerTip.w:after { - border-right-color: #FFFFFF; + border-right-color: var(--tooltip-border-color); border-width: 10px; top: 50%; margin-top: -10px; } #powerTip.w:before { - border-right-color: #808080; + border-right-color: var(--tooltip-border-color); border-width: 11px; top: 50%; margin-top: -11px; @@ -1731,7 +1934,7 @@ table.markdownTable { } table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; + border: 1px solid var(--table-cell-border-color); padding: 3px 7px 2px; } @@ -1739,8 +1942,8 @@ table.markdownTable tr { } th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); font-size: 110%; padding-bottom: 4px; padding-top: 5px; @@ -1758,32 +1961,9 @@ th.markdownTableHeadCenter, td.markdownTableBodyCenter { text-align: center } -.DocNodeRTL { - text-align: right; - direction: rtl; -} - -.DocNodeLTR { - text-align: left; - direction: ltr; -} - -table.DocNodeRTL { - width: auto; - margin-right: 0; - margin-left: auto; -} - -table.DocNodeLTR { - width: auto; - margin-right: auto; - margin-left: 0; -} - tt, code, kbd, samp { display: inline-block; - direction:ltr; } /* @end */ diff --git a/dynsections.js b/dynsections.js index 88f2c27..1f4cd14 100644 --- a/dynsections.js +++ b/dynsections.js @@ -47,6 +47,8 @@ function updateStripes() { $('table.directory tr'). removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); } function toggleLevel(level) @@ -119,10 +121,10 @@ function toggleInherit(id) } } /* @license-end */ - $(document).ready(function() { $('.code,.codeRef').each(function() { $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); + $.fn.powerTip.smartPlacementLists.s = [ 's', 'n', 'ne', 'se' ]; $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true }); }); }); diff --git a/examples.html b/examples.html index e14e1ed..ef064e6 100644 --- a/examples.html +++ b/examples.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Examples @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,44 +58,40 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
Examples
+
Examples
diff --git a/files.html b/files.html index 71e7e38..8ef480e 100644 --- a/files.html +++ b/files.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: File List @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +

@@ -58,28 +58,34 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
File List
+
File List
Here is a list of all files with brief descriptions:
[detail level 123]
- + - +
  src
  esp32
  esp32
 AutoAnalogAudio.cpp
 AutoAnalogAudio.h
 AutoAnalogAudio.h
diff --git a/functions.html b/functions.html index 66a7071..0538eac 100644 --- a/functions.html +++ b/functions.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Class Members @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,84 +58,47 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
Here is a list of all class members with links to the classes they belong to:
diff --git a/functions_func.html b/functions_func.html index d686520..eb08854 100644 --- a/functions_func.html +++ b/functions_func.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Class Members - Functions @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +

@@ -58,60 +58,39 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
 
diff --git a/functions_vars.html b/functions_vars.html index 3118e2d..12cff93 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Class Members - Variables @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,42 +58,33 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
 
diff --git a/globals.html b/globals.html index baec904..4a7677e 100644 --- a/globals.html +++ b/globals.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: File Members @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,27 +58,28 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
Here is a list of all file members with links to the files they belong to:
diff --git a/globals_defs.html b/globals_defs.html index eafd35d..ebee337 100644 --- a/globals_defs.html +++ b/globals_defs.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: File Members @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +

@@ -58,27 +58,28 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
 
diff --git a/index.html b/index.html index f371aa1..9127756 100644 --- a/index.html +++ b/index.html @@ -1,9 +1,9 @@ - + - - + + Auto Analog Audio: Automatic Analog Audio Library for Arduino @@ -20,10 +20,9 @@
- - + @@ -32,21 +31,22 @@
-
Auto Analog Audio -  1.43 +
+
Auto Analog Audio v1.44
TMRh20 2020 - Automatic DAC, ADC & Timers on Arduino Due
- + +/* @license-end */ +
@@ -58,21 +58,27 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
-
Automatic Analog Audio Library for Arduino
+
+
Automatic Analog Audio Library for Arduino

Auto Analog Audio (Automatic DAC, ADC & Timer) library

-

Goals:

-

Extremely low-latency digital audio recording, playback, communication and relaying at high speeds

-

Features:

    +

    Goals:

    +

    Extremely low-latency digital audio recording, playback, communication and relaying at high speeds

    +

    Features:

    • Now supports AVR devices (Arduino Uno,Nano,Mega,etc)
    • Designed with low-latency radio/wireless communication in mind
    • Very simple user interface to Arduino DUE DAC and ADC
    • @@ -85,9 +91,9 @@
    • Single channel or stereo output
    • Multi-channel ADC sampling
    -

    The library internally configures timing based on user driven data requests or delivery, making data available or processing it at the appropriate speed without delays or while() loops.

    -

    The library can also be configured to operate at a set sample rate, with the getADC() and feedDAC() functions blocking until data is available or ready to be processed.

    -

    Library Source Code & Information:
    +

    The library internally configures timing based on user driven data requests or delivery, making data available or processing it at the appropriate speed without delays or while() loops.

    +

    The library can also be configured to operate at a set sample rate, with the getADC() and feedDAC() functions blocking until data is available or ready to be processed.

    +

    Library Source Code & Information:
    http://github.com/TMRh20
    http://tmrh20.blogspot.com

    @@ -95,7 +101,7 @@
diff --git a/jquery.js b/jquery.js index 103c32d..1dffb65 100644 --- a/jquery.js +++ b/jquery.js @@ -1,12 +1,11 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element -},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** +!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(y){"use strict";y.ui=y.ui||{};y.ui.version="1.13.2";var n,i=0,h=Array.prototype.hasOwnProperty,a=Array.prototype.slice;y.cleanData=(n=y.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=y._data(i,"events"))&&e.remove&&y(i).triggerHandler("remove");n(t)}),y.widget=function(t,i,e){var s,n,o,h={},a=t.split(".")[0],r=a+"-"+(t=t.split(".")[1]);return e||(e=i,i=y.Widget),Array.isArray(e)&&(e=y.extend.apply(null,[{}].concat(e))),y.expr.pseudos[r.toLowerCase()]=function(t){return!!y.data(t,r)},y[a]=y[a]||{},s=y[a][t],n=y[a][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},y.extend(n,s,{version:e.version,_proto:y.extend({},e),_childConstructors:[]}),(o=new i).options=y.widget.extend({},o.options),y.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}h[e]="function"==typeof s?function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:s}),n.prototype=y.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},h,{constructor:n,namespace:a,widgetName:t,widgetFullName:r}),s?(y.each(s._childConstructors,function(t,e){var i=e.prototype;y.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),y.widget.bridge(t,n),n},y.widget.extend=function(t){for(var e,i,s=a.call(arguments,1),n=0,o=s.length;n",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n
").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e
").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,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}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0'+ + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ data.children[i].text+''+ makeTree(data.children[i],relPath)+'
  • '; } @@ -36,15 +44,92 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { } return result; } - - $('#main-nav').append(makeTree(menudata,relPath)); - $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + var searchBoxHtml; if (searchEnabled) { if (serverSide) { - $('#main-menu').append('
  • '); + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; } else { - $('#main-menu').append('
  • '); + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); } $('#main-menu').smartmenus(); } diff --git a/nav_fd.png b/nav_fd.png new file mode 100644 index 0000000..032fbdd Binary files /dev/null and b/nav_fd.png differ diff --git a/nav_hd.png b/nav_hd.png new file mode 100644 index 0000000..de80f18 Binary files /dev/null and b/nav_hd.png differ diff --git a/search/all_0.html b/search/all_0.html deleted file mode 100644 index 1ec5b2d..0000000 --- a/search/all_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_1.html b/search/all_1.html deleted file mode 100644 index 9f80e90..0000000 --- a/search/all_1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_1.js b/search/all_1.js index 4b1c464..e330899 100644 --- a/search/all_1.js +++ b/search/all_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['begin_12',['begin',['../classAutoAnalog.html#af050f10f4589e38907f4776bb49b0e07',1,'AutoAnalog']]] + ['begin_0',['begin',['../classAutoAnalog.html#af050f10f4589e38907f4776bb49b0e07',1,'AutoAnalog']]] ]; diff --git a/search/all_2.html b/search/all_2.html deleted file mode 100644 index 02cfffc..0000000 --- a/search/all_2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_2.js b/search/all_2.js index 4edb528..382516e 100644 --- a/search/all_2.js +++ b/search/all_2.js @@ -1,11 +1,11 @@ var searchData= [ - ['dacbitspersample_13',['dacBitsPerSample',['../classAutoAnalog.html#a122737d7a251d9da00ecf02be72c2e18',1,'AutoAnalog']]], - ['dacbuffer_14',['dacBuffer',['../classAutoAnalog.html#a4b5f46afb8f50e9bc28431cd467ee8bf',1,'AutoAnalog']]], - ['dacbuffer16_15',['dacBuffer16',['../classAutoAnalog.html#a85377e5dc495fdbd129db30c6c88ca71',1,'AutoAnalog']]], - ['dachandler_16',['dacHandler',['../classAutoAnalog.html#a0bf0cb2ddbf79748887551f09a7932ec',1,'AutoAnalog']]], - ['dacinterrupts_17',['dacInterrupts',['../classAutoAnalog.html#aa689bffc34485c3fc6cddfdd01ca399b',1,'AutoAnalog']]], - ['dactaskhandle_18',['dacTaskHandle',['../classAutoAnalog.html#a58ffe6c35c52bf503720a89546ad6d61',1,'AutoAnalog']]], - ['disableadcchannel_19',['disableAdcChannel',['../classAutoAnalog.html#af23ab64cf3d4881f55ba1d5c0b1d607b',1,'AutoAnalog']]], - ['disabledac_20',['disableDAC',['../classAutoAnalog.html#a7936ca7efd99bb3a66ece6115893af94',1,'AutoAnalog']]] + ['dacbitspersample_0',['dacBitsPerSample',['../classAutoAnalog.html#a122737d7a251d9da00ecf02be72c2e18',1,'AutoAnalog']]], + ['dacbuffer_1',['dacBuffer',['../classAutoAnalog.html#a4b5f46afb8f50e9bc28431cd467ee8bf',1,'AutoAnalog']]], + ['dacbuffer16_2',['dacBuffer16',['../classAutoAnalog.html#a85377e5dc495fdbd129db30c6c88ca71',1,'AutoAnalog']]], + ['dachandler_3',['dacHandler',['../classAutoAnalog.html#a0bf0cb2ddbf79748887551f09a7932ec',1,'AutoAnalog']]], + ['dacinterrupts_4',['dacInterrupts',['../classAutoAnalog.html#aa689bffc34485c3fc6cddfdd01ca399b',1,'AutoAnalog']]], + ['dactaskhandle_5',['dacTaskHandle',['../classAutoAnalog.html#a58ffe6c35c52bf503720a89546ad6d61',1,'AutoAnalog']]], + ['disableadcchannel_6',['disableAdcChannel',['../classAutoAnalog.html#af23ab64cf3d4881f55ba1d5c0b1d607b',1,'AutoAnalog']]], + ['disabledac_7',['disableDAC',['../classAutoAnalog.html#a7936ca7efd99bb3a66ece6115893af94',1,'AutoAnalog']]] ]; diff --git a/search/all_3.html b/search/all_3.html deleted file mode 100644 index 39767b8..0000000 --- a/search/all_3.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_3.js b/search/all_3.js index c82711d..be77dca 100644 --- a/search/all_3.js +++ b/search/all_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['enableadcchannel_21',['enableAdcChannel',['../classAutoAnalog.html#ab0f3ceccd76b77c0a6e407ba92f42346',1,'AutoAnalog']]] + ['enableadcchannel_0',['enableAdcChannel',['../classAutoAnalog.html#ab0f3ceccd76b77c0a6e407ba92f42346',1,'AutoAnalog']]] ]; diff --git a/search/all_4.html b/search/all_4.html deleted file mode 100644 index fc40463..0000000 --- a/search/all_4.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_4.js b/search/all_4.js index b456b55..f1f2856 100644 --- a/search/all_4.js +++ b/search/all_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['feeddac_22',['feedDAC',['../classAutoAnalog.html#ad6728b5d90528b5817c1b8aa661de5e5',1,'AutoAnalog']]] + ['feeddac_0',['feedDAC',['../classAutoAnalog.html#ad6728b5d90528b5817c1b8aa661de5e5',1,'AutoAnalog']]] ]; diff --git a/search/all_5.html b/search/all_5.html deleted file mode 100644 index 9dd9344..0000000 --- a/search/all_5.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_5.js b/search/all_5.js index bf98917..cae27aa 100644 --- a/search/all_5.js +++ b/search/all_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['getadc_23',['getADC',['../classAutoAnalog.html#a61f2ceee4ff61ec9323a30a6c44ab504',1,'AutoAnalog']]] + ['getadc_0',['getADC',['../classAutoAnalog.html#a61f2ceee4ff61ec9323a30a6c44ab504',1,'AutoAnalog']]] ]; diff --git a/search/all_6.html b/search/all_6.html deleted file mode 100644 index f1e516d..0000000 --- a/search/all_6.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_6.js b/search/all_6.js index cf18d20..439e271 100644 --- a/search/all_6.js +++ b/search/all_6.js @@ -1,5 +1,5 @@ var searchData= [ - ['rampin_24',['rampIn',['../classAutoAnalog.html#a20472840f8cd85e9a41a5a968f522d23',1,'AutoAnalog']]], - ['rampout_25',['rampOut',['../classAutoAnalog.html#a6a49d5ac89bf8edbc8e91f9686099dbc',1,'AutoAnalog']]] + ['rampin_0',['rampIn',['../classAutoAnalog.html#a20472840f8cd85e9a41a5a968f522d23',1,'AutoAnalog']]], + ['rampout_1',['rampOut',['../classAutoAnalog.html#a6a49d5ac89bf8edbc8e91f9686099dbc',1,'AutoAnalog']]] ]; diff --git a/search/all_7.html b/search/all_7.html deleted file mode 100644 index 8ddbf6c..0000000 --- a/search/all_7.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_7.js b/search/all_7.js index bd11805..51755b1 100644 --- a/search/all_7.js +++ b/search/all_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['setsamplerate_26',['setSampleRate',['../classAutoAnalog.html#a99cfa2255a20289a00274d3ead8d1f6e',1,'AutoAnalog']]] + ['setsamplerate_0',['setSampleRate',['../classAutoAnalog.html#a99cfa2255a20289a00274d3ead8d1f6e',1,'AutoAnalog']]] ]; diff --git a/search/all_8.html b/search/all_8.html deleted file mode 100644 index 83c55ae..0000000 --- a/search/all_8.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/all_8.js b/search/all_8.js index e7887e4..c2f3418 100644 --- a/search/all_8.js +++ b/search/all_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['triggeradc_27',['triggerADC',['../classAutoAnalog.html#aedd70fc9f6f130c32ccb015b670f5318',1,'AutoAnalog']]] + ['triggeradc_0',['triggerADC',['../classAutoAnalog.html#aedd70fc9f6f130c32ccb015b670f5318',1,'AutoAnalog']]] ]; diff --git a/search/classes_0.html b/search/classes_0.html deleted file mode 100644 index af8159e..0000000 --- a/search/classes_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/classes_0.js b/search/classes_0.js index b161744..a2821f9 100644 --- a/search/classes_0.js +++ b/search/classes_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['autoanalog_28',['AutoAnalog',['../classAutoAnalog.html',1,'']]] + ['autoanalog_0',['AutoAnalog',['../classAutoAnalog.html',1,'']]] ]; diff --git a/search/defines_0.html b/search/defines_0.html deleted file mode 100644 index 15cc3de..0000000 --- a/search/defines_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/defines_0.js b/search/defines_0.js index 0c038de..b072392 100644 --- a/search/defines_0.js +++ b/search/defines_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['aaa_5fchannel0_53',['AAA_CHANNEL0',['../AutoAnalogAudio_8h.html#a97475d07967046efdeaea99d160d55cf',1,'AutoAnalogAudio.h']]], - ['aaa_5fchannel1_54',['AAA_CHANNEL1',['../AutoAnalogAudio_8h.html#a6bb2eff4f0118bacdf5103cf97fcc125',1,'AutoAnalogAudio.h']]], - ['aaa_5fmode_5fstereo_55',['AAA_MODE_STEREO',['../AutoAnalogAudio_8h.html#a96a94533ce3ba3de2eab562ba43883b3',1,'AutoAnalogAudio.h']]] + ['aaa_5fchannel0_0',['AAA_CHANNEL0',['../AutoAnalogAudio_8h.html#a97475d07967046efdeaea99d160d55cf',1,'AutoAnalogAudio.h']]], + ['aaa_5fchannel1_1',['AAA_CHANNEL1',['../AutoAnalogAudio_8h.html#a6bb2eff4f0118bacdf5103cf97fcc125',1,'AutoAnalogAudio.h']]], + ['aaa_5fmode_5fstereo_2',['AAA_MODE_STEREO',['../AutoAnalogAudio_8h.html#a96a94533ce3ba3de2eab562ba43883b3',1,'AutoAnalogAudio.h']]] ]; diff --git a/search/files_0.html b/search/files_0.html deleted file mode 100644 index 9498842..0000000 --- a/search/files_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/files_0.js b/search/files_0.js index aed8eb2..3ecdb14 100644 --- a/search/files_0.js +++ b/search/files_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['autoanalogaudio_2ecpp_29',['AutoAnalogAudio.cpp',['../AutoAnalogAudio_8cpp.html',1,'']]], - ['autoanalogaudio_2eh_30',['AutoAnalogAudio.h',['../AutoAnalogAudio_8h.html',1,'']]] + ['autoanalogaudio_2ecpp_0',['AutoAnalogAudio.cpp',['../AutoAnalogAudio_8cpp.html',1,'']]], + ['autoanalogaudio_2eh_1',['AutoAnalogAudio.h',['../AutoAnalogAudio_8h.html',1,'']]] ]; diff --git a/search/functions_0.html b/search/functions_0.html deleted file mode 100644 index eb4c501..0000000 --- a/search/functions_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_0.js b/search/functions_0.js index add9007..c591c7b 100644 --- a/search/functions_0.js +++ b/search/functions_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['adcinterrupts_31',['adcInterrupts',['../classAutoAnalog.html#a04a015a15f13e2fdac6cc193d2818259',1,'AutoAnalog']]], - ['autoanalog_32',['AutoAnalog',['../classAutoAnalog.html#a3667d5820bc647c87517c1eaea8ff722',1,'AutoAnalog']]] + ['adcinterrupts_0',['adcInterrupts',['../classAutoAnalog.html#a04a015a15f13e2fdac6cc193d2818259',1,'AutoAnalog']]], + ['autoanalog_1',['AutoAnalog',['../classAutoAnalog.html#a3667d5820bc647c87517c1eaea8ff722',1,'AutoAnalog']]] ]; diff --git a/search/functions_1.html b/search/functions_1.html deleted file mode 100644 index ef4088b..0000000 --- a/search/functions_1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_1.js b/search/functions_1.js index 5fb9c03..e330899 100644 --- a/search/functions_1.js +++ b/search/functions_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['begin_33',['begin',['../classAutoAnalog.html#af050f10f4589e38907f4776bb49b0e07',1,'AutoAnalog']]] + ['begin_0',['begin',['../classAutoAnalog.html#af050f10f4589e38907f4776bb49b0e07',1,'AutoAnalog']]] ]; diff --git a/search/functions_2.html b/search/functions_2.html deleted file mode 100644 index ca5aa10..0000000 --- a/search/functions_2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_2.js b/search/functions_2.js index cb4fdd2..417a939 100644 --- a/search/functions_2.js +++ b/search/functions_2.js @@ -1,7 +1,7 @@ var searchData= [ - ['dachandler_34',['dacHandler',['../classAutoAnalog.html#a0bf0cb2ddbf79748887551f09a7932ec',1,'AutoAnalog']]], - ['dacinterrupts_35',['dacInterrupts',['../classAutoAnalog.html#aa689bffc34485c3fc6cddfdd01ca399b',1,'AutoAnalog']]], - ['disableadcchannel_36',['disableAdcChannel',['../classAutoAnalog.html#af23ab64cf3d4881f55ba1d5c0b1d607b',1,'AutoAnalog']]], - ['disabledac_37',['disableDAC',['../classAutoAnalog.html#a7936ca7efd99bb3a66ece6115893af94',1,'AutoAnalog']]] + ['dachandler_0',['dacHandler',['../classAutoAnalog.html#a0bf0cb2ddbf79748887551f09a7932ec',1,'AutoAnalog']]], + ['dacinterrupts_1',['dacInterrupts',['../classAutoAnalog.html#aa689bffc34485c3fc6cddfdd01ca399b',1,'AutoAnalog']]], + ['disableadcchannel_2',['disableAdcChannel',['../classAutoAnalog.html#af23ab64cf3d4881f55ba1d5c0b1d607b',1,'AutoAnalog']]], + ['disabledac_3',['disableDAC',['../classAutoAnalog.html#a7936ca7efd99bb3a66ece6115893af94',1,'AutoAnalog']]] ]; diff --git a/search/functions_3.html b/search/functions_3.html deleted file mode 100644 index d79f55b..0000000 --- a/search/functions_3.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_3.js b/search/functions_3.js index 0181805..be77dca 100644 --- a/search/functions_3.js +++ b/search/functions_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['enableadcchannel_38',['enableAdcChannel',['../classAutoAnalog.html#ab0f3ceccd76b77c0a6e407ba92f42346',1,'AutoAnalog']]] + ['enableadcchannel_0',['enableAdcChannel',['../classAutoAnalog.html#ab0f3ceccd76b77c0a6e407ba92f42346',1,'AutoAnalog']]] ]; diff --git a/search/functions_4.html b/search/functions_4.html deleted file mode 100644 index 1657cad..0000000 --- a/search/functions_4.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_4.js b/search/functions_4.js index 618937b..f1f2856 100644 --- a/search/functions_4.js +++ b/search/functions_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['feeddac_39',['feedDAC',['../classAutoAnalog.html#ad6728b5d90528b5817c1b8aa661de5e5',1,'AutoAnalog']]] + ['feeddac_0',['feedDAC',['../classAutoAnalog.html#ad6728b5d90528b5817c1b8aa661de5e5',1,'AutoAnalog']]] ]; diff --git a/search/functions_5.html b/search/functions_5.html deleted file mode 100644 index 9301d6b..0000000 --- a/search/functions_5.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_5.js b/search/functions_5.js index dd9403d..cae27aa 100644 --- a/search/functions_5.js +++ b/search/functions_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['getadc_40',['getADC',['../classAutoAnalog.html#a61f2ceee4ff61ec9323a30a6c44ab504',1,'AutoAnalog']]] + ['getadc_0',['getADC',['../classAutoAnalog.html#a61f2ceee4ff61ec9323a30a6c44ab504',1,'AutoAnalog']]] ]; diff --git a/search/functions_6.html b/search/functions_6.html deleted file mode 100644 index 9c4f5fc..0000000 --- a/search/functions_6.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_6.js b/search/functions_6.js index 7ea8b01..439e271 100644 --- a/search/functions_6.js +++ b/search/functions_6.js @@ -1,5 +1,5 @@ var searchData= [ - ['rampin_41',['rampIn',['../classAutoAnalog.html#a20472840f8cd85e9a41a5a968f522d23',1,'AutoAnalog']]], - ['rampout_42',['rampOut',['../classAutoAnalog.html#a6a49d5ac89bf8edbc8e91f9686099dbc',1,'AutoAnalog']]] + ['rampin_0',['rampIn',['../classAutoAnalog.html#a20472840f8cd85e9a41a5a968f522d23',1,'AutoAnalog']]], + ['rampout_1',['rampOut',['../classAutoAnalog.html#a6a49d5ac89bf8edbc8e91f9686099dbc',1,'AutoAnalog']]] ]; diff --git a/search/functions_7.html b/search/functions_7.html deleted file mode 100644 index 46b5c0f..0000000 --- a/search/functions_7.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_7.js b/search/functions_7.js index 0ca7da7..51755b1 100644 --- a/search/functions_7.js +++ b/search/functions_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['setsamplerate_43',['setSampleRate',['../classAutoAnalog.html#a99cfa2255a20289a00274d3ead8d1f6e',1,'AutoAnalog']]] + ['setsamplerate_0',['setSampleRate',['../classAutoAnalog.html#a99cfa2255a20289a00274d3ead8d1f6e',1,'AutoAnalog']]] ]; diff --git a/search/functions_8.html b/search/functions_8.html deleted file mode 100644 index 31a1d95..0000000 --- a/search/functions_8.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/functions_8.js b/search/functions_8.js index 0609b9a..c2f3418 100644 --- a/search/functions_8.js +++ b/search/functions_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['triggeradc_44',['triggerADC',['../classAutoAnalog.html#aedd70fc9f6f130c32ccb015b670f5318',1,'AutoAnalog']]] + ['triggeradc_0',['triggerADC',['../classAutoAnalog.html#aedd70fc9f6f130c32ccb015b670f5318',1,'AutoAnalog']]] ]; diff --git a/search/mag.svg b/search/mag.svg new file mode 100644 index 0000000..9f46b30 --- /dev/null +++ b/search/mag.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/search/mag_d.svg b/search/mag_d.svg new file mode 100644 index 0000000..b9a814c --- /dev/null +++ b/search/mag_d.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/search/mag_seld.svg b/search/mag_seld.svg new file mode 100644 index 0000000..6e720dc --- /dev/null +++ b/search/mag_seld.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/search/nomatches.html b/search/nomatches.html deleted file mode 100644 index 2b9360b..0000000 --- a/search/nomatches.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - -
    -
    No Matches
    -
    - - diff --git a/search/pages_0.html b/search/pages_0.html deleted file mode 100644 index 8517b48..0000000 --- a/search/pages_0.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/pages_0.js b/search/pages_0.js index ca5582a..b427326 100644 --- a/search/pages_0.js +++ b/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['automatic_20analog_20audio_20library_20for_20arduino_56',['Automatic Analog Audio Library for Arduino',['../index.html',1,'']]] + ['automatic_20analog_20audio_20library_20for_20arduino_0',['Automatic Analog Audio Library for Arduino',['../index.html',1,'']]] ]; diff --git a/search/search.css b/search/search.css index 9074198..19f76f9 100644 --- a/search/search.css +++ b/search/search.css @@ -1,10 +1,33 @@ -/*---------------- Search Box */ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} #MSearchBox { + display: inline-block; white-space : nowrap; - background: white; + background: var(--search-background-color); border-radius: 0.65em; - box-shadow: inset 0.5px 0.5px 3px 0px #555; + box-shadow: var(--search-box-shadow); z-index: 102; } @@ -17,28 +40,47 @@ #MSearchSelect { display: inline-block; vertical-align: middle; - height: 1.4em; - padding: 0 0 0 0.3em; - margin: 0; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; } + #MSearchField { display: inline-block; vertical-align: middle; width: 7.5em; - height: 1.1em; + height: 19px; margin: 0 0.15em; padding: 0; line-height: 1em; border:none; - color: #909090; + color: var(--search-foreground-color); outline: none; - font-family: Arial, Verdana, sans-serif; + font-family: var(--font-family-search); -webkit-border-radius: 0px; border-radius: 0px; background: none; } +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} #MSearchBox .right { display: inline-block; @@ -59,23 +101,15 @@ } #MSearchCloseImg { - height: 1.4em; padding: 0.3em; margin: 0; } .MSearchBoxActive #MSearchField { - color: #000000; + color: var(--search-active-color); } -#main-menu > li:last-child { - /* This
  • object is the parent of the search bar */ - display: flex; - justify-content: center; - align-items: center; - height: 36px; - margin-right: 1em; -} + /*---------------- Search filter selection */ @@ -83,8 +117,8 @@ display: none; position: absolute; left: 0; top: 0; - border: 1px solid #90A5CE; - background-color: #F9FAFC; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); z-index: 10001; padding-top: 4px; padding-bottom: 4px; @@ -97,7 +131,7 @@ } .SelectItem { - font: 8pt Arial, Verdana, sans-serif; + font: 8pt var(--font-family-search); padding-left: 2px; padding-right: 12px; border: 0px; @@ -105,7 +139,7 @@ span.SelectionMark { margin-right: 4px; - font-family: monospace; + font-family: var(--font-family-monospace); outline-style: none; text-decoration: none; } @@ -113,7 +147,7 @@ span.SelectionMark { a.SelectItem { display: block; outline-style: none; - color: #000000; + color: var(--search-filter-foreground-color); text-decoration: none; padding-left: 6px; padding-right: 12px; @@ -121,14 +155,14 @@ a.SelectItem { a.SelectItem:focus, a.SelectItem:active { - color: #000000; + color: var(--search-filter-foreground-color); outline-style: none; text-decoration: none; } a.SelectItem:hover { - color: #FFFFFF; - background-color: #3D578C; + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); outline-style: none; text-decoration: none; cursor: pointer; @@ -138,7 +172,7 @@ a.SelectItem:hover { /*---------------- Search results window */ iframe#MSearchResults { - width: 60ex; + /*width: 60ex;*/ height: 15em; } @@ -146,9 +180,12 @@ iframe#MSearchResults { display: none; position: absolute; left: 0; top: 0; - border: 1px solid #000; - background-color: #EEF1F7; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); z-index:10000; + width: 300px; + height: 400px; + overflow: auto; } /* ----------------------------------- */ @@ -156,7 +193,6 @@ iframe#MSearchResults { #SRIndex { clear:both; - padding-bottom: 15px; } .SREntry { @@ -169,8 +205,9 @@ iframe#MSearchResults { padding: 1px 5px; } -body.SRPage { +div.SRPage { margin: 5px 2px; + background-color: var(--search-results-background-color); } .SRChildren { @@ -182,17 +219,18 @@ body.SRPage { } .SRSymbol { - font-weight: bold; - color: #425E97; - font-family: Arial, Verdana, sans-serif; + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); text-decoration: none; outline: none; } a.SRScope { display: block; - color: #425E97; - font-family: Arial, Verdana, sans-serif; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; text-decoration: none; outline: none; } @@ -204,14 +242,14 @@ a.SRScope:focus, a.SRScope:active { span.SRScope { padding-left: 4px; - font-family: Arial, Verdana, sans-serif; + font-family: var(--font-family-search); } .SRPage .SRStatus { padding: 2px 5px; font-size: 8pt; font-style: italic; - font-family: Arial, Verdana, sans-serif; + font-family: var(--font-family-search); } .SRResult { @@ -225,14 +263,10 @@ div.searchresults { /*---------------- External search page results */ -.searchresult { - background-color: #F0F3F8; -} - .pages b { color: white; padding: 5px 5px 3px 5px; - background-image: url("../tab_a.png"); + background-image: var(--nav-gradient-active-image-parent); background-repeat: repeat-x; text-shadow: 0 1px 1px #000000; } diff --git a/search/search.js b/search/search.js index fb226f7..e103a26 100644 --- a/search/search.js +++ b/search/search.js @@ -73,6 +73,8 @@ function getYPos(item) return y; } +var searchResults = new SearchResults("searchResults"); + /* A class handling everything associated with the search panel. Parameters: @@ -80,7 +82,7 @@ function getYPos(item) storing this instance. Is needed to be able to set timeouts. resultPath - path to use for external files */ -function SearchBox(name, resultsPath, inFrame, label, extension) +function SearchBox(name, resultsPath, extension) { if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } if (!extension || extension == "") { extension = ".html"; } @@ -96,8 +98,6 @@ function SearchBox(name, resultsPath, inFrame, label, extension) this.hideTimeout = 0; this.searchIndex = 0; this.searchActive = false; - this.insideFrame = inFrame; - this.searchLabel = label; this.extension = extension; // ----------- DOM Elements @@ -136,30 +136,14 @@ function SearchBox(name, resultsPath, inFrame, label, extension) var searchSelectWindow = this.DOMSearchSelectWindow(); var searchField = this.DOMSearchSelect(); - if (this.insideFrame) - { - var left = getXPos(searchField); - var top = getYPos(searchField); - left += searchField.offsetWidth + 6; - top += searchField.offsetHeight; + var left = getXPos(searchField); + var top = getYPos(searchField); + top += searchField.offsetHeight; - // show search selection popup - searchSelectWindow.style.display='block'; - left -= searchSelectWindow.offsetWidth; - searchSelectWindow.style.left = left + 'px'; - searchSelectWindow.style.top = top + 'px'; - } - else - { - var left = getXPos(searchField); - var top = getYPos(searchField); - top += searchField.offsetHeight; - - // show search selection popup - searchSelectWindow.style.display='block'; - searchSelectWindow.style.left = left + 'px'; - searchSelectWindow.style.top = top + 'px'; - } + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; // stop selection hide timer if (this.hideTimeout) @@ -205,7 +189,8 @@ function SearchBox(name, resultsPath, inFrame, label, extension) } else { - window.frames.MSearchResults.postMessage("take_focus", "*"); + var elem = searchResults.NavNext(0); + if (elem) elem.focus(); } } else if (e.keyCode==27) // Escape out of the search field @@ -341,55 +326,66 @@ function SearchBox(name, resultsPath, inFrame, label, extension) idxChar = searchValue.substr(0, 2); } - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; + var jsFile; var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); if (idx!=-1) { var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; } - else // nothing available for this search term - { - resultsPage = this.resultsPath + '/nomatches' + this.extension; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); } - window.frames.MSearchResults.location = resultsPageWithSearch; var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + searchResults.Search(searchValue); - if (domPopupSearchResultsWindow.style.display!='block') - { - var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline-block'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); } this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; } // -------- Activation Functions @@ -403,22 +399,15 @@ function SearchBox(name, resultsPath, inFrame, label, extension) ) { this.DOMSearchBox().className = 'MSearchBoxActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == this.searchLabel) // clear "Search" term upon entry - { - searchField.value = ''; - this.searchActive = true; - } + this.searchActive = true; } else if (!isActive) // directly remove the panel { this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.DOMSearchField().value = this.searchLabel; this.searchActive = false; this.lastSearchValue = '' this.lastResultsPage = ''; + this.DOMSearchField().value = ''; } } } @@ -647,7 +636,7 @@ function SearchResults(name) } else // return focus to search field { - parent.document.getElementById("MSearchField").focus(); + document.getElementById("MSearchField").focus(); } } else if (this.lastKey==40) // Down @@ -677,8 +666,8 @@ function SearchResults(name) } else if (this.lastKey==27) // Escape { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); } else if (this.lastKey==13) // Enter { @@ -720,8 +709,8 @@ function SearchResults(name) } else if (this.lastKey==27) // Escape { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); } else if (this.lastKey==13) // Enter { @@ -744,9 +733,10 @@ function setClassAttr(elem,attr) elem.setAttribute('className',attr); } -function createResults() +function createResults(resultsPath) { var results = document.getElementById("SRResults"); + results.innerHTML = ''; for (var e=0; e - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/variables_0.js b/search/variables_0.js index bdb807c..530e208 100644 --- a/search/variables_0.js +++ b/search/variables_0.js @@ -1,7 +1,7 @@ var searchData= [ - ['adcbitspersample_45',['adcBitsPerSample',['../classAutoAnalog.html#adf54b09207afbc94726a48642e3b611a',1,'AutoAnalog']]], - ['adcbuffer_46',['adcBuffer',['../classAutoAnalog.html#a257d95cf5a0b43deaef32b761fc25792',1,'AutoAnalog']]], - ['adcbuffer16_47',['adcBuffer16',['../classAutoAnalog.html#a64b99ccc41ac44398397f12c89d292f3',1,'AutoAnalog']]], - ['autoadjust_48',['autoAdjust',['../classAutoAnalog.html#a34814ebff21d9b602f1f33503c070a54',1,'AutoAnalog']]] + ['adcbitspersample_0',['adcBitsPerSample',['../classAutoAnalog.html#adf54b09207afbc94726a48642e3b611a',1,'AutoAnalog']]], + ['adcbuffer_1',['adcBuffer',['../classAutoAnalog.html#a257d95cf5a0b43deaef32b761fc25792',1,'AutoAnalog']]], + ['adcbuffer16_2',['adcBuffer16',['../classAutoAnalog.html#a64b99ccc41ac44398397f12c89d292f3',1,'AutoAnalog']]], + ['autoadjust_3',['autoAdjust',['../classAutoAnalog.html#a34814ebff21d9b602f1f33503c070a54',1,'AutoAnalog']]] ]; diff --git a/search/variables_1.html b/search/variables_1.html deleted file mode 100644 index ea73d9a..0000000 --- a/search/variables_1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/search/variables_1.js b/search/variables_1.js index cc2efca..1d5f052 100644 --- a/search/variables_1.js +++ b/search/variables_1.js @@ -1,7 +1,7 @@ var searchData= [ - ['dacbitspersample_49',['dacBitsPerSample',['../classAutoAnalog.html#a122737d7a251d9da00ecf02be72c2e18',1,'AutoAnalog']]], - ['dacbuffer_50',['dacBuffer',['../classAutoAnalog.html#a4b5f46afb8f50e9bc28431cd467ee8bf',1,'AutoAnalog']]], - ['dacbuffer16_51',['dacBuffer16',['../classAutoAnalog.html#a85377e5dc495fdbd129db30c6c88ca71',1,'AutoAnalog']]], - ['dactaskhandle_52',['dacTaskHandle',['../classAutoAnalog.html#a58ffe6c35c52bf503720a89546ad6d61',1,'AutoAnalog']]] + ['dacbitspersample_0',['dacBitsPerSample',['../classAutoAnalog.html#a122737d7a251d9da00ecf02be72c2e18',1,'AutoAnalog']]], + ['dacbuffer_1',['dacBuffer',['../classAutoAnalog.html#a4b5f46afb8f50e9bc28431cd467ee8bf',1,'AutoAnalog']]], + ['dacbuffer16_2',['dacBuffer16',['../classAutoAnalog.html#a85377e5dc495fdbd129db30c6c88ca71',1,'AutoAnalog']]], + ['dactaskhandle_3',['dacTaskHandle',['../classAutoAnalog.html#a58ffe6c35c52bf503720a89546ad6d61',1,'AutoAnalog']]] ]; diff --git a/splitbard.png b/splitbard.png new file mode 100644 index 0000000..8367416 Binary files /dev/null and b/splitbard.png differ diff --git a/tab_ad.png b/tab_ad.png new file mode 100644 index 0000000..e34850a Binary files /dev/null and b/tab_ad.png differ diff --git a/tab_bd.png b/tab_bd.png new file mode 100644 index 0000000..91c2524 Binary files /dev/null and b/tab_bd.png differ diff --git a/tab_hd.png b/tab_hd.png new file mode 100644 index 0000000..2489273 Binary files /dev/null and b/tab_hd.png differ diff --git a/tab_sd.png b/tab_sd.png new file mode 100644 index 0000000..757a565 Binary files /dev/null and b/tab_sd.png differ diff --git a/tabs.css b/tabs.css index 85a0cd5..71c8a47 100644 --- a/tabs.css +++ b/tabs.css @@ -1 +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}.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 +.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}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.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:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.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:var(--nav-menu-background-color)}.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:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);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:var(--nav-gradient-image);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:var(--nav-text-normal-color) 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:var(--nav-separator-image);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:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) 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 var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-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 var(--nav-menu-foreground-color);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:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);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 var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) 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:var(--nav-gradient-image)}.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:var(--nav-menu-background-color)}} \ No newline at end of file