adding more bugs...
This commit is contained in:
parent
7cc708c0fd
commit
11eca2fdc7
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,6 +5,7 @@ tarball
|
||||
osc2cursor
|
||||
osc-joy
|
||||
text2osc
|
||||
showbuttons
|
||||
|
||||
doc/*.toc
|
||||
doc/*.log
|
||||
|
2
MIDI/README.md
Normal file
2
MIDI/README.md
Normal file
@ -0,0 +1,2 @@
|
||||
# Musical Instrument Digital Interface
|
||||
|
11
Makefile
11
Makefile
@ -1,4 +1,4 @@
|
||||
# ----------------------------------------------------
|
||||
# --------------------------------------------------------------
|
||||
|
||||
# umpf...
|
||||
|
||||
@ -7,7 +7,7 @@ DEPS = Makefile
|
||||
|
||||
all: osc-joy osc2cursor text2osc
|
||||
|
||||
# ----------------------------------------------------
|
||||
# --------------------------------------------------------------
|
||||
|
||||
osc2cursor: osc2cursor.c ${DEPS} functions/libpocosc.a
|
||||
gcc ${OPTS} $< functions/libpocosc.a -llo -lcurses -o $@
|
||||
@ -18,4 +18,9 @@ osc-joy: osc-joy.c ${DEPS} functions/libpocosc.a
|
||||
text2osc: text2osc.c ${DEPS} functions/libpocosc.a
|
||||
gcc ${OPTS} $< functions/libpocosc.a -llo -o $@
|
||||
|
||||
# ----------------------------------------------------
|
||||
# --------------------------------------------------------------
|
||||
|
||||
showbuttons: showbuttons.c functions/libpocosc.a ${DEPS}
|
||||
gcc ${OPTS} $< functions/libpocosc.a -llo -lcurses -o $@
|
||||
|
||||
# --------------------------------------------------------------
|
||||
|
48
generators/testkontrol.pl
Executable file
48
generators/testkontrol.pl
Executable file
@ -0,0 +1,48 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
my $port = 9001;
|
||||
my $target = "localhost";
|
||||
|
||||
# ----------------------------------------------------------
|
||||
|
||||
use Net::OpenSoundControl::Client;
|
||||
use Data::Dumper qw(Dumper);
|
||||
use Getopt::Std;
|
||||
|
||||
my $client;
|
||||
my $verbose = 0;
|
||||
|
||||
# ----------------------------------------------------------
|
||||
#
|
||||
# MAIN
|
||||
#
|
||||
getopts('d:v', \%options);
|
||||
|
||||
if (defined $options{"d"}) {
|
||||
# print Dumper $options{"d"};
|
||||
($target, $port) = split /:/, $options{"d"};
|
||||
}
|
||||
$verbose = 1 if (defined $options{"v"});
|
||||
|
||||
print "trashing ", $target, " on port ", $port, "\n";
|
||||
|
||||
$client = Net::OpenSoundControl::Client->new(
|
||||
Name => "testkontrol",
|
||||
Host => $target, Port => $port)
|
||||
or die "Could not start client: $@\n";
|
||||
|
||||
print Dumper $client if $verbose;
|
||||
|
||||
my ($foo, $knum, $kval);
|
||||
|
||||
for ($foo=0; $foo<128; $foo++) {
|
||||
$kval = int(128*rand());
|
||||
$knum = int(128*rand());
|
||||
|
||||
print "$knum -> $kval\n" if $verbose;
|
||||
$client->send(['/kontrol/v', 'i', $knum, 'i', $kval]);
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------
|
||||
|
334
showbuttons.c
Normal file
334
showbuttons.c
Normal file
@ -0,0 +1,334 @@
|
||||
/*
|
||||
* SHOW BUTTONS
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <getopt.h>
|
||||
#include <lo/lo.h>
|
||||
|
||||
#include "functions/ncursefuncs.h"
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
#define LOCAL_PORT "9002"
|
||||
#define NB_BUTTONS 24
|
||||
|
||||
int verbosity;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
int value;
|
||||
char texte[20];
|
||||
} Event;
|
||||
|
||||
#define BUTTONS_EV 1
|
||||
#define XY_EV 2
|
||||
#define ID_EV 3
|
||||
|
||||
static int count;
|
||||
static int pipefd[2];
|
||||
#define EVNT_RD (pipefd[0])
|
||||
#define EVNT_WR (pipefd[1])
|
||||
|
||||
unsigned char buttons[NB_BUTTONS];
|
||||
short xy_values[2];
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
#define LINE0 8 /* vertical position of the top line */
|
||||
|
||||
int draw_buttons(unsigned char *states, int nbre, int unused)
|
||||
{
|
||||
int idx, pos_c, pos_l;
|
||||
char txt[20];
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "--> %s ( %p %d )\n", __func__, states, nbre);
|
||||
#endif
|
||||
|
||||
for (idx=0; idx<nbre; idx++) {
|
||||
pos_c = 5 + ((idx % 8) * 9);
|
||||
pos_l = LINE0 + ((idx / 8) * 5);
|
||||
sprintf(txt, "%03d", idx);
|
||||
draw_a_button(stdscr, pos_l, pos_c, txt, states[idx]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
int display_a_value(int lig, short value, char letter)
|
||||
{
|
||||
char buffer[80], symbol;
|
||||
int width, seuil, foo;
|
||||
|
||||
sprintf(buffer, "%6d [", value);
|
||||
mvaddstr(lig, 4, buffer);
|
||||
|
||||
if (value < 0) symbol = '-';
|
||||
else symbol = '+';
|
||||
|
||||
width = 60;
|
||||
seuil = (abs((int)value) * width) / 32767;
|
||||
|
||||
#if DEBUG_LEVEL > 1
|
||||
fprintf(stderr, "in %s : value=%6d, seuil=%d\n", __func__, value, seuil);
|
||||
#endif
|
||||
|
||||
for (foo=0; foo<width; foo++) {
|
||||
if (foo < seuil) mvaddch(lig, foo+12, symbol);
|
||||
else mvaddch(lig, foo+12, ' ');
|
||||
}
|
||||
|
||||
refresh();
|
||||
|
||||
#if DEBUG_LEVEL > 1
|
||||
sprintf(buffer, "%s : %6d ", __func__, value);
|
||||
blast_error_message(buffer, 0, 0);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
int display_values(short *vals, int nbre, int ligne)
|
||||
{
|
||||
int foo;
|
||||
char buffer[80];
|
||||
|
||||
for (foo=0; foo<nbre; foo ++) {
|
||||
display_a_value(ligne + foo, vals[foo], '?');
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
int animation(int cycles, int speed)
|
||||
{
|
||||
int foo;
|
||||
short values[2];
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "entering %s ( %d %d )\n", __func__, cycles, speed);
|
||||
#endif
|
||||
|
||||
for (foo=0; foo<cycles; foo++) {
|
||||
draw_buttons(buttons, NB_BUTTONS, 0);
|
||||
display_values(values, 2, 2);
|
||||
refresh();
|
||||
usleep(speed*1000);
|
||||
|
||||
buttons[rand()%NB_BUTTONS] = rand() & 1;
|
||||
values[0] += rand() % 320;
|
||||
values[0] = abs(values[0]);
|
||||
if (rand()%100 < 10)
|
||||
values[1] = rand() % 32000;
|
||||
|
||||
}
|
||||
|
||||
/* may be we can make some cleanup after the show ? */
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
int do_animation(int cycles, int speed)
|
||||
{
|
||||
|
||||
(void)initcurses();
|
||||
animation(cycles, speed);
|
||||
|
||||
sleep(2);
|
||||
exit(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
void error(int num, const char *msg, const char *path)
|
||||
{
|
||||
fprintf(stderr, "liblo server error %d in path %s : %s\n", num, path, msg);
|
||||
exit(1);
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
int xy_handler(const char *path, const char *types, lo_arg ** argv,
|
||||
int argc, void *data, void *user_data)
|
||||
{
|
||||
int x, y, foo;
|
||||
Event evt;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s : %s %s %d %p\n", __func__,
|
||||
path, types, argc, user_data);
|
||||
#endif
|
||||
|
||||
x = argv[0]->i; y = argv[1]->i;
|
||||
/* may be we can bound-check that pair or values ? */
|
||||
|
||||
xy_values[0] = x; xy_values[1] = y;
|
||||
|
||||
evt.type = XY_EV; evt.value = 0x55;
|
||||
foo = write(EVNT_WR, &evt, sizeof(Event));
|
||||
if (sizeof(Event) != foo) {
|
||||
fprintf(stderr, "%s : fifo error %d\n", __func__, errno);
|
||||
exit(1);
|
||||
}
|
||||
count++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
int id_handler(const char *path, const char *types, lo_arg ** argv,
|
||||
int argc, void *data, void *user_data)
|
||||
{
|
||||
Event evt;
|
||||
int foo;
|
||||
|
||||
evt.type = ID_EV; evt.value = 0x55;
|
||||
foo = write(EVNT_WR, &evt, sizeof(Event));
|
||||
if (sizeof(Event) != foo) {
|
||||
fprintf(stderr, "%s : fifo error %d\n", __func__, errno);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
int button_handler(const char *path, const char *types, lo_arg ** argv,
|
||||
int argc, void *data, void *user_data)
|
||||
{
|
||||
// char ligne[80];
|
||||
int button, state, foo;
|
||||
Event evt;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s : %s %s %d %p\n", __func__,
|
||||
path, types, argc, user_data);
|
||||
#endif
|
||||
|
||||
button = argv[0]->i; state = argv[1]->i;
|
||||
|
||||
if (button<0 || button>=NB_BUTTONS) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
((unsigned char *)user_data)[button] = state;
|
||||
|
||||
evt.type = BUTTONS_EV; evt.value = 0x55;
|
||||
foo = write(EVNT_WR, &evt, sizeof(Event));
|
||||
if (sizeof(Event) != foo) {
|
||||
fprintf(stderr, "%s : fifo error %d\n", __func__, errno);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
static void help(int k)
|
||||
{
|
||||
puts("\t * showbuttons " __DATE__ " *");
|
||||
puts("\t-a\tshow animation");
|
||||
puts("\t-p\tlocal udp port ("LOCAL_PORT")");
|
||||
puts("\t-v\tenhance my verbosity");
|
||||
exit(0);
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int foo;
|
||||
lo_server_thread st;
|
||||
char *local_port = LOCAL_PORT;
|
||||
int opt;
|
||||
char ligne[81];
|
||||
long tdebut;
|
||||
Event event;
|
||||
|
||||
/* parsing command line options */
|
||||
while ((opt = getopt(argc, argv, "ahp:vE:C:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'a': do_animation(200, 20); break;
|
||||
case 'h': help(0); break;
|
||||
case 'p': local_port = optarg; break;
|
||||
case 'v': verbosity++; break;
|
||||
default: exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
tdebut = time(NULL);
|
||||
count = 0;
|
||||
|
||||
/*
|
||||
* setup the inter-thread event synthetizer
|
||||
*/
|
||||
foo = pipe(pipefd);
|
||||
if (foo) {
|
||||
perror("event synth");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* set up the pretty screen user interface */
|
||||
foo = initcurses();
|
||||
sprintf(ligne, ":%s ", local_port);
|
||||
foo = draw_main_screen(ligne, 0);
|
||||
if (foo) {
|
||||
endwin();
|
||||
fprintf(stderr, "main screen : err %d\n", foo);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* fireup the OSC liblo engine */
|
||||
st = lo_server_thread_new(local_port, error);
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "Address of 'values' = %p\n", buttons);
|
||||
#endif
|
||||
|
||||
lo_server_thread_add_method(st, "/joystick/b", "ii",
|
||||
button_handler, buttons);
|
||||
lo_server_thread_add_method(st, "/joystick/xy", "ii",
|
||||
xy_handler, NULL);
|
||||
lo_server_thread_start(st);
|
||||
|
||||
sprintf(ligne, "process %d on board, captain", getpid());
|
||||
blast_error_message(ligne, 0, 0);
|
||||
sleep(1);
|
||||
|
||||
for (;;) {
|
||||
/* wait for un event from liblo threads */
|
||||
foo = read(EVNT_RD, &event, sizeof(Event));
|
||||
if (sizeof(Event) != foo) { /* FAILURE */
|
||||
perror("event fifo read error");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "event %5d %8d %s\n",
|
||||
event.type, event.value, event.texte);
|
||||
#endif
|
||||
|
||||
switch (event.type) {
|
||||
case BUTTONS_EV:
|
||||
draw_buttons(buttons, NB_BUTTONS, 0);
|
||||
break;
|
||||
case XY_EV:
|
||||
display_values(xy_values, 2, 4);
|
||||
break;
|
||||
case ID_EV:
|
||||
break;
|
||||
default:
|
||||
blast_error_message("bad event", 0, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (verbosity)
|
||||
{ fprintf(stderr, "elapsed %ld s.\n", time(NULL)-tdebut); }
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
Loading…
Reference in New Issue
Block a user