nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Tue May 20 09:24:55 2014 +0000
Revision:
2:f0b7779b03c7
Parent:
1:ec416e6d5739
Child:
3:aed228fa3ae4
version 1.06

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