SDG+USBHost(Mouse) Sample

Dependencies:   Sound_Generator USBHost_custom

Fork of SDG_Mouse_Sample by GR-PEACH_producer_meeting

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "USBHostMouse.h"
00003 extern "C" {
00004 #include "devdrv_sdg.h"
00005 }
00006 /* defines */
00007 #define SDG_OUTPUT_CH         (1)
00008 #define DEFAULT_LOUDNESS      (4)
00009 #define DIV_MAX               (100)
00010 #define DIV_DEFAULT           (75)
00011 #define DIV_MIN               (50)
00012 #define MODE_TONE             (2)
00013 
00014 #define MOUSE_BUTTON_LEFGT    (0x01)
00015 #define MOUSE_BUTTON_RIGHT    (0x02)
00016 #define MOUSE_BUTTON_CENTER   (0x04)
00017 
00018 #define OCTAVE_MAX            (4)
00019 #define OCTAVE_LEV_MAX        (OCTAVE_MAX - 1)
00020 #define OCTAVE_LEV_MIN        (0)
00021 static const struct {
00022     uint8_t     tone_max;
00023     uint8_t     tone_min;
00024     uint8_t     sfs;
00025 } octave_table[OCTAVE_MAX] = {
00026     { 31, 16, 150},  /* octave 3(*) */
00027     { 50, 24, 190},  /* octave 2(+) */
00028     { 86, 43, 220},  /* octave 1() */
00029     {124, 73, 255},  /* octave 0(-) */
00030 };
00031 
00032 /*  RAMS   */
00033 DigitalOut led(LED1);
00034 static NOTE output_note;
00035 static int32_t work_tone;
00036 static int32_t work_octave_lev;
00037 static int32_t work_div;
00038 
00039 
00040 void onMouseEvent(uint8_t buttons, int8_t x, int8_t y, int8_t z) {
00041     
00042     //update div
00043     work_div += z;
00044     if (work_div < DIV_MIN) {
00045         work_div = DIV_MIN;
00046     } else if (work_div > DIV_MAX) {
00047         work_div = DIV_MAX;
00048     }
00049     if ((buttons & MOUSE_BUTTON_CENTER) == MOUSE_BUTTON_CENTER) {
00050         work_div = DIV_DEFAULT;
00051     }
00052     
00053     //update tone
00054     x = x * (-1);
00055     work_tone += x;
00056     if (work_tone < (octave_table[work_octave_lev].tone_min * work_div * MODE_TONE)) {
00057         if (work_octave_lev != OCTAVE_LEV_MIN) {
00058             work_octave_lev--;
00059             work_tone = octave_table[work_octave_lev].tone_max * work_div * MODE_TONE;
00060         } else {
00061             work_tone = octave_table[work_octave_lev].tone_min * work_div * MODE_TONE;
00062         }
00063     } else if (work_tone > (octave_table[work_octave_lev].tone_max * work_div * MODE_TONE)) {
00064         if (work_octave_lev != OCTAVE_LEV_MAX) {
00065             work_octave_lev++;
00066             work_tone = octave_table[work_octave_lev].tone_min * work_div * MODE_TONE;
00067         } else {
00068             work_tone = octave_table[work_octave_lev].tone_max * work_div * MODE_TONE;
00069         }
00070     }
00071 
00072     
00073     if ((buttons & MOUSE_BUTTON_RIGHT) == MOUSE_BUTTON_RIGHT) {
00074         work_tone = 72 * work_div * MODE_TONE;
00075         work_octave_lev = 2;
00076     }
00077     output_note.tone = work_tone / (work_div * MODE_TONE);
00078     output_note.sfs  = octave_table[work_octave_lev].sfs;
00079     
00080     printf("sfs: %d, tone: %d, div: %d\r\n", output_note.sfs, output_note.tone, work_div);
00081     if ((buttons & MOUSE_BUTTON_LEFGT) == MOUSE_BUTTON_LEFGT) {
00082         // mouse left button clicked
00083         output_note.loud = DEFAULT_LOUDNESS;
00084         R_SDG_Tone(SDG_OUTPUT_CH, &output_note);
00085     } else {
00086         // mouse left button released
00087         output_note.loud = 0;
00088         R_SDG_Tone(SDG_OUTPUT_CH, &output_note);
00089     }
00090 }
00091 
00092 void mouse_task(void const *) {
00093     int32_t        ret;        /* function result */
00094     USBHostMouse mouse;
00095     
00096     while(1) {
00097         // try to connect a USB mouse
00098         while(!mouse.connect())
00099             Thread::wait(500);
00100         
00101         // when connected, attach handler called on mouse event
00102         mouse.attachEvent(onMouseEvent);
00103         
00104         ret = R_SDG_Open(SDG_OUTPUT_CH, R_SDG_CLOCK_4);
00105         if (ret < 0) {
00106             printf("SDG Open Error\r\n");
00107         }
00108         
00109         
00110         // wait until the mouse is disconnected
00111         while(mouse.connected())
00112             Thread::wait(500);
00113             
00114         ret = R_SDG_Close(SDG_OUTPUT_CH);
00115         if (ret < 0) {
00116             printf("SDG Close Error\r\n");
00117         }
00118     }
00119 }
00120 
00121 int main() {
00122     // init SDG Note
00123     work_tone = 72;       /* C */
00124     work_octave_lev = 2;
00125     work_div  = DIV_DEFAULT;
00126     output_note.tone              = work_tone;
00127     output_note.sfs               = octave_table[work_octave_lev].sfs;
00128     output_note.loud              = 0;
00129     output_note.attenuation       = 0;
00130 
00131     Thread mouseTask(mouse_task, NULL, osPriorityNormal, 256 * 4);
00132     while(1) {
00133         led=!led;
00134         Thread::wait(500);
00135     }
00136 }