nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Mon Aug 18 00:59:38 2014 +0000
Revision:
6:e48296dca6bb
Parent:
5:27f193e21222
Child:
7:7e183b33c3f9
improved displaying info.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bkc_mbed 0:2053640461b5 1 #include "mbed.h"
bkc_mbed 0:2053640461b5 2 #include "SDFileSystem.h"
bkc_mbed 0:2053640461b5 3 #include "lcd.h"
bkc_mbed 0:2053640461b5 4
bkc_mbed 6:e48296dca6bb 5 // (pinname, initial value)
bkc_mbed 5:27f193e21222 6 DigitalOut io01(dp13, 0);
bkc_mbed 5:27f193e21222 7 DigitalOut io02(dp26, 0);
bkc_mbed 5:27f193e21222 8 DigitalOut io03(dp17, 0);
bkc_mbed 5:27f193e21222 9 DigitalOut io04(dp4, 0);
bkc_mbed 0:2053640461b5 10
bkc_mbed 6:e48296dca6bb 11 DigitalOut io05(dp18, 0);
bkc_mbed 6:e48296dca6bb 12 DigitalOut io06(dp11, 0);
bkc_mbed 6:e48296dca6bb 13
bkc_mbed 6:e48296dca6bb 14 // (pinname, mode)
bkc_mbed 5:27f193e21222 15 DigitalIn sw_play(dp24, PullUp);
bkc_mbed 5:27f193e21222 16 DigitalIn sw_next(dp10, PullUp);
bkc_mbed 6:e48296dca6bb 17 DigitalIn sw_prev(dp9, PullUp);
bkc_mbed 0:2053640461b5 18
bkc_mbed 6:e48296dca6bb 19 // LED
bkc_mbed 1:ec416e6d5739 20 DigitalOut led1(LED1);
bkc_mbed 1:ec416e6d5739 21 DigitalOut led2(LED2);
bkc_mbed 0:2053640461b5 22
bkc_mbed 6:e48296dca6bb 23 // SPI: MOSI, MISO, SCLK, CS
bkc_mbed 0:2053640461b5 24 SDFileSystem sd(dp2, dp1, dp6, dp25, "sd");
bkc_mbed 0:2053640461b5 25
bkc_mbed 0:2053640461b5 26 //
bkc_mbed 0:2053640461b5 27 // nlg_emb.c
bkc_mbed 0:2053640461b5 28 //
bkc_mbed 0:2053640461b5 29
bkc_mbed 0:2053640461b5 30 #define CMD_PSG 0x00
bkc_mbed 0:2053640461b5 31 #define CMD_OPM 0x01
bkc_mbed 0:2053640461b5 32 #define CMD_OPM2 0x02
bkc_mbed 0:2053640461b5 33 #define CMD_IRQ 0x80
bkc_mbed 0:2053640461b5 34
bkc_mbed 0:2053640461b5 35 #define CMD_CTC0 0x81
bkc_mbed 0:2053640461b5 36 #define CMD_CTC3 0x82
bkc_mbed 0:2053640461b5 37
bkc_mbed 0:2053640461b5 38 #define NLG_VER (110)
bkc_mbed 0:2053640461b5 39 #define NLG_BASECLK (4000000)
bkc_mbed 0:2053640461b5 40
bkc_mbed 0:2053640461b5 41 FILE *nlg_file;
bkc_mbed 0:2053640461b5 42
bkc_mbed 3:aed228fa3ae4 43 char nlg_title[65];
bkc_mbed 0:2053640461b5 44 int nlg_baseclk;
bkc_mbed 0:2053640461b5 45 int nlg_tick;
bkc_mbed 0:2053640461b5 46 int nlg_length;
bkc_mbed 0:2053640461b5 47 int nlg_loop_ptr;
bkc_mbed 0:2053640461b5 48 int nlg_version;
bkc_mbed 0:2053640461b5 49
bkc_mbed 0:2053640461b5 50 int nlg_ctc0;
bkc_mbed 0:2053640461b5 51 int nlg_ctc3;
bkc_mbed 0:2053640461b5 52
bkc_mbed 0:2053640461b5 53 #define RCK io04
bkc_mbed 0:2053640461b5 54 #define SCK io03
bkc_mbed 0:2053640461b5 55 #define DBS io01
bkc_mbed 0:2053640461b5 56 #define CTS io02
bkc_mbed 0:2053640461b5 57
bkc_mbed 3:aed228fa3ae4 58 #define _WAIT for(int wcnt=0; wcnt < 2; wcnt++)
bkc_mbed 2:f0b7779b03c7 59
bkc_mbed 0:2053640461b5 60 // 16bit output
bkc_mbed 0:2053640461b5 61 void ioShiftOut(unsigned int data)
bkc_mbed 0:2053640461b5 62 {
bkc_mbed 0:2053640461b5 63 int i;
bkc_mbed 0:2053640461b5 64
bkc_mbed 0:2053640461b5 65 for(i = 0; i < 8; i++)
bkc_mbed 0:2053640461b5 66 {
bkc_mbed 0:2053640461b5 67 /* 2ビット分のデータをそれぞれ出力 */
bkc_mbed 0:2053640461b5 68 if (data & 0x80)
bkc_mbed 0:2053640461b5 69 CTS = 1;
bkc_mbed 0:2053640461b5 70 else
bkc_mbed 0:2053640461b5 71 CTS = 0;
bkc_mbed 0:2053640461b5 72
bkc_mbed 0:2053640461b5 73 if (data & 0x8000)
bkc_mbed 0:2053640461b5 74 DBS = 1;
bkc_mbed 0:2053640461b5 75 else
bkc_mbed 0:2053640461b5 76 DBS = 0;
bkc_mbed 0:2053640461b5 77
bkc_mbed 0:2053640461b5 78 data <<= 1;
bkc_mbed 0:2053640461b5 79
bkc_mbed 0:2053640461b5 80 SCK = 1;
bkc_mbed 3:aed228fa3ae4 81 // _WAIT;
bkc_mbed 0:2053640461b5 82 SCK = 0;
bkc_mbed 3:aed228fa3ae4 83 // _WAIT;
bkc_mbed 0:2053640461b5 84 }
bkc_mbed 0:2053640461b5 85
bkc_mbed 0:2053640461b5 86 RCK = 1;
bkc_mbed 3:aed228fa3ae4 87 // _WAIT;
bkc_mbed 0:2053640461b5 88 RCK = 0;
bkc_mbed 3:aed228fa3ae4 89 // _WAIT;
bkc_mbed 2:f0b7779b03c7 90 }
bkc_mbed 2:f0b7779b03c7 91
bkc_mbed 2:f0b7779b03c7 92
bkc_mbed 0:2053640461b5 93 /* 制御信号定義 */
bkc_mbed 0:2053640461b5 94 #define CS_PSG (1 << 1)
bkc_mbed 0:2053640461b5 95 #define CS_FM1 (1 << 2)
bkc_mbed 0:2053640461b5 96 #define CS_FM2 (1 << 3)
bkc_mbed 0:2053640461b5 97 #define A0 (1 << 4)
bkc_mbed 0:2053640461b5 98 #define WR (1 << 5)
bkc_mbed 0:2053640461b5 99 #define ICL (1 << 6)
bkc_mbed 0:2053640461b5 100
bkc_mbed 0:2053640461b5 101 /* アクティブローの制御信号 */
bkc_mbed 0:2053640461b5 102 #define ACTLOW (CS_PSG | CS_FM1 | CS_FM2 | WR | ICL)
bkc_mbed 0:2053640461b5 103
bkc_mbed 0:2053640461b5 104
bkc_mbed 0:2053640461b5 105 /* 出力 */
bkc_mbed 0:2053640461b5 106 void regOutBase(int addr, int data,int select)
bkc_mbed 0:2053640461b5 107 {
bkc_mbed 0:2053640461b5 108 /* アドレスを出力 */
bkc_mbed 0:2053640461b5 109 /* A0をローにして待つ */
bkc_mbed 0:2053640461b5 110 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 111 ioShiftOut((addr << 8) | (ACTLOW & ~(select | WR)));
bkc_mbed 0:2053640461b5 112 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 113
bkc_mbed 0:2053640461b5 114
bkc_mbed 0:2053640461b5 115 /* チップ側の処理を待つ */
bkc_mbed 3:aed228fa3ae4 116 // if (!(select & CS_PSG))
bkc_mbed 3:aed228fa3ae4 117 // wait_us(10);
bkc_mbed 0:2053640461b5 118
bkc_mbed 0:2053640461b5 119
bkc_mbed 0:2053640461b5 120 /* データを出力 */
bkc_mbed 0:2053640461b5 121 /* A0をハイにして待つ */
bkc_mbed 0:2053640461b5 122 ioShiftOut((data << 8) | A0 | (ACTLOW));
bkc_mbed 0:2053640461b5 123 ioShiftOut((data << 8) | A0 | (ACTLOW & ~(select | WR)));
bkc_mbed 0:2053640461b5 124 ioShiftOut((data << 8) | A0 | (ACTLOW));
bkc_mbed 0:2053640461b5 125
bkc_mbed 0:2053640461b5 126 /* wait if FM */
bkc_mbed 3:aed228fa3ae4 127 // if (!(select & CS_PSG))
bkc_mbed 3:aed228fa3ae4 128 // wait_us(10);
bkc_mbed 0:2053640461b5 129 }
bkc_mbed 0:2053640461b5 130
bkc_mbed 0:2053640461b5 131 /* PSG出力 */
bkc_mbed 0:2053640461b5 132 void regPSGOut(int addr, int data)
bkc_mbed 0:2053640461b5 133 {
bkc_mbed 0:2053640461b5 134 regOutBase(addr, data, CS_PSG);
bkc_mbed 0:2053640461b5 135 }
bkc_mbed 0:2053640461b5 136
bkc_mbed 0:2053640461b5 137 /* FM2出力 */
bkc_mbed 0:2053640461b5 138 void regFM2Out(int addr, int data)
bkc_mbed 0:2053640461b5 139 {
bkc_mbed 0:2053640461b5 140 regOutBase(addr, data, CS_FM2);
bkc_mbed 0:2053640461b5 141 }
bkc_mbed 0:2053640461b5 142
bkc_mbed 0:2053640461b5 143 /* FM音源にデータを出力 */
bkc_mbed 0:2053640461b5 144 void regFMOut(int addr,int data)
bkc_mbed 0:2053640461b5 145 {
bkc_mbed 0:2053640461b5 146 regOutBase(addr, data, CS_FM1);
bkc_mbed 0:2053640461b5 147 }
bkc_mbed 0:2053640461b5 148
bkc_mbed 0:2053640461b5 149 /* ボード消音 */
bkc_mbed 0:2053640461b5 150 void boardMute(void)
bkc_mbed 0:2053640461b5 151 {
bkc_mbed 0:2053640461b5 152 int i;
bkc_mbed 0:2053640461b5 153
bkc_mbed 0:2053640461b5 154 /* PSG初期化 */
bkc_mbed 0:2053640461b5 155 regPSGOut(0x00,0);
bkc_mbed 0:2053640461b5 156 regPSGOut(0x01,0);
bkc_mbed 0:2053640461b5 157
bkc_mbed 3:aed228fa3ae4 158 regPSGOut(0x06, 0x00);
bkc_mbed 3:aed228fa3ae4 159 regPSGOut(0x07, 0x3f); // ALL OFF
bkc_mbed 3:aed228fa3ae4 160 regPSGOut(0x08, 0x00); // CH.A 0
bkc_mbed 3:aed228fa3ae4 161 regPSGOut(0x09, 0x00); // CH.B 0
bkc_mbed 3:aed228fa3ae4 162 regPSGOut(0x0a, 0x00); // CH.C 0
bkc_mbed 0:2053640461b5 163
bkc_mbed 0:2053640461b5 164 /* FM音源初期化 */
bkc_mbed 0:2053640461b5 165 for(i = 0x20; i < 0x28; i++)
bkc_mbed 3:aed228fa3ae4 166 {
bkc_mbed 0:2053640461b5 167 regFMOut(i, 0x00);
bkc_mbed 3:aed228fa3ae4 168 regFM2Out(i, 0x00);
bkc_mbed 3:aed228fa3ae4 169 }
bkc_mbed 0:2053640461b5 170
bkc_mbed 4:4dc67a366727 171 // key off
bkc_mbed 3:aed228fa3ae4 172 for(i = 0x00; i < 0x08; i++)
bkc_mbed 3:aed228fa3ae4 173 {
bkc_mbed 3:aed228fa3ae4 174 regFMOut(0x08, i & 0x07);
bkc_mbed 3:aed228fa3ae4 175 regFM2Out(0x08, i & 0x07);
bkc_mbed 3:aed228fa3ae4 176 }
bkc_mbed 0:2053640461b5 177 }
bkc_mbed 0:2053640461b5 178
bkc_mbed 0:2053640461b5 179
bkc_mbed 0:2053640461b5 180 /* ボード初期化 */
bkc_mbed 0:2053640461b5 181 void boardInit(void)
bkc_mbed 0:2053640461b5 182 {
bkc_mbed 1:ec416e6d5739 183 wait_ms(20);
bkc_mbed 0:2053640461b5 184 /* ICLのみをLOW(アクティブ)にする */
bkc_mbed 0:2053640461b5 185 ioShiftOut(ACTLOW & ~(ICL));
bkc_mbed 6:e48296dca6bb 186 wait_ms(150);
bkc_mbed 0:2053640461b5 187
bkc_mbed 0:2053640461b5 188 /* 元に戻す */
bkc_mbed 0:2053640461b5 189 ioShiftOut(ACTLOW);
bkc_mbed 1:ec416e6d5739 190 wait_ms(10);
bkc_mbed 0:2053640461b5 191 }
bkc_mbed 0:2053640461b5 192
bkc_mbed 0:2053640461b5 193 typedef unsigned char byte;
bkc_mbed 0:2053640461b5 194 typedef unsigned short word;
bkc_mbed 0:2053640461b5 195 typedef unsigned long dword;
bkc_mbed 0:2053640461b5 196
bkc_mbed 0:2053640461b5 197
bkc_mbed 0:2053640461b5 198 // 変数書き出し(WORD)
bkc_mbed 0:2053640461b5 199 void WriteWORD(byte *p,word val)
bkc_mbed 0:2053640461b5 200 {
bkc_mbed 0:2053640461b5 201 p[0] = (val & 0xff);
bkc_mbed 0:2053640461b5 202 p[1] = ((val>>8) & 0xff);
bkc_mbed 0:2053640461b5 203 }
bkc_mbed 0:2053640461b5 204
bkc_mbed 0:2053640461b5 205 // 変数書き出し(DWORD)
bkc_mbed 0:2053640461b5 206 void WriteDWORD(byte *p,dword val)
bkc_mbed 0:2053640461b5 207 {
bkc_mbed 0:2053640461b5 208 p[0] = (val & 0xff);
bkc_mbed 0:2053640461b5 209 p[1] = ((val>>8) & 0xff);
bkc_mbed 0:2053640461b5 210 p[2] = ((val>>16) & 0xff);
bkc_mbed 0:2053640461b5 211 p[3] = ((val>>24) & 0xff);
bkc_mbed 0:2053640461b5 212 }
bkc_mbed 0:2053640461b5 213
bkc_mbed 0:2053640461b5 214 // 変数読み出し(WORD)
bkc_mbed 0:2053640461b5 215 word ReadWORD(byte *p)
bkc_mbed 0:2053640461b5 216 {
bkc_mbed 0:2053640461b5 217 return
bkc_mbed 0:2053640461b5 218 ((word)p[0]) |
bkc_mbed 0:2053640461b5 219 ((word)p[1])<<8;
bkc_mbed 0:2053640461b5 220 }
bkc_mbed 0:2053640461b5 221
bkc_mbed 0:2053640461b5 222 // 変数読み出し(DWORD)
bkc_mbed 0:2053640461b5 223 dword ReadDWORD(byte *p)
bkc_mbed 0:2053640461b5 224 {
bkc_mbed 0:2053640461b5 225 return
bkc_mbed 0:2053640461b5 226 ((dword)p[0]) |
bkc_mbed 0:2053640461b5 227 ((dword)p[1])<<8 |
bkc_mbed 0:2053640461b5 228 ((dword)p[2])<<16 |
bkc_mbed 0:2053640461b5 229 ((dword)p[3])<<24;
bkc_mbed 0:2053640461b5 230 }
bkc_mbed 0:2053640461b5 231
bkc_mbed 0:2053640461b5 232 // NLGファイルを開く
bkc_mbed 0:2053640461b5 233 int OpenNLG(const char *file)
bkc_mbed 0:2053640461b5 234 {
bkc_mbed 3:aed228fa3ae4 235 byte nlg_hdr[0x60];
bkc_mbed 1:ec416e6d5739 236
bkc_mbed 0:2053640461b5 237 nlg_file = fopen(file, "rb");
bkc_mbed 0:2053640461b5 238
bkc_mbed 0:2053640461b5 239 if (!nlg_file)
bkc_mbed 0:2053640461b5 240 {
bkc_mbed 0:2053640461b5 241 printf("File open error:%s\n", file);
bkc_mbed 0:2053640461b5 242 return -1;
bkc_mbed 0:2053640461b5 243 }
bkc_mbed 0:2053640461b5 244
bkc_mbed 0:2053640461b5 245 fread(nlg_hdr, 0x60, 1, nlg_file);
bkc_mbed 0:2053640461b5 246
bkc_mbed 6:e48296dca6bb 247 if (memcmp(nlg_hdr, "NLG1", 4) != 0)
bkc_mbed 0:2053640461b5 248 {
bkc_mbed 0:2053640461b5 249 printf("Unknown format!\n");
bkc_mbed 0:2053640461b5 250 fclose(nlg_file);
bkc_mbed 0:2053640461b5 251 return -1;
bkc_mbed 0:2053640461b5 252 }
bkc_mbed 0:2053640461b5 253
bkc_mbed 0:2053640461b5 254 nlg_version = ReadWORD(nlg_hdr + 4);
bkc_mbed 0:2053640461b5 255
bkc_mbed 0:2053640461b5 256 memcpy(nlg_title, nlg_hdr + 8, 64);
bkc_mbed 0:2053640461b5 257 nlg_title[64]=0;
bkc_mbed 0:2053640461b5 258
bkc_mbed 0:2053640461b5 259 nlg_baseclk = ReadDWORD(nlg_hdr + 72);
bkc_mbed 0:2053640461b5 260 nlg_tick = ReadDWORD(nlg_hdr + 76);
bkc_mbed 0:2053640461b5 261
bkc_mbed 0:2053640461b5 262 nlg_length = ReadDWORD(nlg_hdr + 88);
bkc_mbed 0:2053640461b5 263 nlg_loop_ptr = (long)ReadDWORD(nlg_hdr + 92);
bkc_mbed 0:2053640461b5 264
bkc_mbed 0:2053640461b5 265 fseek(nlg_file, 0x60, SEEK_SET);
bkc_mbed 0:2053640461b5 266
bkc_mbed 0:2053640461b5 267 nlg_ctc0 = nlg_ctc3 = 0;
bkc_mbed 0:2053640461b5 268
bkc_mbed 0:2053640461b5 269 return 0;
bkc_mbed 0:2053640461b5 270 }
bkc_mbed 0:2053640461b5 271
bkc_mbed 2:f0b7779b03c7 272 #if 0
bkc_mbed 2:f0b7779b03c7 273
bkc_mbed 0:2053640461b5 274 // 書き込み用NLGファイルを開く
bkc_mbed 0:2053640461b5 275 int CreateNLG(const char *file)
bkc_mbed 0:2053640461b5 276 {
bkc_mbed 0:2053640461b5 277 byte hdr[0x80];
bkc_mbed 0:2053640461b5 278
bkc_mbed 0:2053640461b5 279 nlg_file = fopen(file, "wb");
bkc_mbed 0:2053640461b5 280
bkc_mbed 0:2053640461b5 281 if (!nlg_file)
bkc_mbed 0:2053640461b5 282 {
bkc_mbed 0:2053640461b5 283 printf("File open error:%s\n", file);
bkc_mbed 0:2053640461b5 284 return -1;
bkc_mbed 0:2053640461b5 285 }
bkc_mbed 0:2053640461b5 286
bkc_mbed 0:2053640461b5 287 memset(hdr, 0, 0x80);
bkc_mbed 0:2053640461b5 288 memcpy(hdr,"NLG1",4);
bkc_mbed 0:2053640461b5 289
bkc_mbed 0:2053640461b5 290 WriteWORD(hdr + 4, NLG_VER); // Version
bkc_mbed 0:2053640461b5 291 WriteDWORD(hdr + 72, NLG_BASECLK); // BaseCLK
bkc_mbed 0:2053640461b5 292 WriteDWORD(hdr + 76, 0); // Tick
bkc_mbed 0:2053640461b5 293 WriteDWORD(hdr + 88, 0); // Length
bkc_mbed 0:2053640461b5 294 WriteDWORD(hdr + 92, 0); // Loop Pointer
bkc_mbed 0:2053640461b5 295
bkc_mbed 0:2053640461b5 296 fwrite(hdr, 0x60, 1, nlg_file);
bkc_mbed 0:2053640461b5 297
bkc_mbed 0:2053640461b5 298 nlg_ctc0 = nlg_ctc3 = 0;
bkc_mbed 0:2053640461b5 299
bkc_mbed 0:2053640461b5 300 return 0;
bkc_mbed 0:2053640461b5 301 }
bkc_mbed 0:2053640461b5 302
bkc_mbed 0:2053640461b5 303
bkc_mbed 0:2053640461b5 304 // コマンドの書き込み
bkc_mbed 0:2053640461b5 305 void WriteNLG_CMD(int cmd)
bkc_mbed 0:2053640461b5 306 {
bkc_mbed 0:2053640461b5 307 if (!nlg_file)
bkc_mbed 0:2053640461b5 308 return;
bkc_mbed 0:2053640461b5 309
bkc_mbed 0:2053640461b5 310 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 311 }
bkc_mbed 0:2053640461b5 312
bkc_mbed 0:2053640461b5 313 // CTC定数の書き込み
bkc_mbed 0:2053640461b5 314 void WriteNLG_CTC(int cmd,int ctc)
bkc_mbed 0:2053640461b5 315 {
bkc_mbed 0:2053640461b5 316 if (!nlg_file)
bkc_mbed 0:2053640461b5 317 return;
bkc_mbed 0:2053640461b5 318
bkc_mbed 0:2053640461b5 319 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 320 fputc(ctc, nlg_file);
bkc_mbed 0:2053640461b5 321 }
bkc_mbed 0:2053640461b5 322
bkc_mbed 0:2053640461b5 323 // データの書き込み
bkc_mbed 0:2053640461b5 324 void WriteNLG_Data(int cmd,int addr,int data)
bkc_mbed 0:2053640461b5 325 {
bkc_mbed 0:2053640461b5 326 if (!nlg_file)
bkc_mbed 0:2053640461b5 327 return;
bkc_mbed 0:2053640461b5 328
bkc_mbed 0:2053640461b5 329 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 330 fputc(addr, nlg_file);
bkc_mbed 0:2053640461b5 331 fputc(data, nlg_file);
bkc_mbed 0:2053640461b5 332 }
bkc_mbed 0:2053640461b5 333
bkc_mbed 2:f0b7779b03c7 334 #endif
bkc_mbed 2:f0b7779b03c7 335
bkc_mbed 2:f0b7779b03c7 336 // ファイルを閉じる
bkc_mbed 2:f0b7779b03c7 337 void CloseNLG(void)
bkc_mbed 2:f0b7779b03c7 338 {
bkc_mbed 2:f0b7779b03c7 339 if (!nlg_file)
bkc_mbed 2:f0b7779b03c7 340 return;
bkc_mbed 2:f0b7779b03c7 341
bkc_mbed 2:f0b7779b03c7 342 fclose(nlg_file);
bkc_mbed 2:f0b7779b03c7 343 #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
bkc_mbed 2:f0b7779b03c7 344 free(nlg_file);
bkc_mbed 2:f0b7779b03c7 345 #endif
bkc_mbed 2:f0b7779b03c7 346
bkc_mbed 2:f0b7779b03c7 347 nlg_file = NULL;
bkc_mbed 2:f0b7779b03c7 348 }
bkc_mbed 2:f0b7779b03c7 349
bkc_mbed 0:2053640461b5 350 // データの読み出し
bkc_mbed 0:2053640461b5 351 int ReadNLG(void)
bkc_mbed 0:2053640461b5 352 {
bkc_mbed 0:2053640461b5 353 return fgetc(nlg_file);
bkc_mbed 0:2053640461b5 354 }
bkc_mbed 0:2053640461b5 355
bkc_mbed 0:2053640461b5 356 // ファイルポインタの位置を取得
bkc_mbed 0:2053640461b5 357 long TellNLG(void)
bkc_mbed 0:2053640461b5 358 {
bkc_mbed 0:2053640461b5 359 return ftell(nlg_file);
bkc_mbed 0:2053640461b5 360 }
bkc_mbed 0:2053640461b5 361
bkc_mbed 0:2053640461b5 362 // ファイルポインタの位置を設定
bkc_mbed 0:2053640461b5 363 void SeekNLG(long pos)
bkc_mbed 0:2053640461b5 364 {
bkc_mbed 0:2053640461b5 365 fseek(nlg_file, pos, SEEK_SET);
bkc_mbed 0:2053640461b5 366 }
bkc_mbed 0:2053640461b5 367
bkc_mbed 0:2053640461b5 368 // タイトルの取得
bkc_mbed 0:2053640461b5 369 char *GetTitleNLG(void)
bkc_mbed 0:2053640461b5 370 {
bkc_mbed 0:2053640461b5 371 return nlg_title;
bkc_mbed 0:2053640461b5 372 }
bkc_mbed 0:2053640461b5 373
bkc_mbed 0:2053640461b5 374 // ティックの取得
bkc_mbed 0:2053640461b5 375 int GetTickNLG(void)
bkc_mbed 0:2053640461b5 376 {
bkc_mbed 0:2053640461b5 377 return nlg_tick;
bkc_mbed 0:2053640461b5 378 }
bkc_mbed 0:2053640461b5 379
bkc_mbed 3:aed228fa3ae4 380 // Set Tick
bkc_mbed 3:aed228fa3ae4 381 inline void SetTick(void)
bkc_mbed 3:aed228fa3ae4 382 {
bkc_mbed 3:aed228fa3ae4 383 nlg_tick = ((nlg_ctc0 * 256) * nlg_ctc3);
bkc_mbed 3:aed228fa3ae4 384 // printf("nlg_tick=%d\n", nlg_tick);
bkc_mbed 3:aed228fa3ae4 385 }
bkc_mbed 3:aed228fa3ae4 386
bkc_mbed 0:2053640461b5 387 // CTC0値の設定
bkc_mbed 0:2053640461b5 388 void SetCTC0_NLG(int value)
bkc_mbed 0:2053640461b5 389 {
bkc_mbed 0:2053640461b5 390 nlg_ctc0 = value;
bkc_mbed 3:aed228fa3ae4 391 SetTick();
bkc_mbed 0:2053640461b5 392 }
bkc_mbed 0:2053640461b5 393
bkc_mbed 0:2053640461b5 394 // CTC3値の設定
bkc_mbed 0:2053640461b5 395 void SetCTC3_NLG(int value)
bkc_mbed 0:2053640461b5 396 {
bkc_mbed 0:2053640461b5 397 nlg_ctc3 = value;
bkc_mbed 3:aed228fa3ae4 398 SetTick();
bkc_mbed 0:2053640461b5 399 }
bkc_mbed 0:2053640461b5 400
bkc_mbed 0:2053640461b5 401 // 曲の長さを得る
bkc_mbed 0:2053640461b5 402 int GetLengthNLG(void)
bkc_mbed 0:2053640461b5 403 {
bkc_mbed 0:2053640461b5 404 return nlg_length;
bkc_mbed 0:2053640461b5 405 }
bkc_mbed 0:2053640461b5 406
bkc_mbed 0:2053640461b5 407 // ループポインタを得る
bkc_mbed 0:2053640461b5 408 int GetLoopPtrNLG(void)
bkc_mbed 0:2053640461b5 409 {
bkc_mbed 0:2053640461b5 410 return nlg_loop_ptr;
bkc_mbed 0:2053640461b5 411 }
bkc_mbed 0:2053640461b5 412
bkc_mbed 0:2053640461b5 413 // ベースクロックを得る
bkc_mbed 0:2053640461b5 414 int GetBaseClkNLG(void)
bkc_mbed 0:2053640461b5 415 {
bkc_mbed 0:2053640461b5 416 return nlg_baseclk;
bkc_mbed 0:2053640461b5 417 }
bkc_mbed 0:2053640461b5 418
bkc_mbed 0:2053640461b5 419 #define CMD_PSG 0x00
bkc_mbed 0:2053640461b5 420 #define CMD_OPM 0x01
bkc_mbed 0:2053640461b5 421 #define CMD_OPM2 0x02
bkc_mbed 0:2053640461b5 422 #define CMD_IRQ 0x80
bkc_mbed 0:2053640461b5 423
bkc_mbed 0:2053640461b5 424 #define CMD_CTC0 0x81
bkc_mbed 0:2053640461b5 425 #define CMD_CTC3 0x82
bkc_mbed 0:2053640461b5 426
bkc_mbed 0:2053640461b5 427
bkc_mbed 0:2053640461b5 428 /* 単位を扱いやすいように */
bkc_mbed 0:2053640461b5 429 typedef unsigned char byte;
bkc_mbed 0:2053640461b5 430 typedef unsigned short word;
bkc_mbed 0:2053640461b5 431 typedef unsigned long dword;
bkc_mbed 0:2053640461b5 432
bkc_mbed 0:2053640461b5 433 /* NLGを処理するための構造体 */
bkc_mbed 0:2053640461b5 434 typedef struct
bkc_mbed 0:2053640461b5 435 {
bkc_mbed 0:2053640461b5 436 int base_clk;
bkc_mbed 0:2053640461b5 437 int clk_per_sample;
bkc_mbed 0:2053640461b5 438
bkc_mbed 0:2053640461b5 439 int freeze;
bkc_mbed 0:2053640461b5 440 int total_samples;
bkc_mbed 0:2053640461b5 441
bkc_mbed 0:2053640461b5 442 int total_sec;
bkc_mbed 0:2053640461b5 443
bkc_mbed 0:2053640461b5 444 int current_samples;
bkc_mbed 0:2053640461b5 445 int tick;
bkc_mbed 0:2053640461b5 446 int tick_sec;
bkc_mbed 0:2053640461b5 447
bkc_mbed 0:2053640461b5 448 int irq_count;
bkc_mbed 0:2053640461b5 449 int irq_loop;
bkc_mbed 0:2053640461b5 450 long loop_address;
bkc_mbed 2:f0b7779b03c7 451
bkc_mbed 1:ec416e6d5739 452 int irq_counter;
bkc_mbed 1:ec416e6d5739 453 int irq_counter2;
bkc_mbed 1:ec416e6d5739 454
bkc_mbed 0:2053640461b5 455 } NLG_R;
bkc_mbed 0:2053640461b5 456
bkc_mbed 0:2053640461b5 457
bkc_mbed 0:2053640461b5 458 /* 初期化 */
bkc_mbed 0:2053640461b5 459 int initNLG(NLG_R *np, const char *nlg_name)
bkc_mbed 0:2053640461b5 460 {
bkc_mbed 0:2053640461b5 461 if (OpenNLG(nlg_name) < 0)
bkc_mbed 0:2053640461b5 462 return -1;
bkc_mbed 0:2053640461b5 463
bkc_mbed 0:2053640461b5 464 np->base_clk = GetBaseClkNLG();
bkc_mbed 0:2053640461b5 465
bkc_mbed 0:2053640461b5 466 /* printf("Title:%s %d %d %dsec %d\n",
bkc_mbed 0:2053640461b5 467 GetTitleNLG(),
bkc_mbed 0:2053640461b5 468 GetBaseClkNLG(),
bkc_mbed 0:2053640461b5 469 GetTickNLG(),
bkc_mbed 0:2053640461b5 470 GetLengthNLG(),
bkc_mbed 0:2053640461b5 471 GetLoopPtrNLG());
bkc_mbed 0:2053640461b5 472 */
bkc_mbed 0:2053640461b5 473
bkc_mbed 0:2053640461b5 474 np->total_samples = 0;
bkc_mbed 0:2053640461b5 475 np->current_samples = 0;
bkc_mbed 0:2053640461b5 476
bkc_mbed 0:2053640461b5 477 np->total_sec = 0;
bkc_mbed 0:2053640461b5 478
bkc_mbed 0:2053640461b5 479 np->tick = 0;
bkc_mbed 0:2053640461b5 480 np->tick_sec = 0;
bkc_mbed 0:2053640461b5 481
bkc_mbed 0:2053640461b5 482 np->freeze = 0;
bkc_mbed 0:2053640461b5 483
bkc_mbed 0:2053640461b5 484 np->irq_count = 0;
bkc_mbed 0:2053640461b5 485 np->irq_loop = GetLoopPtrNLG();
bkc_mbed 0:2053640461b5 486 np->loop_address = -1;
bkc_mbed 2:f0b7779b03c7 487
bkc_mbed 1:ec416e6d5739 488 np->irq_counter = 0;
bkc_mbed 1:ec416e6d5739 489 np->irq_counter2 = 0;
bkc_mbed 0:2053640461b5 490
bkc_mbed 0:2053640461b5 491 return 0;
bkc_mbed 0:2053640461b5 492 }
bkc_mbed 0:2053640461b5 493
bkc_mbed 0:2053640461b5 494 /* PSGへの出力 */
bkc_mbed 0:2053640461b5 495 void WritePSG(int addr,int value)
bkc_mbed 0:2053640461b5 496 {
bkc_mbed 0:2053640461b5 497 regPSGOut(addr, value);
bkc_mbed 0:2053640461b5 498 }
bkc_mbed 0:2053640461b5 499
bkc_mbed 0:2053640461b5 500 /* FM1への出力 */
bkc_mbed 0:2053640461b5 501 void WriteOPM(int addr,int value)
bkc_mbed 0:2053640461b5 502 {
bkc_mbed 0:2053640461b5 503 regFMOut(addr, value);
bkc_mbed 0:2053640461b5 504 }
bkc_mbed 0:2053640461b5 505
bkc_mbed 0:2053640461b5 506 /* FM2への出力 */
bkc_mbed 0:2053640461b5 507 void WriteOPM2(int addr,int value)
bkc_mbed 0:2053640461b5 508 {
bkc_mbed 0:2053640461b5 509 regFM2Out(addr, value);
bkc_mbed 0:2053640461b5 510 }
bkc_mbed 0:2053640461b5 511
bkc_mbed 6:e48296dca6bb 512 // stop flag
bkc_mbed 6:e48296dca6bb 513 bool g_stop = false;
bkc_mbed 6:e48296dca6bb 514 bool g_prev = false;
bkc_mbed 0:2053640461b5 515
bkc_mbed 0:2053640461b5 516 void DispNLG(NLG_R *np)
bkc_mbed 0:2053640461b5 517 {
bkc_mbed 1:ec416e6d5739 518 // printf("Time %02d:%02d\r",np->total_sec / 60, np->total_sec % 60);
bkc_mbed 1:ec416e6d5739 519 // fflush(stdout);
bkc_mbed 0:2053640461b5 520
bkc_mbed 0:2053640461b5 521 char buf[16];
bkc_mbed 2:f0b7779b03c7 522 sprintf(buf, "%02d:%02d",
bkc_mbed 2:f0b7779b03c7 523 np->total_sec / 60,
bkc_mbed 2:f0b7779b03c7 524 np->total_sec % 60);
bkc_mbed 0:2053640461b5 525
bkc_mbed 2:f0b7779b03c7 526 lcd_setCursor(3,1);
bkc_mbed 2:f0b7779b03c7 527 lcd_printStr(buf);
bkc_mbed 0:2053640461b5 528 }
bkc_mbed 0:2053640461b5 529
bkc_mbed 6:e48296dca6bb 530 // wait until release buttons
bkc_mbed 6:e48296dca6bb 531 void waitButtonRelease(void)
bkc_mbed 6:e48296dca6bb 532 {
bkc_mbed 6:e48296dca6bb 533 while(!sw_next || !sw_play || !sw_prev);
bkc_mbed 6:e48296dca6bb 534 }
bkc_mbed 6:e48296dca6bb 535
bkc_mbed 6:e48296dca6bb 536 // wait until press buttons
bkc_mbed 6:e48296dca6bb 537 void waitButtonPress(void)
bkc_mbed 6:e48296dca6bb 538 {
bkc_mbed 6:e48296dca6bb 539 while(sw_next && sw_play && sw_prev);
bkc_mbed 6:e48296dca6bb 540 }
bkc_mbed 6:e48296dca6bb 541
bkc_mbed 0:2053640461b5 542 /* NLGの再生 */
bkc_mbed 0:2053640461b5 543 int PlayNLG(NLG_R *np, int sec)
bkc_mbed 0:2053640461b5 544 {
bkc_mbed 0:2053640461b5 545 int cmd;
bkc_mbed 0:2053640461b5 546 int addr, data;
bkc_mbed 0:2053640461b5 547 int result = 0;
bkc_mbed 0:2053640461b5 548
bkc_mbed 0:2053640461b5 549 int tick;
bkc_mbed 0:2053640461b5 550 int total_us = 0;
bkc_mbed 0:2053640461b5 551 int us_tick = np->base_clk / 1000000;
bkc_mbed 0:2053640461b5 552
bkc_mbed 2:f0b7779b03c7 553 printf("start play\n");
bkc_mbed 0:2053640461b5 554 Timer t;
bkc_mbed 0:2053640461b5 555
bkc_mbed 0:2053640461b5 556 t.start();
bkc_mbed 0:2053640461b5 557 total_us = 0;
bkc_mbed 0:2053640461b5 558
bkc_mbed 0:2053640461b5 559 // wait until release buttons
bkc_mbed 6:e48296dca6bb 560 waitButtonRelease();
bkc_mbed 0:2053640461b5 561
bkc_mbed 0:2053640461b5 562 DispNLG(np);
bkc_mbed 0:2053640461b5 563
bkc_mbed 0:2053640461b5 564 while(np->total_sec < sec && !g_stop)
bkc_mbed 0:2053640461b5 565 {
bkc_mbed 0:2053640461b5 566 // push next
bkc_mbed 0:2053640461b5 567 if (!sw_next)
bkc_mbed 0:2053640461b5 568 break;
bkc_mbed 6:e48296dca6bb 569
bkc_mbed 6:e48296dca6bb 570 // push prev
bkc_mbed 6:e48296dca6bb 571 if (!sw_prev)
bkc_mbed 6:e48296dca6bb 572 {
bkc_mbed 6:e48296dca6bb 573 g_prev = true;
bkc_mbed 6:e48296dca6bb 574 break;
bkc_mbed 6:e48296dca6bb 575 }
bkc_mbed 0:2053640461b5 576
bkc_mbed 0:2053640461b5 577 // push play
bkc_mbed 0:2053640461b5 578 if (!sw_play)
bkc_mbed 0:2053640461b5 579 {
bkc_mbed 6:e48296dca6bb 580 g_stop = true;
bkc_mbed 0:2053640461b5 581 break;
bkc_mbed 0:2053640461b5 582 }
bkc_mbed 0:2053640461b5 583
bkc_mbed 0:2053640461b5 584 /* ウエイトの処理 */
bkc_mbed 0:2053640461b5 585 while (np->tick >= us_tick)
bkc_mbed 0:2053640461b5 586 {
bkc_mbed 0:2053640461b5 587 int us = np->tick / us_tick;
bkc_mbed 0:2053640461b5 588 np->tick -= (us * us_tick);
bkc_mbed 0:2053640461b5 589
bkc_mbed 0:2053640461b5 590 while(t.read_us() < total_us + us);
bkc_mbed 3:aed228fa3ae4 591
bkc_mbed 0:2053640461b5 592 total_us += us;
bkc_mbed 0:2053640461b5 593
bkc_mbed 3:aed228fa3ae4 594 // reset timer
bkc_mbed 0:2053640461b5 595 if (total_us >= 1000000)
bkc_mbed 0:2053640461b5 596 {
bkc_mbed 0:2053640461b5 597 total_us -= t.read_us();
bkc_mbed 0:2053640461b5 598 t.reset();
bkc_mbed 0:2053640461b5 599 }
bkc_mbed 0:2053640461b5 600 // DELAY_NEXT(us);
bkc_mbed 0:2053640461b5 601
bkc_mbed 0:2053640461b5 602 // printf("delay : %dus\n",us);
bkc_mbed 0:2053640461b5 603 }
bkc_mbed 0:2053640461b5 604
bkc_mbed 0:2053640461b5 605 /* コマンドの読み出し */
bkc_mbed 0:2053640461b5 606 cmd = ReadNLG();
bkc_mbed 0:2053640461b5 607 if (cmd == EOF)
bkc_mbed 0:2053640461b5 608 {
bkc_mbed 0:2053640461b5 609 if (np->loop_address >= 0)
bkc_mbed 0:2053640461b5 610 {
bkc_mbed 0:2053640461b5 611 SeekNLG(np->loop_address);
bkc_mbed 0:2053640461b5 612 cmd = ReadNLG();
bkc_mbed 0:2053640461b5 613 }
bkc_mbed 0:2053640461b5 614 else
bkc_mbed 0:2053640461b5 615 {
bkc_mbed 0:2053640461b5 616 result = EOF;
bkc_mbed 0:2053640461b5 617 break;
bkc_mbed 0:2053640461b5 618 }
bkc_mbed 0:2053640461b5 619 }
bkc_mbed 0:2053640461b5 620
bkc_mbed 0:2053640461b5 621 /* コマンドの処理 */
bkc_mbed 0:2053640461b5 622 switch (cmd)
bkc_mbed 0:2053640461b5 623 {
bkc_mbed 0:2053640461b5 624 case CMD_PSG:
bkc_mbed 0:2053640461b5 625 addr = ReadNLG();
bkc_mbed 0:2053640461b5 626 data = ReadNLG();
bkc_mbed 0:2053640461b5 627 WritePSG(addr, data);
bkc_mbed 0:2053640461b5 628 break;
bkc_mbed 0:2053640461b5 629 case CMD_OPM:
bkc_mbed 0:2053640461b5 630 addr = ReadNLG();
bkc_mbed 0:2053640461b5 631 data = ReadNLG();
bkc_mbed 0:2053640461b5 632 WriteOPM(addr, data);
bkc_mbed 0:2053640461b5 633 break;
bkc_mbed 0:2053640461b5 634 case CMD_OPM2:
bkc_mbed 0:2053640461b5 635 addr = ReadNLG();
bkc_mbed 0:2053640461b5 636 data = ReadNLG();
bkc_mbed 0:2053640461b5 637 WriteOPM2(addr, data);
bkc_mbed 0:2053640461b5 638 break;
bkc_mbed 0:2053640461b5 639 case CMD_IRQ:
bkc_mbed 0:2053640461b5 640 tick = GetTickNLG();
bkc_mbed 0:2053640461b5 641 np->tick_sec += tick;
bkc_mbed 0:2053640461b5 642 np->tick += tick;
bkc_mbed 0:2053640461b5 643 np->irq_count++;
bkc_mbed 0:2053640461b5 644 if (np->irq_count == np->irq_loop)
bkc_mbed 0:2053640461b5 645 {
bkc_mbed 0:2053640461b5 646 /* ループ位置の設定 */
bkc_mbed 0:2053640461b5 647 np->loop_address = TellNLG();
bkc_mbed 0:2053640461b5 648 np->loop_address -= 1;
bkc_mbed 0:2053640461b5 649 }
bkc_mbed 1:ec416e6d5739 650 np->irq_counter++;
bkc_mbed 1:ec416e6d5739 651 if (np->irq_counter >= 48)
bkc_mbed 1:ec416e6d5739 652 {
bkc_mbed 1:ec416e6d5739 653 np->irq_counter = 0;
bkc_mbed 1:ec416e6d5739 654 led1 = !led1;
bkc_mbed 1:ec416e6d5739 655
bkc_mbed 1:ec416e6d5739 656 np->irq_counter2++;
bkc_mbed 1:ec416e6d5739 657 if (np->irq_counter2 >= 4)
bkc_mbed 1:ec416e6d5739 658 {
bkc_mbed 1:ec416e6d5739 659 np->irq_counter2 = 0;
bkc_mbed 1:ec416e6d5739 660 led2 = !led2;
bkc_mbed 1:ec416e6d5739 661 }
bkc_mbed 1:ec416e6d5739 662 }
bkc_mbed 0:2053640461b5 663 break;
bkc_mbed 0:2053640461b5 664 case CMD_CTC0:
bkc_mbed 0:2053640461b5 665 SetCTC0_NLG(ReadNLG());
bkc_mbed 0:2053640461b5 666 break;
bkc_mbed 0:2053640461b5 667 case CMD_CTC3:
bkc_mbed 0:2053640461b5 668 SetCTC3_NLG(ReadNLG());
bkc_mbed 0:2053640461b5 669 break;
bkc_mbed 0:2053640461b5 670
bkc_mbed 0:2053640461b5 671 }
bkc_mbed 0:2053640461b5 672 /* 秒情報の表示 */
bkc_mbed 0:2053640461b5 673 while (np->tick_sec >= np->base_clk)
bkc_mbed 0:2053640461b5 674 {
bkc_mbed 0:2053640461b5 675 np->tick_sec -= np->base_clk;
bkc_mbed 0:2053640461b5 676 np->total_sec++;
bkc_mbed 0:2053640461b5 677
bkc_mbed 0:2053640461b5 678 DispNLG(np);
bkc_mbed 0:2053640461b5 679 }
bkc_mbed 0:2053640461b5 680 }
bkc_mbed 0:2053640461b5 681
bkc_mbed 0:2053640461b5 682 return result;
bkc_mbed 0:2053640461b5 683 }
bkc_mbed 0:2053640461b5 684
bkc_mbed 0:2053640461b5 685 NLG_R n;
bkc_mbed 0:2053640461b5 686
bkc_mbed 2:f0b7779b03c7 687 int nlg_play(const char *nlg_file)
bkc_mbed 0:2053640461b5 688 {
bkc_mbed 1:ec416e6d5739 689 printf("nlg_play:%s\n",nlg_file);
bkc_mbed 0:2053640461b5 690
bkc_mbed 0:2053640461b5 691 /* NLGの初期化 */
bkc_mbed 0:2053640461b5 692 if (initNLG(&n, nlg_file) < 0)
bkc_mbed 0:2053640461b5 693 {
bkc_mbed 0:2053640461b5 694 lcd_setCursor(0,1);
bkc_mbed 0:2053640461b5 695 lcd_printStr("ERROR!!");
bkc_mbed 0:2053640461b5 696
bkc_mbed 0:2053640461b5 697 printf("Failed to init.\n");
bkc_mbed 0:2053640461b5 698 return -1;
bkc_mbed 0:2053640461b5 699 }
bkc_mbed 2:f0b7779b03c7 700
bkc_mbed 2:f0b7779b03c7 701 printf("Play..\n");
bkc_mbed 1:ec416e6d5739 702
bkc_mbed 0:2053640461b5 703 /* 再生する */
bkc_mbed 0:2053640461b5 704 PlayNLG(&n, 360);
bkc_mbed 0:2053640461b5 705
bkc_mbed 6:e48296dca6bb 706 /* mute */
bkc_mbed 0:2053640461b5 707 boardMute();
bkc_mbed 0:2053640461b5 708
bkc_mbed 0:2053640461b5 709 /* NLGファイルを閉じる */
bkc_mbed 0:2053640461b5 710 CloseNLG();
bkc_mbed 0:2053640461b5 711
bkc_mbed 0:2053640461b5 712 return 0;
bkc_mbed 0:2053640461b5 713 }
bkc_mbed 0:2053640461b5 714
bkc_mbed 6:e48296dca6bb 715 int get_nlg_file(char *dest, int index)
bkc_mbed 0:2053640461b5 716 {
bkc_mbed 0:2053640461b5 717 char *cwd = "/sd/";
bkc_mbed 0:2053640461b5 718 int count = -1;
bkc_mbed 0:2053640461b5 719 DIR *dir = opendir(cwd);
bkc_mbed 0:2053640461b5 720
bkc_mbed 0:2053640461b5 721 dest[0] = 0;
bkc_mbed 0:2053640461b5 722
bkc_mbed 0:2053640461b5 723 if (dir == NULL)
bkc_mbed 0:2053640461b5 724 {
bkc_mbed 6:e48296dca6bb 725 lcd_printStr2("SD CARD", "ERROR!");
bkc_mbed 0:2053640461b5 726 return -1;
bkc_mbed 0:2053640461b5 727 }
bkc_mbed 0:2053640461b5 728 struct dirent *dent;
bkc_mbed 0:2053640461b5 729
bkc_mbed 0:2053640461b5 730 while(1)
bkc_mbed 0:2053640461b5 731 {
bkc_mbed 0:2053640461b5 732 dent = readdir(dir);
bkc_mbed 0:2053640461b5 733 if (!dent)
bkc_mbed 0:2053640461b5 734 break;
bkc_mbed 0:2053640461b5 735
bkc_mbed 0:2053640461b5 736 // resource or hidden file
bkc_mbed 0:2053640461b5 737 if (dent->d_name[0] == '.')
bkc_mbed 0:2053640461b5 738 continue;
bkc_mbed 0:2053640461b5 739
bkc_mbed 0:2053640461b5 740 char *ext = strrchr(dent->d_name, '.');
bkc_mbed 0:2053640461b5 741 if (!ext)
bkc_mbed 0:2053640461b5 742 continue;
bkc_mbed 0:2053640461b5 743
bkc_mbed 0:2053640461b5 744 if (strcasecmp(ext, ".nlg") != 0)
bkc_mbed 0:2053640461b5 745 continue;
bkc_mbed 0:2053640461b5 746
bkc_mbed 0:2053640461b5 747 if (count < 0)
bkc_mbed 0:2053640461b5 748 count = 0;
bkc_mbed 0:2053640461b5 749
bkc_mbed 0:2053640461b5 750 count++;
bkc_mbed 0:2053640461b5 751
bkc_mbed 0:2053640461b5 752 if (index < 0)
bkc_mbed 0:2053640461b5 753 continue;
bkc_mbed 0:2053640461b5 754
bkc_mbed 0:2053640461b5 755 if (count <= index)
bkc_mbed 0:2053640461b5 756 continue;
bkc_mbed 0:2053640461b5 757
bkc_mbed 0:2053640461b5 758 strcpy(dest, dent->d_name);
bkc_mbed 0:2053640461b5 759 break;
bkc_mbed 0:2053640461b5 760 }
bkc_mbed 0:2053640461b5 761 closedir(dir);
bkc_mbed 0:2053640461b5 762 return count;
bkc_mbed 0:2053640461b5 763 }
bkc_mbed 0:2053640461b5 764
bkc_mbed 6:e48296dca6bb 765
bkc_mbed 6:e48296dca6bb 766 //
bkc_mbed 6:e48296dca6bb 767 // title
bkc_mbed 6:e48296dca6bb 768 //
bkc_mbed 6:e48296dca6bb 769 void putTitle()
bkc_mbed 6:e48296dca6bb 770 {
bkc_mbed 6:e48296dca6bb 771 lcd_printStr2("NBCTRL", "Ver 1.10");
bkc_mbed 6:e48296dca6bb 772 wait(3);
bkc_mbed 6:e48296dca6bb 773 }
bkc_mbed 6:e48296dca6bb 774
bkc_mbed 6:e48296dca6bb 775 //
bkc_mbed 6:e48296dca6bb 776 // main
bkc_mbed 6:e48296dca6bb 777 //
bkc_mbed 0:2053640461b5 778 int main()
bkc_mbed 0:2053640461b5 779 {
bkc_mbed 0:2053640461b5 780 char file[32];
bkc_mbed 3:aed228fa3ae4 781 char path[48];
bkc_mbed 0:2053640461b5 782
bkc_mbed 0:2053640461b5 783 led1 = 0;
bkc_mbed 1:ec416e6d5739 784 led2 = 0;
bkc_mbed 1:ec416e6d5739 785
bkc_mbed 6:e48296dca6bb 786 wait_ms(20);
bkc_mbed 6:e48296dca6bb 787
bkc_mbed 6:e48296dca6bb 788 // reset SHIFT REGISTER
bkc_mbed 6:e48296dca6bb 789 ioShiftOut(( 0xFF << 8) | (ACTLOW));
bkc_mbed 4:4dc67a366727 790
bkc_mbed 0:2053640461b5 791 lcd_init();
bkc_mbed 6:e48296dca6bb 792
bkc_mbed 6:e48296dca6bb 793 putTitle();
bkc_mbed 5:27f193e21222 794
bkc_mbed 0:2053640461b5 795 boardInit();
bkc_mbed 0:2053640461b5 796
bkc_mbed 0:2053640461b5 797 int files = 0;
bkc_mbed 0:2053640461b5 798 int disp_mode = 0;
bkc_mbed 0:2053640461b5 799
bkc_mbed 0:2053640461b5 800 if (!sw_next)
bkc_mbed 0:2053640461b5 801 disp_mode = 1;
bkc_mbed 0:2053640461b5 802
bkc_mbed 0:2053640461b5 803 files = get_nlg_file(file, -1);
bkc_mbed 0:2053640461b5 804
bkc_mbed 0:2053640461b5 805 if (disp_mode)
bkc_mbed 3:aed228fa3ae4 806 {
bkc_mbed 0:2053640461b5 807 char buf[16];
bkc_mbed 3:aed228fa3ae4 808 Timer t;
bkc_mbed 3:aed228fa3ae4 809 int result_us = 0;
bkc_mbed 4:4dc67a366727 810 t.reset();
bkc_mbed 3:aed228fa3ae4 811 t.start();
bkc_mbed 3:aed228fa3ae4 812
bkc_mbed 3:aed228fa3ae4 813 ioShiftOut(( 0x68 << 8) | (ACTLOW));
bkc_mbed 3:aed228fa3ae4 814 ioShiftOut(( 0x68 << 8) | (ACTLOW));
bkc_mbed 3:aed228fa3ae4 815 ioShiftOut(( 0x68 << 8) | (ACTLOW));
bkc_mbed 3:aed228fa3ae4 816
bkc_mbed 3:aed228fa3ae4 817 ioShiftOut(( 0x68 << 8) | (ACTLOW));
bkc_mbed 3:aed228fa3ae4 818 ioShiftOut(( 0x68 << 8) | (ACTLOW));
bkc_mbed 3:aed228fa3ae4 819 ioShiftOut(( 0x68 << 8) | (ACTLOW));
bkc_mbed 3:aed228fa3ae4 820
bkc_mbed 3:aed228fa3ae4 821 result_us = t.read_us();
bkc_mbed 3:aed228fa3ae4 822 t.stop();
bkc_mbed 4:4dc67a366727 823
bkc_mbed 6:e48296dca6bb 824 printf("result_us=%dus\n", result_us);
bkc_mbed 4:4dc67a366727 825 printf("DATE:%s\nTIME:%s\n", __DATE__, __TIME__);
bkc_mbed 6:e48296dca6bb 826
bkc_mbed 1:ec416e6d5739 827 sprintf(buf, "%8s", __DATE__);
bkc_mbed 1:ec416e6d5739 828 lcd_printStrYscr(1, buf);
bkc_mbed 1:ec416e6d5739 829 wait(3);
bkc_mbed 1:ec416e6d5739 830 sprintf(buf, "%8s", __TIME__);
bkc_mbed 1:ec416e6d5739 831 lcd_printStrY(1, buf);
bkc_mbed 0:2053640461b5 832 wait(3);
bkc_mbed 3:aed228fa3ae4 833
bkc_mbed 4:4dc67a366727 834 sprintf(buf, "R:%dus", result_us);
bkc_mbed 3:aed228fa3ae4 835 lcd_printStrY(1, buf);
bkc_mbed 3:aed228fa3ae4 836 wait(3);
bkc_mbed 3:aed228fa3ae4 837
bkc_mbed 0:2053640461b5 838
bkc_mbed 0:2053640461b5 839 if (files < 0)
bkc_mbed 1:ec416e6d5739 840 lcd_printStrY(1, "NO FILES");
bkc_mbed 0:2053640461b5 841 else
bkc_mbed 0:2053640461b5 842 {
bkc_mbed 0:2053640461b5 843 char buf[16];
bkc_mbed 1:ec416e6d5739 844 sprintf(buf, "%3dfiles", files);
bkc_mbed 1:ec416e6d5739 845 lcd_printStrY(1, buf);
bkc_mbed 0:2053640461b5 846 }
bkc_mbed 0:2053640461b5 847 wait(3);
bkc_mbed 0:2053640461b5 848 lcd_cls();
bkc_mbed 0:2053640461b5 849 }
bkc_mbed 1:ec416e6d5739 850
bkc_mbed 0:2053640461b5 851 int idx = 0;
bkc_mbed 0:2053640461b5 852 while(files > 0)
bkc_mbed 0:2053640461b5 853 {
bkc_mbed 2:f0b7779b03c7 854 char buf[16];
bkc_mbed 2:f0b7779b03c7 855
bkc_mbed 0:2053640461b5 856 get_nlg_file(file, idx);
bkc_mbed 0:2053640461b5 857
bkc_mbed 0:2053640461b5 858 sprintf(path, "/sd/%s", file);
bkc_mbed 0:2053640461b5 859 printf("path=%s\n",path);
bkc_mbed 0:2053640461b5 860
bkc_mbed 2:f0b7779b03c7 861 lcd_cls();
bkc_mbed 1:ec416e6d5739 862 lcd_printStrY(0, file);
bkc_mbed 0:2053640461b5 863
bkc_mbed 3:aed228fa3ae4 864 sprintf(buf, "%2d ", idx + 1);
bkc_mbed 2:f0b7779b03c7 865 lcd_printStrY(1, buf);
bkc_mbed 2:f0b7779b03c7 866
bkc_mbed 2:f0b7779b03c7 867 nlg_play(path);
bkc_mbed 0:2053640461b5 868
bkc_mbed 2:f0b7779b03c7 869 // wait for chattering
bkc_mbed 1:ec416e6d5739 870 wait(0.25);
bkc_mbed 6:e48296dca6bb 871
bkc_mbed 6:e48296dca6bb 872 // wait release
bkc_mbed 6:e48296dca6bb 873 waitButtonRelease();
bkc_mbed 6:e48296dca6bb 874
bkc_mbed 6:e48296dca6bb 875 // if play button is pressed
bkc_mbed 0:2053640461b5 876 if (g_stop)
bkc_mbed 0:2053640461b5 877 {
bkc_mbed 6:e48296dca6bb 878 g_stop = false;
bkc_mbed 6:e48296dca6bb 879 g_prev = false;
bkc_mbed 6:e48296dca6bb 880
bkc_mbed 2:f0b7779b03c7 881 lcd_printStrY(1, " STOP ");
bkc_mbed 1:ec416e6d5739 882
bkc_mbed 6:e48296dca6bb 883 // wait any button is pressed
bkc_mbed 6:e48296dca6bb 884 waitButtonPress();
bkc_mbed 1:ec416e6d5739 885
bkc_mbed 2:f0b7779b03c7 886 if (!sw_play) {
bkc_mbed 2:f0b7779b03c7 887 lcd_printStrY(1, " PREV ");
bkc_mbed 6:e48296dca6bb 888 g_prev = true;
bkc_mbed 2:f0b7779b03c7 889 }
bkc_mbed 2:f0b7779b03c7 890 else
bkc_mbed 2:f0b7779b03c7 891 {
bkc_mbed 2:f0b7779b03c7 892 lcd_printStrY(1, " NEXT ");
bkc_mbed 2:f0b7779b03c7 893 }
bkc_mbed 1:ec416e6d5739 894
bkc_mbed 1:ec416e6d5739 895 // wait release
bkc_mbed 6:e48296dca6bb 896 waitButtonRelease();
bkc_mbed 1:ec416e6d5739 897
bkc_mbed 1:ec416e6d5739 898 // reset board
bkc_mbed 1:ec416e6d5739 899 boardInit();
bkc_mbed 0:2053640461b5 900 }
bkc_mbed 6:e48296dca6bb 901
bkc_mbed 6:e48296dca6bb 902 // play prev or next song
bkc_mbed 6:e48296dca6bb 903 if (g_prev)
bkc_mbed 1:ec416e6d5739 904 {
bkc_mbed 6:e48296dca6bb 905 g_prev = false;
bkc_mbed 6:e48296dca6bb 906
bkc_mbed 1:ec416e6d5739 907 if (idx - 1 >= 0)
bkc_mbed 1:ec416e6d5739 908 idx--;
bkc_mbed 1:ec416e6d5739 909 else
bkc_mbed 1:ec416e6d5739 910 idx = files - 1;
bkc_mbed 1:ec416e6d5739 911 }
bkc_mbed 0:2053640461b5 912 else
bkc_mbed 1:ec416e6d5739 913 {
bkc_mbed 1:ec416e6d5739 914 if (idx + 1 < files)
bkc_mbed 1:ec416e6d5739 915 idx++;
bkc_mbed 1:ec416e6d5739 916 else
bkc_mbed 1:ec416e6d5739 917 idx = 0;
bkc_mbed 1:ec416e6d5739 918 }
bkc_mbed 0:2053640461b5 919 }
bkc_mbed 0:2053640461b5 920 }