SDG+USBHost(Mouse) Sample

Dependencies:   Sound_Generator USBHost_custom

Fork of SDG_Mouse_Sample by GR-PEACH_producer_meeting

Information

Japanese version is available in lower part of this page.
このページの後半に日本語版が用意されています.

What is this?

This program is a demonstration that sounds the sound by mouse operation by using USBHost(Mouse) and Sound Generator.

Settings

Close JP3 of GR-PEACH.
/media/uploads/RyoheiHagimoto/sdg-mouse.jpg

Operation

operationeffect
Right clickSounds
Left clickReset to base tone (C)
Moves the mouse to the rightLower the sound
Moves the mouse to the leftHigher the sound
Center cursorAdjust the sensitivity.
Reset the reference value in the click.

Others

The default setting of serial communication (baud rate etc.) in mbed is shown the following link.
Please refer to the link and change the settings of your PC terminal software.
The default value of baud rate in mbed is 9600, and this application uses baud rate 9600.
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication


概要

このプログラムは、USBHost(Mouse) + Sound Generatorで、マウス操作による擬似笛デモです。

設定

GR-PEACHのJP3をショートする必要があります。
/media/uploads/RyoheiHagimoto/sdg-mouse.jpg

操作方法

操作内容
右クリック音出力開始
左クリック基準音(ド)にリセット
マウス右移動高音になります
マウス左移動低音になります
センターカーソル音高低の変化量調整(クリックで基準値にリセット)

Others

mbedのシリアル通信(ボーレート等)のデフォルト設定は以下のリンクに示しています。
リンクを参考に、お使いのPCターミナルソフトの設定を変更して下さい。
mbedでのボーレートのデフォルト値は9600で、このサンプルではボーレート9600を使います。
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication

