nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Sat May 17 12:54:13 2014 +0000
Revision:
0:2053640461b5
Child:
1:ec416e6d5739
first version.

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