Mbed Clock application using an NTP connection to get internet time and a terminal interface to send commands

Dependencies:   4DGL-uLCD-SE EthernetInterface NTPClient mbed-rtos mbed SDFileSystem wavfile

Committer:
dudanian
Date:
Mon Dec 08 23:30:49 2014 +0000
Revision:
2:c939d0501184
Parent:
1:c47a2f0816bb
Working better

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudanian 1:c47a2f0816bb 1 #include "Recorder.h"
dudanian 1:c47a2f0816bb 2
dudanian 2:c939d0501184 3 #define RAM_TOTAL 2048
dudanian 1:c47a2f0816bb 4
dudanian 2:c939d0501184 5 AnalogOut dacout(p18);
dudanian 1:c47a2f0816bb 6 AnalogIn adcin(p20);
dudanian 2:c939d0501184 7 DigitalOut led_play_ok(LED1);
dudanian 1:c47a2f0816bb 8 DigitalOut led_rec_ok(LED2);
dudanian 1:c47a2f0816bb 9
dudanian 1:c47a2f0816bb 10 Ticker ticker;
dudanian 2:c939d0501184 11 extern float *buffer;
dudanian 1:c47a2f0816bb 12 int rp = 0;
dudanian 1:c47a2f0816bb 13 int wp = 0;
dudanian 1:c47a2f0816bb 14 int dropout = 0;
dudanian 1:c47a2f0816bb 15
dudanian 1:c47a2f0816bb 16 #define WAVFILE_ERROR_PRINT(RESULT) \
dudanian 1:c47a2f0816bb 17 do { \
dudanian 1:c47a2f0816bb 18 WavFileResult R = RESULT; \
dudanian 1:c47a2f0816bb 19 if (R != WavFileResultOK) { \
dudanian 1:c47a2f0816bb 20 char wavfile_error_print_text[BUFSIZ]; \
dudanian 1:c47a2f0816bb 21 wavfile_result_string(R, wavfile_error_print_text, sizeof(wavfile_error_print_text)); \
dudanian 1:c47a2f0816bb 22 printf("%s (code=%d)\r\n", wavfile_error_print_text, R); \
dudanian 1:c47a2f0816bb 23 return 1; \
dudanian 1:c47a2f0816bb 24 } \
dudanian 1:c47a2f0816bb 25 } while(0)
dudanian 1:c47a2f0816bb 26
dudanian 2:c939d0501184 27
dudanian 2:c939d0501184 28 void tickplay(void)
dudanian 2:c939d0501184 29 {
dudanian 2:c939d0501184 30 /*
dudanian 2:c939d0501184 31 * Check the play underflow
dudanian 2:c939d0501184 32 */
dudanian 2:c939d0501184 33 if (rp != wp) {
dudanian 2:c939d0501184 34 dacout = buffer[rp];
dudanian 2:c939d0501184 35 rp = (rp + 1) & (RAM_TOTAL - 1);
dudanian 2:c939d0501184 36 } else {
dudanian 2:c939d0501184 37 dropout++;
dudanian 2:c939d0501184 38 }
dudanian 2:c939d0501184 39 led_play_ok = !led_play_ok;
dudanian 2:c939d0501184 40 }
dudanian 2:c939d0501184 41
dudanian 1:c47a2f0816bb 42 void tickrec(void)
dudanian 1:c47a2f0816bb 43 {
dudanian 1:c47a2f0816bb 44 int np = (wp + 1) & (RAM_TOTAL - 1);
dudanian 1:c47a2f0816bb 45 if (np != rp) {
dudanian 1:c47a2f0816bb 46 buffer[wp] = adcin;
dudanian 1:c47a2f0816bb 47 wp = np;
dudanian 1:c47a2f0816bb 48 } else {
dudanian 1:c47a2f0816bb 49 dropout++;
dudanian 1:c47a2f0816bb 50 }
dudanian 1:c47a2f0816bb 51 led_rec_ok = !led_rec_ok;
dudanian 1:c47a2f0816bb 52 }
dudanian 1:c47a2f0816bb 53
dudanian 2:c939d0501184 54 int play(const char *filename)
dudanian 2:c939d0501184 55 {
dudanian 2:c939d0501184 56 WavFileResult result;
dudanian 2:c939d0501184 57 wavfile_info_t info;
dudanian 2:c939d0501184 58 wavfile_data_t data;
dudanian 2:c939d0501184 59
dudanian 2:c939d0501184 60 WAVFILE *wf = wavfile_open(filename, WavFileModeRead, &result);
dudanian 2:c939d0501184 61 WAVFILE_ERROR_PRINT(result);
dudanian 2:c939d0501184 62 WAVFILE_ERROR_PRINT(wavfile_read_info(wf, &info));
dudanian 2:c939d0501184 63
dudanian 2:c939d0501184 64 //printf("[PLAY:%s]\r\n", filename);
dudanian 2:c939d0501184 65 //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info));
dudanian 2:c939d0501184 66 //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info));
dudanian 2:c939d0501184 67 //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info));
dudanian 2:c939d0501184 68 //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info));
dudanian 2:c939d0501184 69 //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info));
dudanian 2:c939d0501184 70 //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info));
dudanian 2:c939d0501184 71
dudanian 2:c939d0501184 72 const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info);
dudanian 2:c939d0501184 73
dudanian 2:c939d0501184 74 rp = 0;
dudanian 2:c939d0501184 75 wp = 0;
dudanian 2:c939d0501184 76 dropout = 0;
dudanian 2:c939d0501184 77 ticker.attach_us(tickplay, interval_us);
dudanian 2:c939d0501184 78 while (1) {
dudanian 2:c939d0501184 79 int np = (wp + 1) & (RAM_TOTAL - 1);
dudanian 2:c939d0501184 80 while (np == rp) {
dudanian 2:c939d0501184 81 wait_us(1);
dudanian 2:c939d0501184 82 }
dudanian 2:c939d0501184 83 WAVFILE_ERROR_PRINT(wavfile_read_data(wf, &data));
dudanian 2:c939d0501184 84 if (WAVFILE_DATA_IS_END_OF_DATA(&data)) {
dudanian 2:c939d0501184 85 break;
dudanian 2:c939d0501184 86 }
dudanian 2:c939d0501184 87 buffer[wp] = WAVFILE_DATA_CHANNEL_DATA(&data, 0);
dudanian 2:c939d0501184 88 wp = np;
dudanian 2:c939d0501184 89 }
dudanian 2:c939d0501184 90 ticker.detach();
dudanian 2:c939d0501184 91 dacout = 0.5;
dudanian 2:c939d0501184 92 led_play_ok = 0;
dudanian 2:c939d0501184 93 //printf("\t-- Play done. (dropout=%d) --\r\n", dropout);
dudanian 2:c939d0501184 94
dudanian 2:c939d0501184 95 WAVFILE_ERROR_PRINT(wavfile_close(wf));
dudanian 2:c939d0501184 96 return 0;
dudanian 2:c939d0501184 97 }
dudanian 2:c939d0501184 98
dudanian 1:c47a2f0816bb 99 int rec(const char *filename, const int nsec)
dudanian 1:c47a2f0816bb 100 {
dudanian 1:c47a2f0816bb 101 WavFileResult result;
dudanian 1:c47a2f0816bb 102 wavfile_info_t info;
dudanian 1:c47a2f0816bb 103 wavfile_data_t data;
dudanian 1:c47a2f0816bb 104
dudanian 1:c47a2f0816bb 105 WAVFILE_INFO_AUDIO_FORMAT(&info) = 1;
dudanian 1:c47a2f0816bb 106 WAVFILE_INFO_NUM_CHANNELS(&info) = 1;
dudanian 1:c47a2f0816bb 107 WAVFILE_INFO_SAMPLE_RATE(&info) = 11025;
dudanian 1:c47a2f0816bb 108 WAVFILE_INFO_BYTE_RATE(&info) = 22050;
dudanian 1:c47a2f0816bb 109 WAVFILE_INFO_BLOCK_ALIGN(&info) = 2;
dudanian 1:c47a2f0816bb 110 WAVFILE_INFO_BITS_PER_SAMPLE(&info) = 16;
dudanian 1:c47a2f0816bb 111
dudanian 1:c47a2f0816bb 112 WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result);
dudanian 1:c47a2f0816bb 113 WAVFILE_ERROR_PRINT(result);
dudanian 1:c47a2f0816bb 114 WAVFILE_ERROR_PRINT(wavfile_write_info(wf, &info));
dudanian 1:c47a2f0816bb 115
dudanian 1:c47a2f0816bb 116 //printf("[REC:%s]\r\n", filename);
dudanian 1:c47a2f0816bb 117 //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info));
dudanian 1:c47a2f0816bb 118 //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info));
dudanian 1:c47a2f0816bb 119 //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info));
dudanian 1:c47a2f0816bb 120 //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info));
dudanian 1:c47a2f0816bb 121 //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info));
dudanian 1:c47a2f0816bb 122 //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info));
dudanian 1:c47a2f0816bb 123
dudanian 1:c47a2f0816bb 124 const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info);
dudanian 1:c47a2f0816bb 125 const unsigned int samples_for_nsec = WAVFILE_INFO_SAMPLE_RATE(&info) * nsec;
dudanian 1:c47a2f0816bb 126
dudanian 1:c47a2f0816bb 127 rp = 0;
dudanian 1:c47a2f0816bb 128 wp = 0;
dudanian 1:c47a2f0816bb 129 dropout = 0;
dudanian 1:c47a2f0816bb 130 unsigned int count = 0;
dudanian 1:c47a2f0816bb 131 ticker.attach_us(tickrec, interval_us);
dudanian 1:c47a2f0816bb 132 WAVFILE_DATA_NUM_CHANNELS(&data) = 1;
dudanian 1:c47a2f0816bb 133 while (1) {
dudanian 1:c47a2f0816bb 134 while (rp == wp) {
dudanian 1:c47a2f0816bb 135 wait_us(1);
dudanian 1:c47a2f0816bb 136 }
dudanian 1:c47a2f0816bb 137
dudanian 1:c47a2f0816bb 138 WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp];
dudanian 1:c47a2f0816bb 139 rp = (rp + 1) & (RAM_TOTAL - 1);
dudanian 1:c47a2f0816bb 140 WAVFILE_ERROR_PRINT(wavfile_write_data(wf, &data));
dudanian 1:c47a2f0816bb 141
dudanian 1:c47a2f0816bb 142 count++;
dudanian 1:c47a2f0816bb 143 if (count > samples_for_nsec) {
dudanian 1:c47a2f0816bb 144 break;
dudanian 1:c47a2f0816bb 145 }
dudanian 1:c47a2f0816bb 146 }
dudanian 1:c47a2f0816bb 147 ticker.detach();
dudanian 1:c47a2f0816bb 148 led_rec_ok = 0;
dudanian 1:c47a2f0816bb 149 //printf("\t-- Rec done. (dropout=%d) --\r\n", dropout);
dudanian 1:c47a2f0816bb 150
dudanian 1:c47a2f0816bb 151 WAVFILE_ERROR_PRINT(wavfile_close(wf));
dudanian 1:c47a2f0816bb 152 return 0;
dudanian 1:c47a2f0816bb 153 }