Changeset 113

Show
Ignore:
Timestamp:
05/15/07 16:36:11 (2 years ago)
Author:
dsmith
Message:

added cwiid_get_acc_cal

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r112 r113  
    22        libcwiid 
    33        * added timestamp to message interfaces 
     4        * added cwiid_get_acc_cal 
    45 
    56        wmdemo 
     
    89        wmgui 
    910        * updated for timestamp addition 
     11        * use cwiid_get_acc_cal to get acc calibration values 
    1012 
    1113        wminput 
    1214        * updated for timestamp addition 
     15        * use cwiid_get_acc_cal to get acc calibration values (acc plugins) 
    1316 
    14172007-04-24 L. Donnie Smith <cwiid@abstrakraft.org> 
  • trunk/libcwiid/cwiid.h

    r112 r113  
    1818 *  2007-05-14 L. Donnie Smith <cwiid@abstrakraft.org> 
    1919 *  * added timestamp to message functions 
     20 *  * added cwiid_get_acc_cal 
    2021 * 
    2122 *  2007-04-24 L. Donnie Smith <cwiid@abstrakraft.org> 
     
    174175}; 
    175176 
     177struct acc_cal { 
     178        uint8_t zero[3]; 
     179        uint8_t one[3]; 
     180}; 
     181 
    176182/* Message Structs */ 
    177183struct cwiid_status_mesg { 
     
    307313                   union cwiid_mesg *mesg[], struct timespec *timestamp); 
    308314int cwiid_get_state(cwiid_wiimote_t *wiimote, struct cwiid_state *state); 
     315int cwiid_get_acc_cal(struct wiimote *wiimote, enum cwiid_ext_type ext_type, 
     316                      struct acc_cal *acc_cal); 
    309317 
    310318/* Operations */ 
  • trunk/libcwiid/interface.c

    r112 r113  
    1818 *  2007-05-14 L. Donnie Smith <cwiid@abstrakraft.org> 
    1919 *  * added timestamp to cwiid_get_mesg 
     20 *  * added cwiid_get_acc_cal 
    2021 * 
    2122 *  2007-04-24 L. Donnie Smith <cwiid@abstrakraft.org> 
     
    141142        return 0; 
    142143} 
     144 
     145int cwiid_get_acc_cal(struct wiimote *wiimote, enum cwiid_ext_type ext_type, 
     146                      struct acc_cal *acc_cal) 
     147{ 
     148        uint8_t flags; 
     149        uint32_t offset; 
     150        unsigned char buf[7]; 
     151        char *err_str; 
     152 
     153        switch (ext_type) { 
     154        case CWIID_EXT_NONE: 
     155                flags = CWIID_RW_EEPROM; 
     156                offset = 0x16; 
     157                err_str = ""; 
     158                break; 
     159        case CWIID_EXT_NUNCHUK: 
     160                flags = CWIID_RW_REG | CWIID_RW_DECODE; 
     161                offset = 0xA40020; 
     162                err_str = "nunchuk "; 
     163                break; 
     164        default: 
     165                cwiid_err(wiimote, "Unsupported calibration request"); 
     166                return -1; 
     167        } 
     168        if (cwiid_read(wiimote, flags, offset, 7, buf)) { 
     169                cwiid_err(wiimote, "Read error (%scal)", err_str); 
     170                return -1; 
     171        } 
     172 
     173        acc_cal->zero[CWIID_X] = buf[0]; 
     174        acc_cal->zero[CWIID_Y] = buf[1]; 
     175        acc_cal->zero[CWIID_Z] = buf[2]; 
     176        acc_cal->one[CWIID_X]  = buf[4]; 
     177        acc_cal->one[CWIID_Y]  = buf[5]; 
     178        acc_cal->one[CWIID_Z]  = buf[6]; 
     179 
     180        return 0; 
     181} 
  • trunk/wmgui/main.c

    r112 r113  
    1818 *  2007-05-14 L. Donnie Smith <cwiid@abstrakraft.org> 
    1919 *  * added timestamp to message callback 
     20 *  * use cwiid_get_acc_cal to get acc calibration values 
    2021 * 
    2122 *  2007-04-24 L. Donnie Smith <cwiid@abstrakraft.org> 
     
    6465#define PI      3.14159265358979323 
    6566 
    66 struct acc { 
    67         uint8_t x; 
    68         uint8_t y; 
    69         uint8_t z; 
    70 }; 
    71  
    7267struct stick { 
    7368        char valid; 
     
    8075cwiid_wiimote_t *wiimote = NULL; 
    8176bdaddr_t bdaddr; 
    82 struct acc acc_zero, acc_one
     77struct acc_cal wm_cal, nc_cal
    8378struct cwiid_ir_mesg ir_data; 
    84 struct acc nc_acc_zero, nc_acc_one; 
    8579struct stick nc_stick; 
    8680struct stick cc_l_stick, cc_r_stick; 
     
    634628{ 
    635629        char reset_bdaddr = 0; 
    636         unsigned char buf[7]; 
    637630 
    638631        if (bacmp(&bdaddr, BDADDR_ANY) == 0) { 
     
    658651        else { 
    659652                status("Connected"); 
    660                 if (cwiid_read(wiimote, CWIID_RW_EEPROM, 0x16, 7, buf)) { 
     653                if (cwiid_get_acc_cal(wiimote, CWIID_EXT_NONE, &wm_cal)) { 
    661654                        message(GTK_MESSAGE_ERROR, "Unable to retrieve accelerometer " 
    662655                                "calibration", GTK_WINDOW(winMain)); 
    663                 } 
    664                 else { 
    665                         acc_zero.x = buf[0]; 
    666                         acc_zero.y = buf[1]; 
    667                         acc_zero.z = buf[2]; 
    668                         acc_one.x  = buf[4]; 
    669                         acc_one.y  = buf[5]; 
    670                         acc_one.z  = buf[6]; 
    671656                } 
    672657                set_gui_state(); 
     
    10251010        char battery[BATTERY_STR_LEN]; 
    10261011        char *ext_str; 
    1027         unsigned char buf[7]; 
    10281012        static enum cwiid_ext_type ext_type = CWIID_EXT_NONE; 
    10291013 
     
    10431027                                ext_str = "Nunchuk"; 
    10441028                                if (ext_type != CWIID_EXT_NUNCHUK) { 
    1045                                         if (cwiid_read(wiimote, 
    1046                                                          CWIID_RW_REG | CWIID_RW_DECODE, 
    1047                                                      0xA40020, 7, buf)) { 
    1048                                                 message(GTK_MESSAGE_ERROR, "Unable to retrieve " 
    1049                                                         "nunchuk calibration", GTK_WINDOW(winMain)); 
    1050                                         } 
    1051                                         else { 
    1052                                                 nc_acc_zero.x = buf[0]; 
    1053                                                 nc_acc_zero.y = buf[1]; 
    1054                                                 nc_acc_zero.z = buf[2]; 
    1055                                                 nc_acc_one.x  = buf[4]; 
    1056                                                 nc_acc_one.y  = buf[5]; 
    1057                                                 nc_acc_one.z  = buf[6]; 
     1029                                        if (cwiid_get_acc_cal(wiimote, CWIID_EXT_NUNCHUK, 
     1030                                                              &nc_cal)) { 
     1031                                                message(GTK_MESSAGE_ERROR, 
     1032                                                        "Unable to retrieve accelerometer calibration", 
     1033                                                        GTK_WINDOW(winMain)); 
    10581034                                        } 
    10591035                                } 
     
    11441120                                              (double)mesg->acc[CWIID_Z]/0xFF); 
    11451121 
    1146                 a_x = ((double)mesg->acc[CWIID_X] - acc_zero.x) / 
    1147                       (acc_one.x - acc_zero.x); 
    1148                 a_y = ((double)mesg->acc[CWIID_Y] - acc_zero.y) / 
    1149                       (acc_one.y - acc_zero.y); 
    1150                 a_z = ((double)mesg->acc[CWIID_Z] - acc_zero.z) / 
    1151                       (acc_one.z - acc_zero.z); 
     1122                a_x = ((double)mesg->acc[CWIID_X] - wm_cal.zero[CWIID_X]) / 
     1123                      (wm_cal.one[CWIID_X] - wm_cal.zero[CWIID_X]); 
     1124                a_y = ((double)mesg->acc[CWIID_Y] - wm_cal.zero[CWIID_Y]) / 
     1125                      (wm_cal.one[CWIID_Y] - wm_cal.zero[CWIID_Y]); 
     1126                a_z = ((double)mesg->acc[CWIID_Z] - wm_cal.zero[CWIID_Z]) / 
     1127                      (wm_cal.one[CWIID_Z] - wm_cal.zero[CWIID_Z]); 
    11521128                a = sqrt(pow(a_x,2)+pow(a_y,2)+pow(a_z,2)); 
    11531129 
     
    12091185 
    12101186                /* TODO: get nunchuk calibration */ 
    1211                 a_x = ((double)mesg->acc[CWIID_X] - nc_acc_zero.x) / 
    1212                       (nc_acc_one.x - nc_acc_zero.x); 
    1213                 a_y = ((double)mesg->acc[CWIID_Y] - nc_acc_zero.y) / 
    1214                       (nc_acc_one.y - nc_acc_zero.y); 
    1215                 a_z = ((double)mesg->acc[CWIID_Z] - nc_acc_zero.z) / 
    1216                       (nc_acc_one.z - nc_acc_zero.z); 
     1187                a_x = ((double)mesg->acc[CWIID_X] - nc_cal.zero[CWIID_X]) / 
     1188                      (nc_cal.one[CWIID_X] - nc_cal.zero[CWIID_X]); 
     1189                a_y = ((double)mesg->acc[CWIID_Y] - nc_cal.zero[CWIID_Y]) / 
     1190                      (nc_cal.one[CWIID_Y] - nc_cal.zero[CWIID_Y]); 
     1191                a_z = ((double)mesg->acc[CWIID_Z] - nc_cal.zero[CWIID_Z]) / 
     1192                      (nc_cal.one[CWIID_Z] - nc_cal.zero[CWIID_Z]); 
    12171193                a = sqrt(pow(a_x,2)+pow(a_y,2)+pow(a_z,2)); 
    12181194                roll = atan(a_x/a_z); 
  • trunk/wminput/plugins/acc/acc.c

    r101 r113  
    1616 * 
    1717 *  ChangeLog: 
     18 *  2007-05-14 L. Donnie Smith <cwiid@abstrakraft.org> 
     19 *  * use cwiid_get_acc_cal to get acc calibration values 
     20 * 
    1821 *  2007-04-24 L. Donnie Smith <cwiid@abstrakraft.org> 
    1922 *  * updated for API overhaul 
     
    4346#define PI      3.14159265358979323 
    4447 
    45 struct acc { 
    46         uint8_t x; 
    47         uint8_t y; 
    48         uint8_t z; 
    49 }; 
    50  
    5148static unsigned char info_init = 0; 
    5249static struct wmplugin_info info; 
    5350static struct wmplugin_data data; 
    5451 
    55 static struct acc acc_zero, acc_one
     52static struct acc_cal acc_cal
    5653 
    5754static int plugin_id; 
     
    110107int wmplugin_init(int id, cwiid_wiimote_t *wiimote) 
    111108{ 
    112         unsigned char buf[7]; 
    113  
    114109        plugin_id = id; 
    115110 
     
    121116        } 
    122117 
    123         if (cwiid_read(wiimote, CWIID_RW_EEPROM, 0x16, 7, buf)) { 
    124                 wmplugin_err(id, "unable to read wiimote info"); 
     118        if (cwiid_get_acc_cal(wiimote, CWIID_EXT_NONE, &acc_cal)) { 
     119                wmplugin_err(id, "calibration error"); 
    125120                return -1; 
    126121        } 
    127         acc_zero.x = buf[0]; 
    128         acc_zero.y = buf[1]; 
    129         acc_zero.z = buf[2]; 
    130         acc_one.x  = buf[4]; 
    131         acc_one.y  = buf[5]; 
    132         acc_one.z  = buf[6]; 
    133122 
    134123        return 0; 
     
    163152        double roll, pitch; 
    164153 
    165         a_x = (((double)mesg->acc[CWIID_X] - acc_zero.x) / 
    166               (acc_one.x - acc_zero.x))*NEW_AMOUNT + a_x*OLD_AMOUNT; 
    167         a_y = (((double)mesg->acc[CWIID_Y] - acc_zero.y) / 
    168               (acc_one.y - acc_zero.y))*NEW_AMOUNT + a_y*OLD_AMOUNT; 
    169         a_z = (((double)mesg->acc[CWIID_Z] - acc_zero.z) / 
    170               (acc_one.z - acc_zero.z))*NEW_AMOUNT + a_z*OLD_AMOUNT; 
     154        a_x = (((double)mesg->acc[CWIID_X] - acc_cal.zero[CWIID_X]) / 
     155              (acc_cal.one[CWIID_X] - acc_cal.zero[CWIID_X]))*NEW_AMOUNT + 
     156              a_x*OLD_AMOUNT; 
     157        a_y = (((double)mesg->acc[CWIID_Y] - acc_cal.zero[CWIID_Y]) / 
     158              (acc_cal.one[CWIID_Y] - acc_cal.zero[CWIID_Y]))*NEW_AMOUNT + 
     159              a_y*OLD_AMOUNT; 
     160        a_z = (((double)mesg->acc[CWIID_Z] - acc_cal.zero[CWIID_Z]) / 
     161              (acc_cal.one[CWIID_Z] - acc_cal.zero[CWIID_Z]))*NEW_AMOUNT + 
     162              a_z*OLD_AMOUNT; 
    171163 
    172164        a = sqrt(pow(a_x,2)+pow(a_y,2)+pow(a_z,2)); 
  • trunk/wminput/plugins/nunchuk_acc/nunchuk_acc.c

    r101 r113  
    1616 * 
    1717 *  ChangeLog: 
     18 *  2007-05-14 L. Donnie Smith <cwiid@abstrakraft.org> 
     19 *  * use cwiid_get_acc_cal to get acc calibration values 
     20 * 
    1821 *  2007-04-24 L. Donnie Smith <cwiid@abstrakraft.org> 
    1922 *  * updated for API overhaul 
     
    4144#define PI      3.14159265358979323 
    4245 
    43 struct acc { 
    44         uint8_t x; 
    45         uint8_t y; 
    46         uint8_t z; 
    47 }; 
    48  
    4946static unsigned char info_init = 0; 
    5047static struct wmplugin_info info; 
     
    5350static cwiid_wiimote_t *wiimote; 
    5451 
    55 static struct acc acc_zero, acc_one
     52static struct acc_cal acc_cal
    5653static int plugin_id; 
    5754 
     
    127124        int i; 
    128125        enum cwiid_ext_type ext_type = CWIID_EXT_NONE; 
    129         unsigned char buf[7]; 
    130126        struct wmplugin_data *ret = NULL; 
    131127 
     
    135131                        if ((mesg[i]->status_mesg.ext_type == CWIID_EXT_NUNCHUK) && 
    136132                          (ext_type != CWIID_EXT_NUNCHUK)) { 
    137                                 if (cwiid_read(wiimote, CWIID_RW_REG | CWIID_RW_DECODE, 
    138                                                  0xA40020, 7, buf)) { 
    139                                         wmplugin_err(plugin_id, "unable to read wiimote info"); 
     133                                if (cwiid_get_acc_cal(wiimote, CWIID_EXT_NUNCHUK, &acc_cal)) { 
     134                                        wmplugin_err(plugin_id, "calibration error"); 
    140135                                } 
    141                                 acc_zero.x = buf[0]; 
    142                                 acc_zero.y = buf[1]; 
    143                                 acc_zero.z = buf[2]; 
    144                                 acc_one.x  = buf[4]; 
    145                                 acc_one.y  = buf[5]; 
    146                                 acc_one.z  = buf[6]; 
    147136                        } 
    148137                        ext_type = mesg[i]->status_mesg.ext_type; 
     
    169158        double roll, pitch; 
    170159 
    171         a_x = (((double)mesg->acc[CWIID_X] - acc_zero.x) / 
    172               (acc_one.x - acc_zero.x))*NEW_AMOUNT + a_x*OLD_AMOUNT; 
    173         a_y = (((double)mesg->acc[CWIID_Y] - acc_zero.y) / 
    174               (acc_one.y - acc_zero.y))*NEW_AMOUNT + a_y*OLD_AMOUNT; 
    175         a_z = (((double)mesg->acc[CWIID_Z] - acc_zero.z) / 
    176               (acc_one.z - acc_zero.z))*NEW_AMOUNT + a_z*OLD_AMOUNT; 
     160        a_x = (((double)mesg->acc[CWIID_X] - acc_cal.zero[CWIID_X]) / 
     161              (acc_cal.one[CWIID_X] - acc_cal.zero[CWIID_X]))*NEW_AMOUNT + 
     162              a_x*OLD_AMOUNT; 
     163        a_y = (((double)mesg->acc[CWIID_Y] - acc_cal.zero[CWIID_Y]) / 
     164              (acc_cal.one[CWIID_Y] - acc_cal.zero[CWIID_Y]))*NEW_AMOUNT + 
     165              a_y*OLD_AMOUNT; 
     166        a_z = (((double)mesg->acc[CWIID_Z] - acc_cal.zero[CWIID_Z]) / 
     167              (acc_cal.one[CWIID_Z] - acc_cal.zero[CWIID_Z]))*NEW_AMOUNT + 
     168              a_z*OLD_AMOUNT; 
    177169 
    178170        a = sqrt(pow(a_x,2)+pow(a_y,2)+pow(a_z,2));