Linuxでwiimoteを使う。

サンプルをすこしいじって、ドラムをたたくように振るとランブルするプログラムを作成。
Debian(sid)使用。

windowsより扱いやすい感じです。



test.c

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <cwiid.h>

#define toggle_bit(bf,b)   \
      (bf) = ((bf) & b)    \
          ? ((bf) & ~(b))  \
          : ((bf) | (b))

void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode);

cwiid_err_t err;
void err(cwiid_wiimote_t *wiimote, const char *s, va_list ap)
{
   if (wiimote) printf("%d:", cwiid_get_id(wiimote));
   else printf("-1:");
   vprintf(s, ap);
   printf("\n");
}

int main(int argc, char *argv[])
{
   cwiid_wiimote_t *wiimote;  // wiimote handle
   struct cwiid_state state;  // wiimote state
   bdaddr_t bdaddr;           // bluetooth device address
   unsigned char mesg = 0;
   unsigned char led_state = 0;
   unsigned char rpt_mode = 0;
   unsigned char rumble = 0;
   int beat = 0;
   int cnt = 0;

   cwiid_set_err(err);

   /* Connect to address given on command-line, if present */
   if(argc > 1){
      str2ba(argv[1], &bdaddr);
   }
   else{
      bdaddr = *BDADDR_ANY;
   }

   /* Connect to the wiimote */
   printf("Put Wiimote in discoverable mode now (press 1+2)...\n");
   if(!(wiimote = cwiid_open(&bdaddr, 0))){
      fprintf(stderr, "Unable to connect to wiimote\n");
      exit(EXIT_FAILURE);
   }

   printf("### beatbox ###\n");

   /* set ACC rpt mode */
   toggle_bit(rpt_mode, CWIID_RPT_ACC);
   set_rpt_mode(wiimote, rpt_mode);

   while(1){
      /* get acc state */
      if (cwiid_get_state(wiimote, &state)) {
         fprintf(stderr, "Error getting state\n");
      }

      if(beat==0 && state.acc[CWIID_Z]>200){
         printf("beat %d!!\n", cnt++);
         beat = 1;
         /* rumble 100ms */
         toggle_bit(rumble, 1);
         if (cwiid_set_rumble(wiimote, rumble)) {
            fprintf(stderr, "Error setting rumble\n");
         }
         if (cwiid_set_led(wiimote, 0x0f)) {
            fprintf(stderr, "Error setting LEDs \n");
         }

         usleep(100000);
         toggle_bit(rumble, 1);
         if (cwiid_set_rumble(wiimote, rumble)) {
            fprintf(stderr, "Error setting rumble\n");
         }
         if (cwiid_set_led(wiimote, 0x00)) {
            fprintf(stderr, "Error setting LEDs \n");
         }
      }
      if(beat==1 && state.acc[CWIID_Z]<140){
         beat = 0;
      }
      usleep(1000);
   }

   if(cwiid_close(wiimote)){
      fprintf(stderr, "Error on wiimote disconnect\n");
      exit(EXIT_FAILURE);
   }

   exit(EXIT_SUCCESS);
}

void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode)
{
   if(cwiid_set_rpt_mode(wiimote, rpt_mode)){
      fprintf(stderr, "Error setting report mode\n");
   }
}

Makefile

SOURCES = test

LDLIBS += -lcwiid

$(SOURCES): $(SOURCES).c
   $(CC) $< $(LDLIBS) -o $@