nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Fri May 30 08:42:57 2014 +0000
Revision:
4:4dc67a366727
Parent:
3:aed228fa3ae4
Child:
5:27f193e21222
1.08; wait for boot

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