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
Recorder.cpp@1:c47a2f0816bb, 2014-12-08 (annotated)
- Committer:
- dudanian
- Date:
- Mon Dec 08 10:06:35 2014 +0000
- Revision:
- 1:c47a2f0816bb
- Child:
- 2:c939d0501184
Working after accidental delete.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudanian | 1:c47a2f0816bb | 1 | #include "Recorder.h" |
dudanian | 1:c47a2f0816bb | 2 | |
dudanian | 1:c47a2f0816bb | 3 | #define RAM_TOTAL 1024 |
dudanian | 1:c47a2f0816bb | 4 | |
dudanian | 1:c47a2f0816bb | 5 | AnalogIn adcin(p20); |
dudanian | 1:c47a2f0816bb | 6 | DigitalOut led_rec_ok(LED2); |
dudanian | 1:c47a2f0816bb | 7 | |
dudanian | 1:c47a2f0816bb | 8 | Ticker ticker; |
dudanian | 1:c47a2f0816bb | 9 | float buffer[RAM_TOTAL]; |
dudanian | 1:c47a2f0816bb | 10 | int rp = 0; |
dudanian | 1:c47a2f0816bb | 11 | int wp = 0; |
dudanian | 1:c47a2f0816bb | 12 | int dropout = 0; |
dudanian | 1:c47a2f0816bb | 13 | |
dudanian | 1:c47a2f0816bb | 14 | #define WAVFILE_ERROR_PRINT(RESULT) \ |
dudanian | 1:c47a2f0816bb | 15 | do { \ |
dudanian | 1:c47a2f0816bb | 16 | WavFileResult R = RESULT; \ |
dudanian | 1:c47a2f0816bb | 17 | if (R != WavFileResultOK) { \ |
dudanian | 1:c47a2f0816bb | 18 | char wavfile_error_print_text[BUFSIZ]; \ |
dudanian | 1:c47a2f0816bb | 19 | wavfile_result_string(R, wavfile_error_print_text, sizeof(wavfile_error_print_text)); \ |
dudanian | 1:c47a2f0816bb | 20 | printf("%s (code=%d)\r\n", wavfile_error_print_text, R); \ |
dudanian | 1:c47a2f0816bb | 21 | return 1; \ |
dudanian | 1:c47a2f0816bb | 22 | } \ |
dudanian | 1:c47a2f0816bb | 23 | } while(0) |
dudanian | 1:c47a2f0816bb | 24 | |
dudanian | 1:c47a2f0816bb | 25 | void tickrec(void) |
dudanian | 1:c47a2f0816bb | 26 | { |
dudanian | 1:c47a2f0816bb | 27 | int np = (wp + 1) & (RAM_TOTAL - 1); |
dudanian | 1:c47a2f0816bb | 28 | if (np != rp) { |
dudanian | 1:c47a2f0816bb | 29 | buffer[wp] = adcin; |
dudanian | 1:c47a2f0816bb | 30 | wp = np; |
dudanian | 1:c47a2f0816bb | 31 | } else { |
dudanian | 1:c47a2f0816bb | 32 | dropout++; |
dudanian | 1:c47a2f0816bb | 33 | } |
dudanian | 1:c47a2f0816bb | 34 | led_rec_ok = !led_rec_ok; |
dudanian | 1:c47a2f0816bb | 35 | } |
dudanian | 1:c47a2f0816bb | 36 | |
dudanian | 1:c47a2f0816bb | 37 | int rec(const char *filename, const int nsec) |
dudanian | 1:c47a2f0816bb | 38 | { |
dudanian | 1:c47a2f0816bb | 39 | WavFileResult result; |
dudanian | 1:c47a2f0816bb | 40 | wavfile_info_t info; |
dudanian | 1:c47a2f0816bb | 41 | wavfile_data_t data; |
dudanian | 1:c47a2f0816bb | 42 | |
dudanian | 1:c47a2f0816bb | 43 | WAVFILE_INFO_AUDIO_FORMAT(&info) = 1; |
dudanian | 1:c47a2f0816bb | 44 | WAVFILE_INFO_NUM_CHANNELS(&info) = 1; |
dudanian | 1:c47a2f0816bb | 45 | WAVFILE_INFO_SAMPLE_RATE(&info) = 11025; |
dudanian | 1:c47a2f0816bb | 46 | WAVFILE_INFO_BYTE_RATE(&info) = 22050; |
dudanian | 1:c47a2f0816bb | 47 | WAVFILE_INFO_BLOCK_ALIGN(&info) = 2; |
dudanian | 1:c47a2f0816bb | 48 | WAVFILE_INFO_BITS_PER_SAMPLE(&info) = 16; |
dudanian | 1:c47a2f0816bb | 49 | |
dudanian | 1:c47a2f0816bb | 50 | WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result); |
dudanian | 1:c47a2f0816bb | 51 | WAVFILE_ERROR_PRINT(result); |
dudanian | 1:c47a2f0816bb | 52 | WAVFILE_ERROR_PRINT(wavfile_write_info(wf, &info)); |
dudanian | 1:c47a2f0816bb | 53 | |
dudanian | 1:c47a2f0816bb | 54 | //printf("[REC:%s]\r\n", filename); |
dudanian | 1:c47a2f0816bb | 55 | //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info)); |
dudanian | 1:c47a2f0816bb | 56 | //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info)); |
dudanian | 1:c47a2f0816bb | 57 | //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info)); |
dudanian | 1:c47a2f0816bb | 58 | //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info)); |
dudanian | 1:c47a2f0816bb | 59 | //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info)); |
dudanian | 1:c47a2f0816bb | 60 | //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info)); |
dudanian | 1:c47a2f0816bb | 61 | |
dudanian | 1:c47a2f0816bb | 62 | const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info); |
dudanian | 1:c47a2f0816bb | 63 | const unsigned int samples_for_nsec = WAVFILE_INFO_SAMPLE_RATE(&info) * nsec; |
dudanian | 1:c47a2f0816bb | 64 | |
dudanian | 1:c47a2f0816bb | 65 | rp = 0; |
dudanian | 1:c47a2f0816bb | 66 | wp = 0; |
dudanian | 1:c47a2f0816bb | 67 | dropout = 0; |
dudanian | 1:c47a2f0816bb | 68 | unsigned int count = 0; |
dudanian | 1:c47a2f0816bb | 69 | ticker.attach_us(tickrec, interval_us); |
dudanian | 1:c47a2f0816bb | 70 | WAVFILE_DATA_NUM_CHANNELS(&data) = 1; |
dudanian | 1:c47a2f0816bb | 71 | while (1) { |
dudanian | 1:c47a2f0816bb | 72 | while (rp == wp) { |
dudanian | 1:c47a2f0816bb | 73 | wait_us(1); |
dudanian | 1:c47a2f0816bb | 74 | } |
dudanian | 1:c47a2f0816bb | 75 | |
dudanian | 1:c47a2f0816bb | 76 | WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp]; |
dudanian | 1:c47a2f0816bb | 77 | rp = (rp + 1) & (RAM_TOTAL - 1); |
dudanian | 1:c47a2f0816bb | 78 | WAVFILE_ERROR_PRINT(wavfile_write_data(wf, &data)); |
dudanian | 1:c47a2f0816bb | 79 | |
dudanian | 1:c47a2f0816bb | 80 | count++; |
dudanian | 1:c47a2f0816bb | 81 | if (count > samples_for_nsec) { |
dudanian | 1:c47a2f0816bb | 82 | break; |
dudanian | 1:c47a2f0816bb | 83 | } |
dudanian | 1:c47a2f0816bb | 84 | } |
dudanian | 1:c47a2f0816bb | 85 | ticker.detach(); |
dudanian | 1:c47a2f0816bb | 86 | led_rec_ok = 0; |
dudanian | 1:c47a2f0816bb | 87 | //printf("\t-- Rec done. (dropout=%d) --\r\n", dropout); |
dudanian | 1:c47a2f0816bb | 88 | |
dudanian | 1:c47a2f0816bb | 89 | WAVFILE_ERROR_PRINT(wavfile_close(wf)); |
dudanian | 1:c47a2f0816bb | 90 | return 0; |
dudanian | 1:c47a2f0816bb | 91 | } |