From 7be3db60a0efba40a0c10a4476490a05fa62a1bc Mon Sep 17 00:00:00 2001
From: Ludovic Pouzenc <ludovic@pouzenc.fr>
Date: Thu, 17 May 2012 18:41:13 +0000
Subject: Ajout des premiers bouts de code pour les tests : test1 = prise de
 son via pulse audio (à l'arache avec le modèle "simple") test2 = premières
 illuminations avec le projo LED test3 = fade R/G/B et jeu avec les
 problématiques de timing test4 = à faire : Appli GTK pour assembler les tests
 précédents
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

git-svn-id: file:///var/svn/2012-violon-leds/trunk@2 6be1fa4d-33ac-4c33-becc-79fcb3794bb6
---
 tests/test2/compil.sh |   1 +
 tests/test2/notes.txt |  78 ++++++++++++++++++++++++++
 tests/test2/test2.c   | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 230 insertions(+)
 create mode 100755 tests/test2/compil.sh
 create mode 100644 tests/test2/notes.txt
 create mode 100644 tests/test2/test2.c

(limited to 'tests/test2')

diff --git a/tests/test2/compil.sh b/tests/test2/compil.sh
new file mode 100755
index 0000000..023d012
--- /dev/null
+++ b/tests/test2/compil.sh
@@ -0,0 +1 @@
+gcc -g -o test2 test2.c -lftdi -lrt
diff --git a/tests/test2/notes.txt b/tests/test2/notes.txt
new file mode 100644
index 0000000..96a702e
--- /dev/null
+++ b/tests/test2/notes.txt
@@ -0,0 +1,78 @@
+
+
+ENTTEC OPEN DMX USB
+
+lsusb | grep FT232
+Bus 004 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
+
+
+On peut communiquer avec ce périphérique Série via la libftdi
+
+i   libftdi1                                                                          - Library to control and program the FTDI USB controller 
+
+
+Dans l'ordre :
+
+#include <time.h>
+
+static const int VID = 0x0403; //! FTDI Vendor ID
+static const int PID = 0x6001; //! FTDI Product ID
+
+// One "official" DMX frame can take (1s/44Hz) = 22727272ns
+#define DMX_FRAMETIME 22727272
+#define DMX_BREAK 110000
+#define DMX_MAB 16000
+#define DMX_CHANNELS 512
+
+inline void ts_diffadd(struct timespec *res, struct timespec *a, struct timespec *b, struct timespec *c) {
+	time_t rem;
+
+	res.tv_nsec=a.tv_nsec-b.tv_nsec+c.tv_nsec;
+	rem=res.tv_nsec/1e9
+	res.tv_nsec=res.tv_nsec%1e9;
+	res.tv_sec=a.tv_sec-b.tv_sec+c.tv_sec+rem;
+
+	if (res.tv_nsec<0 && res.tv_sec>0) res.tv_sec--; res.tv_nsec+=1e9;
+	if (res.tv_nsec>0 && res.tv_sec<0) res.tv_nsec-=1e9; res.tv_sec++;
+}
+
+
+ftdi_usb_find_all(&ftdi, &list, QLCFTDI::VID, QLCFTDI::PID);
+
+ftdi_usb_open_desc(&m_handle, QLCFTDI::VID, QLCFTDI::PID, name().toAscii(), serial().toAscii())
+ftdi_usb_reset(&m_handle)
+ftdi_set_baudrate(&m_handle, 250000)
+ftdi_set_line_property(&m_handle, BITS_8, STOP_BIT_2, NONE)
+ftdi_setflowctrl(&m_handle, SIO_DISABLE_FLOW_CTRL)
+ftdi_usb_purge_buffers(&m_handle)
+ftdi_setrts(&m_handle, 0)
+
+frame_time.tv_sec=0;
+frame_time.tv_nsec=DMX_FRAMETIME;
+
+// Attente initiale (juste après ouverture periph)
+to_sleep.tv_sec=0;
+to_sleep.tv_nsec=1e6;
+nanosleep(to_sleep,NULL);
+
+
+clock_gettime(CLOCK_MONOTONIC, now);
+
+ts_diffadd(to_sleep,frame_time,now,trame_begin);
+nanosleep(to_sleep);
+
+clock_gettime(CLOCK_MONOTONIC, trame_begin);
+ftdi_set_line_property2(&m_handle, BITS_8, STOP_BIT_2, NONE, BREAK_ON)
+usleep(DMX_BREAK); 
+ftdi_set_line_property2(&m_handle, BITS_8, STOP_BIT_2, NONE, BREAK_OFF)
+usleep(DMX_MAB);
+m_ftdi->write(m_universe)
+ftdi_write_data(&m_handle, m_universe, sizeof(m_universe))
+
+
+
+ftdi_usb_close(&m_handle) 
+
+
+
+rq : si résultat <0, affichage erreur avec ftdi_get_error_string(&m_handle)
diff --git a/tests/test2/test2.c b/tests/test2/test2.c
new file mode 100644
index 0000000..3b20afd
--- /dev/null
+++ b/tests/test2/test2.c
@@ -0,0 +1,151 @@
+#include <ftdi.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// FTDI Vendor ID
+#define VID 0x0403
+// FTDI Product ID
+#define PID 0x6001
+
+#define DMX_CHANNELS 512
+// One "official" DMX frame can take (1s/44Hz) = 22727272ns
+#define DMX_FRAMETIME 22727272
+#define DMX_BREAK 110000
+#define DMX_MAB 16000
+
+#define MAX_STR 64
+
+inline void ts_diffadd(struct timespec *res, struct timespec *a, struct timespec *b, struct timespec *c) {
+        time_t rem;
+
+        res->tv_nsec=a->tv_nsec-b->tv_nsec+c->tv_nsec;
+        rem=res->tv_nsec/1000000000;
+        res->tv_nsec=res->tv_nsec%1000000000;
+        res->tv_sec=a->tv_sec-b->tv_sec+c->tv_sec+rem;
+
+        if (res->tv_nsec<0 && res->tv_sec>0) res->tv_sec--; res->tv_nsec+=1000000000;
+        if (res->tv_nsec>0 && res->tv_sec<0) res->tv_nsec-=1000000000; res->tv_sec++;
+}
+
+void e(int res, const char *funcname, struct ftdi_context *ftdi, int exit_val) {
+	char *reason;
+
+	if ( res < 0 ) {
+		reason=ftdi_get_error_string(ftdi);
+		fprintf(stderr, "Error in %s : %s\n", funcname, reason);
+		exit(exit_val);
+	}
+
+}
+
+/*
+struct ftdi_device_list
+{
+    // pointer to next entry
+    struct ftdi_device_list *next;
+    // pointer to libusb's usb_device
+    struct usb_device *dev;
+}
+*/
+
+int main() {
+	int res;
+
+	char *manufacturer, *description, *serial;
+	char universe[DMX_CHANNELS+1];
+
+	struct ftdi_context ftdi;
+	struct ftdi_device_list *devlist=NULL;
+	struct usb_device *dev=NULL;
+
+	struct timespec ts_frame_time, ts_dmx_break, ts_dmx_mab, ts_to_sleep, ts_trame_begin, ts_now;
+
+	ts_frame_time.tv_sec=0;
+	ts_frame_time.tv_nsec=DMX_FRAMETIME;
+	ts_dmx_break.tv_sec=0;
+	ts_dmx_break.tv_nsec=DMX_BREAK;
+	ts_dmx_mab.tv_sec=0;
+	ts_dmx_mab.tv_nsec=DMX_MAB;
+	
+	(void) memset(universe, 0, DMX_CHANNELS);
+	(void) memset(&ftdi, 0, sizeof(ftdi));
+	universe[DMX_CHANNELS]=0;
+
+	manufacturer=malloc(MAX_STR);
+	description=malloc(MAX_STR);
+	serial=malloc(MAX_STR);
+
+	e(ftdi_init(&ftdi),"ftdi_init",&ftdi,10);
+	e(ftdi_usb_find_all(&ftdi, &devlist, VID, PID),"ftdi_usb_find_all",&ftdi,11);
+
+	//Always take the first device
+	if (devlist==NULL || devlist->dev==NULL) {
+		fprintf(stderr, "No usb device detected (looking for 0x%04X:0x%04X)\n", VID, PID);
+		exit(2);
+	}
+	dev=devlist->dev;
+
+//	fprintf(stderr, "DEBUG : next==%p\n", devlist->next);
+	
+	e(ftdi_usb_get_strings(&ftdi, dev, manufacturer, MAX_STR, description, MAX_STR, serial, MAX_STR),"ftdi_usb_get_strings",&ftdi,12);
+	fprintf(stderr, "Connecting to USB device ('%s','%s','%s')\n", manufacturer, description, serial);
+	e(ftdi_usb_open_dev(&ftdi,dev),"ftdi_usb_open_dev",&ftdi,13);
+	fprintf(stderr, "Connected\n");
+	
+	//Init the device
+	e(ftdi_usb_reset(&ftdi),"ftdi_usb_reset",&ftdi,15);
+	e(ftdi_set_baudrate(&ftdi, 250000),"ftdi_set_baudrate",&ftdi,16);
+	e(ftdi_set_line_property(&ftdi, BITS_8, STOP_BIT_2, NONE),"ftdi_set_line_property",&ftdi,17);
+	e(ftdi_setflowctrl(&ftdi, SIO_DISABLE_FLOW_CTRL),"ftdi_setflowctrl",&ftdi,18);
+	e(ftdi_usb_purge_buffers(&ftdi),"ftdi_usb_purge_buffers",&ftdi,19);
+	e(ftdi_setrts(&ftdi, 0),"ftdi_setrts",&ftdi,20);
+
+	// 1ms pause for initialization completion
+	ts_to_sleep.tv_sec=0;
+	ts_to_sleep.tv_nsec=1000000;
+	nanosleep(&ts_to_sleep,NULL);
+
+	ts_trame_begin.tv_sec=0;
+	ts_trame_begin.tv_nsec=0;
+
+	// Wait the end of the previous timeslot
+	clock_gettime(CLOCK_MONOTONIC, &ts_now);
+	ts_diffadd(&ts_to_sleep,&ts_frame_time,&ts_now,&ts_trame_begin);
+	nanosleep(&ts_to_sleep,NULL);
+
+	clock_gettime(CLOCK_MONOTONIC, &ts_trame_begin);
+
+	e(ftdi_set_line_property2(&ftdi, BITS_8, STOP_BIT_2, NONE, BREAK_ON),"ftdi_set_line_property2",&ftdi,30);
+	nanosleep(&ts_dmx_break,NULL);
+	e(ftdi_set_line_property2(&ftdi, BITS_8, STOP_BIT_2, NONE, BREAK_OFF),"ftdi_set_line_property2",&ftdi,31);
+	nanosleep(&ts_dmx_mab,NULL);
+
+
+
+	// Tests
+	universe[2]=120;
+	universe[3]=120;
+	universe[4]=120;
+
+
+	//e(ftdi_write_data(&ftdi, universe, DMX_CHANNELS),"ftdi_write_data",&ftdi,32);
+	res=ftdi_write_data(&ftdi, universe, DMX_CHANNELS);
+	
+	//fprintf(stderr, "DEBUG : to_sleep=={%li,%li}\n", ts_to_sleep.tv_sec, ts_to_sleep.tv_nsec);
+	fprintf(stderr, "DEBUG : res==%i\n", res);
+//	fprintf(stderr, "DEBUG : universe==%s\n", universe);
+
+	e(ftdi_usb_close(&ftdi),"ftdi_usb_close",&ftdi,50);
+	ftdi_list_free(&devlist);
+	ftdi_deinit(&ftdi);
+
+
+	free(manufacturer);
+	free(description);
+	free(serial);
+
+	exit(0);
+}
+
-- 
cgit v1.2.3