Committer:
Osamu Nakamura
Date:
Mon Apr 24 18:47:34 2017 +0900
Revision:
33:5fa9ed01abae
Parent:
30:ff42cc7a0d55
main.cpp was updated so that sound generator driver could be closed when USB mouse is detached.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MasaoHamanaka 30:ff42cc7a0d55 1 #include "mbed.h"
MasaoHamanaka 30:ff42cc7a0d55 2 #include "USBHostMouse.h"
MasaoHamanaka 30:ff42cc7a0d55 3 extern "C" {
MasaoHamanaka 30:ff42cc7a0d55 4 #include "devdrv_sdg.h"
MasaoHamanaka 30:ff42cc7a0d55 5 }
MasaoHamanaka 30:ff42cc7a0d55 6 /* defines */
MasaoHamanaka 30:ff42cc7a0d55 7 #define SDG_OUTPUT_CH (1)
MasaoHamanaka 30:ff42cc7a0d55 8 #define DEFAULT_LOUDNESS (4)
MasaoHamanaka 30:ff42cc7a0d55 9 #define DIV_MAX (100)
MasaoHamanaka 30:ff42cc7a0d55 10 #define DIV_DEFAULT (75)
MasaoHamanaka 30:ff42cc7a0d55 11 #define DIV_MIN (50)
MasaoHamanaka 30:ff42cc7a0d55 12 #define MODE_TONE (2)
MasaoHamanaka 30:ff42cc7a0d55 13
MasaoHamanaka 30:ff42cc7a0d55 14 #define MOUSE_BUTTON_LEFGT (0x01)
MasaoHamanaka 30:ff42cc7a0d55 15 #define MOUSE_BUTTON_RIGHT (0x02)
MasaoHamanaka 30:ff42cc7a0d55 16 #define MOUSE_BUTTON_CENTER (0x04)
MasaoHamanaka 30:ff42cc7a0d55 17
MasaoHamanaka 30:ff42cc7a0d55 18 #define OCTAVE_MAX (4)
MasaoHamanaka 30:ff42cc7a0d55 19 #define OCTAVE_LEV_MAX (OCTAVE_MAX - 1)
MasaoHamanaka 30:ff42cc7a0d55 20 #define OCTAVE_LEV_MIN (0)
MasaoHamanaka 30:ff42cc7a0d55 21 static const struct {
MasaoHamanaka 30:ff42cc7a0d55 22 uint8_t tone_max;
MasaoHamanaka 30:ff42cc7a0d55 23 uint8_t tone_min;
MasaoHamanaka 30:ff42cc7a0d55 24 uint8_t sfs;
MasaoHamanaka 30:ff42cc7a0d55 25 } octave_table[OCTAVE_MAX] = {
MasaoHamanaka 30:ff42cc7a0d55 26 { 31, 16, 150}, /* octave 3(*) */
MasaoHamanaka 30:ff42cc7a0d55 27 { 50, 24, 190}, /* octave 2(+) */
MasaoHamanaka 30:ff42cc7a0d55 28 { 86, 43, 220}, /* octave 1() */
MasaoHamanaka 30:ff42cc7a0d55 29 {124, 73, 255}, /* octave 0(-) */
MasaoHamanaka 30:ff42cc7a0d55 30 };
MasaoHamanaka 30:ff42cc7a0d55 31
MasaoHamanaka 30:ff42cc7a0d55 32 /* RAMS */
MasaoHamanaka 30:ff42cc7a0d55 33 DigitalOut led(LED1);
MasaoHamanaka 30:ff42cc7a0d55 34 static NOTE output_note;
MasaoHamanaka 30:ff42cc7a0d55 35 static int32_t work_tone;
MasaoHamanaka 30:ff42cc7a0d55 36 static int32_t work_octave_lev;
MasaoHamanaka 30:ff42cc7a0d55 37 static int32_t work_div;
MasaoHamanaka 30:ff42cc7a0d55 38
MasaoHamanaka 30:ff42cc7a0d55 39
MasaoHamanaka 30:ff42cc7a0d55 40 void onMouseEvent(uint8_t buttons, int8_t x, int8_t y, int8_t z) {
MasaoHamanaka 30:ff42cc7a0d55 41
MasaoHamanaka 30:ff42cc7a0d55 42 //update div
MasaoHamanaka 30:ff42cc7a0d55 43 work_div += z;
MasaoHamanaka 30:ff42cc7a0d55 44 if (work_div < DIV_MIN) {
MasaoHamanaka 30:ff42cc7a0d55 45 work_div = DIV_MIN;
MasaoHamanaka 30:ff42cc7a0d55 46 } else if (work_div > DIV_MAX) {
MasaoHamanaka 30:ff42cc7a0d55 47 work_div = DIV_MAX;
MasaoHamanaka 30:ff42cc7a0d55 48 }
MasaoHamanaka 30:ff42cc7a0d55 49 if ((buttons & MOUSE_BUTTON_CENTER) == MOUSE_BUTTON_CENTER) {
MasaoHamanaka 30:ff42cc7a0d55 50 work_div = DIV_DEFAULT;
MasaoHamanaka 30:ff42cc7a0d55 51 }
MasaoHamanaka 30:ff42cc7a0d55 52
MasaoHamanaka 30:ff42cc7a0d55 53 //update tone
MasaoHamanaka 30:ff42cc7a0d55 54 x = x * (-1);
MasaoHamanaka 30:ff42cc7a0d55 55 work_tone += x;
MasaoHamanaka 30:ff42cc7a0d55 56 if (work_tone < (octave_table[work_octave_lev].tone_min * work_div * MODE_TONE)) {
MasaoHamanaka 30:ff42cc7a0d55 57 if (work_octave_lev != OCTAVE_LEV_MIN) {
MasaoHamanaka 30:ff42cc7a0d55 58 work_octave_lev--;
MasaoHamanaka 30:ff42cc7a0d55 59 work_tone = octave_table[work_octave_lev].tone_max * work_div * MODE_TONE;
MasaoHamanaka 30:ff42cc7a0d55 60 } else {
MasaoHamanaka 30:ff42cc7a0d55 61 work_tone = octave_table[work_octave_lev].tone_min * work_div * MODE_TONE;
MasaoHamanaka 30:ff42cc7a0d55 62 }
MasaoHamanaka 30:ff42cc7a0d55 63 } else if (work_tone > (octave_table[work_octave_lev].tone_max * work_div * MODE_TONE)) {
MasaoHamanaka 30:ff42cc7a0d55 64 if (work_octave_lev != OCTAVE_LEV_MAX) {
MasaoHamanaka 30:ff42cc7a0d55 65 work_octave_lev++;
MasaoHamanaka 30:ff42cc7a0d55 66 work_tone = octave_table[work_octave_lev].tone_min * work_div * MODE_TONE;
MasaoHamanaka 30:ff42cc7a0d55 67 } else {
MasaoHamanaka 30:ff42cc7a0d55 68 work_tone = octave_table[work_octave_lev].tone_max * work_div * MODE_TONE;
MasaoHamanaka 30:ff42cc7a0d55 69 }
MasaoHamanaka 30:ff42cc7a0d55 70 }
MasaoHamanaka 30:ff42cc7a0d55 71
MasaoHamanaka 30:ff42cc7a0d55 72
MasaoHamanaka 30:ff42cc7a0d55 73 if ((buttons & MOUSE_BUTTON_RIGHT) == MOUSE_BUTTON_RIGHT) {
MasaoHamanaka 30:ff42cc7a0d55 74 work_tone = 72 * work_div * MODE_TONE;
MasaoHamanaka 30:ff42cc7a0d55 75 work_octave_lev = 2;
MasaoHamanaka 30:ff42cc7a0d55 76 }
MasaoHamanaka 30:ff42cc7a0d55 77 output_note.tone = work_tone / (work_div * MODE_TONE);
MasaoHamanaka 30:ff42cc7a0d55 78 output_note.sfs = octave_table[work_octave_lev].sfs;
MasaoHamanaka 30:ff42cc7a0d55 79
MasaoHamanaka 30:ff42cc7a0d55 80 printf("sfs: %d, tone: %d, div: %d\r\n", output_note.sfs, output_note.tone, work_div);
MasaoHamanaka 30:ff42cc7a0d55 81 if ((buttons & MOUSE_BUTTON_LEFGT) == MOUSE_BUTTON_LEFGT) {
MasaoHamanaka 30:ff42cc7a0d55 82 // mouse left button clicked
MasaoHamanaka 30:ff42cc7a0d55 83 output_note.loud = DEFAULT_LOUDNESS;
MasaoHamanaka 30:ff42cc7a0d55 84 R_SDG_Tone(SDG_OUTPUT_CH, &output_note);
MasaoHamanaka 30:ff42cc7a0d55 85 } else {
MasaoHamanaka 30:ff42cc7a0d55 86 // mouse left button released
MasaoHamanaka 30:ff42cc7a0d55 87 output_note.loud = 0;
MasaoHamanaka 30:ff42cc7a0d55 88 R_SDG_Tone(SDG_OUTPUT_CH, &output_note);
MasaoHamanaka 30:ff42cc7a0d55 89 }
MasaoHamanaka 30:ff42cc7a0d55 90 }
MasaoHamanaka 30:ff42cc7a0d55 91
MasaoHamanaka 30:ff42cc7a0d55 92 void mouse_task(void const *) {
MasaoHamanaka 30:ff42cc7a0d55 93 int32_t ret; /* function result */
MasaoHamanaka 30:ff42cc7a0d55 94 USBHostMouse mouse;
MasaoHamanaka 30:ff42cc7a0d55 95
MasaoHamanaka 30:ff42cc7a0d55 96 while(1) {
MasaoHamanaka 30:ff42cc7a0d55 97 // try to connect a USB mouse
MasaoHamanaka 30:ff42cc7a0d55 98 while(!mouse.connect())
MasaoHamanaka 30:ff42cc7a0d55 99 Thread::wait(500);
MasaoHamanaka 30:ff42cc7a0d55 100
MasaoHamanaka 30:ff42cc7a0d55 101 // when connected, attach handler called on mouse event
MasaoHamanaka 30:ff42cc7a0d55 102 mouse.attachEvent(onMouseEvent);
MasaoHamanaka 30:ff42cc7a0d55 103
MasaoHamanaka 30:ff42cc7a0d55 104 ret = R_SDG_Open(SDG_OUTPUT_CH, R_SDG_CLOCK_4);
MasaoHamanaka 30:ff42cc7a0d55 105 if (ret < 0) {
MasaoHamanaka 30:ff42cc7a0d55 106 printf("SDG Open Error\r\n");
MasaoHamanaka 30:ff42cc7a0d55 107 }
MasaoHamanaka 30:ff42cc7a0d55 108
MasaoHamanaka 30:ff42cc7a0d55 109
MasaoHamanaka 30:ff42cc7a0d55 110 // wait until the mouse is disconnected
MasaoHamanaka 30:ff42cc7a0d55 111 while(mouse.connected())
MasaoHamanaka 30:ff42cc7a0d55 112 Thread::wait(500);
MasaoHamanaka 30:ff42cc7a0d55 113
Osamu Nakamura 33:5fa9ed01abae 114 ret = R_SDG_Close(SDG_OUTPUT_CH);
MasaoHamanaka 30:ff42cc7a0d55 115 if (ret < 0) {
MasaoHamanaka 30:ff42cc7a0d55 116 printf("SDG Close Error\r\n");
MasaoHamanaka 30:ff42cc7a0d55 117 }
MasaoHamanaka 30:ff42cc7a0d55 118 }
MasaoHamanaka 30:ff42cc7a0d55 119 }
MasaoHamanaka 30:ff42cc7a0d55 120
MasaoHamanaka 30:ff42cc7a0d55 121 int main() {
MasaoHamanaka 30:ff42cc7a0d55 122 // init SDG Note
MasaoHamanaka 30:ff42cc7a0d55 123 work_tone = 72; /* C */
MasaoHamanaka 30:ff42cc7a0d55 124 work_octave_lev = 2;
MasaoHamanaka 30:ff42cc7a0d55 125 work_div = DIV_DEFAULT;
MasaoHamanaka 30:ff42cc7a0d55 126 output_note.tone = work_tone;
MasaoHamanaka 30:ff42cc7a0d55 127 output_note.sfs = octave_table[work_octave_lev].sfs;
MasaoHamanaka 30:ff42cc7a0d55 128 output_note.loud = 0;
MasaoHamanaka 30:ff42cc7a0d55 129 output_note.attenuation = 0;
MasaoHamanaka 30:ff42cc7a0d55 130
MasaoHamanaka 30:ff42cc7a0d55 131 Thread mouseTask(mouse_task, NULL, osPriorityNormal, 256 * 4);
MasaoHamanaka 30:ff42cc7a0d55 132 while(1) {
MasaoHamanaka 30:ff42cc7a0d55 133 led=!led;
MasaoHamanaka 30:ff42cc7a0d55 134 Thread::wait(500);
MasaoHamanaka 30:ff42cc7a0d55 135 }
MasaoHamanaka 30:ff42cc7a0d55 136 }