summaryrefslogtreecommitdiff
path: root/vubars.c
blob: 8fcf081c16666814a0ea3bc2f792ea6363861513 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <stdio.h>
#include <math.h>

#include "gm.h"
#include "vubars.h"
#include "heuristics.h"

// This is our current idea of how we want to influence the weather
// 128 means: do nothing at all
// 
// We want to default to softening the weather, so our value always
// flows back towards 100
static double vu_value_main       = 100.0;
static double vu_value_softening  = 0.0;
static double vu_value_activating = 0.0;

static int wii_last[WII_COUNT * 4];
static int wii_bars[WII_COUNT * 4];

int vubars_peak( int wii_id, int led, int is_on ) {
  if( is_on ) {
    wii_last[wii_id*4+led] = 0;
  } else {
    if( ++wii_last[wii_id*4+led] == 1 )
      wii_bars[wii_id*4+led] = VU_PEAK;
  }
}

int vubars_getinfo( int wii_id, int led ) {
  return wii_bars[wii_id*4+led];
}

int vubars_getweather( ) {
  return (int)vu_value_main;
}

static int GESTURE_A_dd  = 0;
static int GESTURE_A_dx  = 0;
static int GESTURE_A_dy  = 0;

static int GESTURE_A_off = 0;
static int GESTURE_A_ttl = 0;

static int GESTURE_B_dd  = 0;
static int GESTURE_B_dx  = 0;
static int GESTURE_B_dy  = 0;

static int GESTURE_B_off = 0;
static int GESTURE_B_ttl = 0;

static void match_gesture( int off, int dx, int dy, int dd ) {
  if( ( GESTURE_A_dd == dd ) && ( GESTURE_A_off == off + dd ) ) {
    printf( "...continued A\n" );

    GESTURE_A_off = off;
    GESTURE_A_dx  = dx;
    GESTURE_A_dy  = dy;
    GESTURE_A_ttl = VU_PEAK;

  } else if ( ( GESTURE_B_dd == dd ) && ( GESTURE_B_off == off + dd ) ) {
    printf( "...continued B\n" );

    GESTURE_B_off = off;
    GESTURE_B_dx  = dx;
    GESTURE_B_dy  = dy;
    GESTURE_B_ttl = VU_PEAK;

  } else {
    printf( "\n" );

    if( GESTURE_B_ttl >= GESTURE_A_ttl ) {
      GESTURE_A_off = off;
      GESTURE_A_dd  = dd;
      GESTURE_A_dx  = dx;
      GESTURE_A_dy  = dy;
      GESTURE_A_ttl = VU_PEAK;
    } else {
      GESTURE_B_off = off;
      GESTURE_B_dd  = dd;
      GESTURE_B_dx  = dx;
      GESTURE_B_dy  = dy;
      GESTURE_B_ttl = VU_PEAK;
    }
  }
}

void vubars_reduce() {
  int i;
  double diff;

  // First do some heuristics voodoo
  int offa, offb, dxa, dxb, dya, dyb, dda, ddb;

  heuristics_getGestures( 16, wii_bars, &offa, &dxa, &dya, &dda, &offb, &dxb, &dyb, &ddb );

  if( ( offa != -1 ) && ( dxa > 2 ) ) {
    printf( "1mary gesture detected: offset: % 2d direction: %s len: % 2d speed: %lf",
            offa, dda < 0 ? "left" : "rite", dxa, (double)dya / (double)dxa );
    match_gesture( offa, dxa, dya, dda );
  }
  

  if( ( offb != -1 ) && ( dxb > 2 ) ) {
    printf( "2ndry gesture detected: offset: % 2d direction: %s len: % 2d speed: %lf\n",
            offb, ddb < 0 ? "left" : "rite", dxb, (double)dyb / (double)dxb );
    match_gesture( offb, dxb, dyb, ddb );
  }

  // Have two gestures living at one
  if( GESTURE_A_ttl && GESTURE_B_ttl ) {
    if( GESTURE_A_dd == GESTURE_B_dd ) {
//      printf( "Two gestures pointing into the same direction.\n" );
    } else {
      // The more interesting case: hands move into opposite directions
      if( GESTURE_A_dd == -1 ) {
         if ( GESTURE_A_off < GESTURE_B_off )
           printf( "Slower! (Case 1)\n" );
         else
           printf( "Faster! (Case 2)\n" );
      } else {
         if ( GESTURE_A_off < GESTURE_B_off )
           printf( "Faster! (Case 3)\n" );
         else
           printf( "Slower! (Case 4)\n" );
      }
    }
  }

  // Now try to modify the weather by using values from our vu-bars
  diff = (double)heuristics_getEnergy( 16, wii_bars );
  vu_value_main += diff / 40000.0;

  diff = vu_value_main - 100.0;
  if( diff<0 ) diff = -diff;
  diff = sqrt( diff );

  if( vu_value_main > 100.0 ) diff = -diff;

  vu_value_main += diff;

  for( i=0; i<WII_COUNT*4; ++i )
    if( wii_bars[i] )
      wii_bars[i]-=VU_STEP;

  if( GESTURE_A_ttl ) GESTURE_A_ttl -= VU_STEP;
  if( GESTURE_B_ttl ) GESTURE_B_ttl -= VU_STEP;

}