aboutsummaryrefslogtreecommitdiffstats
path: root/demos
diff options
context:
space:
mode:
Diffstat (limited to 'demos')
-rw-r--r--demos/modules/gadc/gfxconf.h1
-rw-r--r--demos/modules/gadc/gwinosc.c34
-rw-r--r--demos/modules/gadc/gwinosc.h5
-rw-r--r--demos/modules/gadc/main.c14
-rw-r--r--demos/modules/gaudio/oscilloscope/gfxconf.h1
-rw-r--r--demos/modules/gaudio/oscilloscope/gwinosc.c8
-rw-r--r--demos/modules/gaudio/oscilloscope/main.c13
-rw-r--r--demos/modules/gaudio/play-wave/main.c20
8 files changed, 53 insertions, 43 deletions
diff --git a/demos/modules/gadc/gfxconf.h b/demos/modules/gadc/gfxconf.h
index 297265b5..d0da3943 100644
--- a/demos/modules/gadc/gfxconf.h
+++ b/demos/modules/gadc/gfxconf.h
@@ -51,7 +51,6 @@
#define GDISP_NEED_VALIDATION TRUE
#define GDISP_NEED_CLIP TRUE
#define GDISP_NEED_TEXT TRUE
-#define GDISP_NEED_CONTROL TRUE
#define GDISP_NEED_MULTITHREAD TRUE
/* GDISP - builtin fonts */
diff --git a/demos/modules/gadc/gwinosc.c b/demos/modules/gadc/gwinosc.c
index afa12bfc..84e7d645 100644
--- a/demos/modules/gadc/gwinosc.c
+++ b/demos/modules/gadc/gwinosc.c
@@ -38,9 +38,6 @@
/* Include internal GWIN routines so we can build our own superset class */
#include "src/gwin/class_gwin.h"
-/* The size of our dynamically allocated audio buffer */
-#define AUDIOBUFSZ 64*2
-
/* How many flat-line sample before we trigger */
#define FLATLINE_SAMPLES 8
@@ -50,10 +47,6 @@ static void _destroy(GHandle gh) {
gfxFree(((GScopeObject *)gh)->lastscopetrace);
((GScopeObject *)gh)->lastscopetrace = 0;
}
- if (((GScopeObject *)gh)->audiobuf) {
- gfxFree(((GScopeObject *)gh)->audiobuf);
- ((GScopeObject *)gh)->audiobuf = 0;
- }
}
static const gwinVMT scopeVMT = {
@@ -68,12 +61,9 @@ GHandle gwinGScopeCreate(GDisplay *g, GScopeObject *gs, GWindowInit *pInit, uint
/* Initialise the base class GWIN */
if (!(gs = (GScopeObject *)_gwindowCreate(g, &gs->g, pInit, &scopeVMT, 0)))
return 0;
- gfxSemInit(&gs->bsem, 0, 1);
gs->nextx = 0;
if (!(gs->lastscopetrace = gfxAlloc(gs->g.width * sizeof(coord_t))))
return 0;
- if (!(gs->audiobuf = gfxAlloc(AUDIOBUFSZ * sizeof(adcsample_t))))
- return 0;
#if TRIGGER_METHOD == TRIGGER_POSITIVERAMP
gs->lasty = gs->g.height/2;
#elif TRIGGER_METHOD == TRIGGER_MINVALUE
@@ -82,8 +72,7 @@ GHandle gwinGScopeCreate(GDisplay *g, GScopeObject *gs, GWindowInit *pInit, uint
#endif
/* Start the GADC high speed converter */
- gadcHighSpeedInit(physdev, frequency, gs->audiobuf, AUDIOBUFSZ, AUDIOBUFSZ/2);
- gadcHighSpeedSetBSem(&gs->bsem, &gs->myEvent);
+ gadcHighSpeedInit(physdev, frequency);
gadcHighSpeedStart();
gwinSetVisible((GHandle)gs, pInit->show);
@@ -97,6 +86,8 @@ void gwinScopeWaitForTrace(GHandle gh) {
coord_t yoffset;
adcsample_t *pa;
coord_t *pc;
+ GDataBuffer *pd;
+ uint8_t shr;
#if TRIGGER_METHOD == TRIGGER_POSITIVERAMP
bool_t rdytrigger;
int flsamples;
@@ -109,20 +100,21 @@ void gwinScopeWaitForTrace(GHandle gh) {
if (gh->vmt != &scopeVMT)
return;
- /* Wait for a set of audio conversions */
- gfxSemWait(&gs->bsem, TIME_INFINITE);
+ /* Wait for a set of conversions */
+ pd = gadcHighSpeedGetData(TIME_INFINITE);
/* Ensure we are drawing in the right area */
#if GDISP_NEED_CLIP
gdispGSetClip(gh->display, gh->x, gh->y, gh->width, gh->height);
#endif
+ shr = 16 - gfxSampleFormatBits(GADC_SAMPLE_FORMAT);
yoffset = gh->height/2;
- if (!(GADC_SAMPLE_FORMAT & 1))
+ if (!gfxSampleFormatIsSigned(GADC_SAMPLE_FORMAT))
yoffset += (1<<SCOPE_Y_BITS)/2;
x = gs->nextx;
pc = gs->lastscopetrace+x;
- pa = gs->myEvent.buffer;
+ pa = (adcsample_t *)(pd+1);
#if TRIGGER_METHOD == TRIGGER_POSITIVERAMP
rdytrigger = FALSE;
flsamples = 0;
@@ -132,14 +124,10 @@ void gwinScopeWaitForTrace(GHandle gh) {
scopemin = 0;
#endif
- for(i = gs->myEvent.count; i; i--) {
+ for(i = pd->len/sizeof(adcsample_t); i; i--) {
/* Calculate the new scope value - re-scale using simple shifts for efficiency, re-center and y-invert */
- #if GADC_BITS_PER_SAMPLE > SCOPE_Y_BITS
- y = yoffset - (*pa++ >> (GADC_BITS_PER_SAMPLE - SCOPE_Y_BITS));
- #else
- y = yoffset - (*pa++ << (SCOPE_Y_BITS - GADC_BITS_PER_SAMPLE));
- #endif
+ y = yoffset - (((coord_t)(*pa++) << shr) >> (16-SCOPE_Y_BITS));
#if TRIGGER_METHOD == TRIGGER_MINVALUE
/* Calculate the scopemin ready for the next trace */
@@ -205,5 +193,7 @@ void gwinScopeWaitForTrace(GHandle gh) {
gs->scopemin = scopemin;
#endif
+ gfxBufferRelease(pd);
+
#undef gs
}
diff --git a/demos/modules/gadc/gwinosc.h b/demos/modules/gadc/gwinosc.h
index 56de0f11..0c687a4f 100644
--- a/demos/modules/gadc/gwinosc.h
+++ b/demos/modules/gadc/gwinosc.h
@@ -43,7 +43,7 @@
/* The extent of scaling for our audio data - fixed scale at the moment */
#ifndef SCOPE_Y_BITS
- #define SCOPE_Y_BITS 7 // 7 bits = 0..128
+ #define SCOPE_Y_BITS 7 // 7 bits = 0..128
#endif
/* Trigger methods */
@@ -64,9 +64,6 @@ typedef struct GScopeObject_t {
GWindowObject g; // Base Class
coord_t *lastscopetrace; // To store last scope trace
- gfxSem bsem; // We get signalled on this
- adcsample_t *audiobuf; // To store audio samples
- GEventADC myEvent; // Information on received samples
coord_t nextx; // Where we are up to
#if TRIGGER_METHOD == TRIGGER_POSITIVERAMP
coord_t lasty; // The last y value - used for trigger slope detection
diff --git a/demos/modules/gadc/main.c b/demos/modules/gadc/main.c
index 928635fa..7db14c82 100644
--- a/demos/modules/gadc/main.c
+++ b/demos/modules/gadc/main.c
@@ -167,6 +167,20 @@ int main(void) {
gtimerStart(&lsTimer, LowSpeedTimer, ghText, TRUE, MY_LS_DELAY);
#endif
+ /**
+ * Allocate buffers for the high speed GADC device - eg. 4 x 128 byte buffers.
+ * You may need to increase this for slower cpu's.
+ * You may be able to decrease this for low latency operating systems.
+ * 4 x 128 seems to work on the really slow Olimex SAM7EX256 board (display speed limitation)
+ * If your oscilloscope display stops but the low speed reading keep going then it is likely that
+ * your high speed timer has stalled due to running out of free buffers. Increase the number
+ * of buffers..
+ * If you make the buffers too large with a slow sample rate you may not allow enough time for all
+ * the low speed items to occur in which case your memory will fill up with low speed requests until
+ * you run out of memory.
+ */
+ gfxBufferAlloc(4, 128);
+
/* Set up the scope window in the top right on the screen */
{
GWindowInit wi;
diff --git a/demos/modules/gaudio/oscilloscope/gfxconf.h b/demos/modules/gaudio/oscilloscope/gfxconf.h
index 2caa1da9..8e20ce0b 100644
--- a/demos/modules/gaudio/oscilloscope/gfxconf.h
+++ b/demos/modules/gaudio/oscilloscope/gfxconf.h
@@ -45,7 +45,6 @@
#define GFX_USE_GDISP TRUE
#define GFX_USE_GWIN TRUE
#define GFX_USE_GTIMER TRUE
-//#define GFX_USE_GADC TRUE
#define GFX_USE_GAUDIO TRUE
/* Features for the GDISP sub-system. */
diff --git a/demos/modules/gaudio/oscilloscope/gwinosc.c b/demos/modules/gaudio/oscilloscope/gwinosc.c
index 21a83760..6b51232b 100644
--- a/demos/modules/gaudio/oscilloscope/gwinosc.c
+++ b/demos/modules/gaudio/oscilloscope/gwinosc.c
@@ -96,7 +96,7 @@ GHandle gwinGScopeCreate(GDisplay *g, GScopeObject *gs, GWindowInit *pInit, uint
void gwinScopeWaitForTrace(GHandle gh) {
#define gs ((GScopeObject *)(gh))
- GAudioData *paud;
+ GDataBuffer *paud;
int i;
coord_t x, y;
coord_t yoffset;
@@ -144,10 +144,10 @@ void gwinScopeWaitForTrace(GHandle gh) {
scopemin = 0;
#endif
- for(i = paud->len/(gfxSampleFormatBits(gs->format)/8); i; i--) {
+ for(i = paud->len/((gfxSampleFormatBits(gs->format)+7)/8); i; i--) {
/* Calculate the new scope value - re-scale using simple shifts for efficiency, re-center and y-invert */
- if (gs->format <= 8)
+ if (gfxSampleFormatBits(gs->format) <= 8)
y = yoffset - (((coord_t)(*pa8++ ) << shr) >> (16-SCOPE_Y_BITS));
else
y = yoffset - (((coord_t)(*pa16++) << shr) >> (16-SCOPE_Y_BITS));
@@ -216,6 +216,6 @@ void gwinScopeWaitForTrace(GHandle gh) {
gs->scopemin = scopemin;
#endif
- gaudioReleaseBuffer(paud);
+ gfxBufferRelease(paud);
#undef gs
}
diff --git a/demos/modules/gaudio/oscilloscope/main.c b/demos/modules/gaudio/oscilloscope/main.c
index b44b5a02..3636e8f9 100644
--- a/demos/modules/gaudio/oscilloscope/main.c
+++ b/demos/modules/gaudio/oscilloscope/main.c
@@ -55,10 +55,15 @@ int main(void) {
gfxInit();
- // Allocate audio buffers - 4 x 128 byte buffers.
- // You may need to increase this for slower cpu's.
- // You may be able to decrease this for low latency operating systems.
- gaudioAllocBuffers(4, 128);
+ /**
+ * Allocate audio buffers - eg. 4 x 128 byte buffers.
+ * You may need to increase this for slower cpu's.
+ * You may be able to decrease this for low latency operating systems.
+ * 8 x 256 seems to work on the really slow Olimex SAM7EX256 board (display speed limitation) @8kHz
+ * If your oscilloscope display stops then it is likely that your driver has stalled due to running
+ * out of free buffers. Increase the number of buffers..
+ */
+ gfxBufferAlloc(8, 256);
/* Get the screen dimensions */
swidth = gdispGetWidth();
diff --git a/demos/modules/gaudio/play-wave/main.c b/demos/modules/gaudio/play-wave/main.c
index f15ec7a1..888e4c8e 100644
--- a/demos/modules/gaudio/play-wave/main.c
+++ b/demos/modules/gaudio/play-wave/main.c
@@ -52,7 +52,7 @@ int main(void) {
uint32_t frequency;
ArrayDataFormat datafmt;
uint32_t len;
- GAudioData *paud;
+ GDataBuffer *pd;
// Initialise everything
gfxInit();
@@ -64,11 +64,12 @@ int main(void) {
// Allocate audio buffers - 4 x 512 byte buffers.
// You may need to increase this for slower cpu's.
// You may be able to decrease this for low latency operating systems.
- if (!gaudioAllocBuffers(4, 512)) {
+ if (!gfxBufferAlloc(4, 512)) {
errmsg = "Err: No Memory";
goto theend;
}
+repeatplay:
// Open the wave file
if (!(f = gfileOpen("allwrong.wav", "r"))) {
errmsg = "Err: Open WAV";
@@ -164,20 +165,20 @@ int main(void) {
gdispDrawString(0, gdispGetHeight()/2, "Playing...", font, Yellow);
while(toplay) {
// Get a buffer to put the data into
- paud = gaudioGetBuffer(TIME_INFINITE); // This should never fail as we are waiting forever
+ pd = gfxBufferGet(TIME_INFINITE); // This should never fail as we are waiting forever
// How much data can we put in
- len = toplay > paud->size ? paud->size : toplay;
- paud->len = len;
+ len = toplay > pd->size ? pd->size : toplay;
+ pd->len = len;
toplay -= len;
// Read the data
- if (gfileRead(f, paud+1, len) != len) {
+ if (gfileRead(f, pd+1, len) != len) {
errmsg = "Err: Read fail";
goto theend;
}
- gaudioPlay(paud);
+ gaudioPlay(pd);
}
gfileClose(f);
@@ -185,6 +186,11 @@ int main(void) {
gaudioPlayWait(TIME_INFINITE);
gdispDrawString(0, gdispGetHeight()/2+10, "Done", font, Green);
+ // Repeat the whole thing
+ gfxSleepMilliseconds(1500);
+ gdispClear(Black);
+ goto repeatplay;
+
// The end
theend:
if (errmsg)