TanNM
Dependencies: BSP_DISCO_F746NG
main.cpp@3:d7624177cb9f, 2020-03-03 (annotated)
- Committer:
- tannm
- Date:
- Tue Mar 03 11:35:25 2020 +0000
- Revision:
- 3:d7624177cb9f
- Parent:
- 1:ec61ea9f67de
TanNM
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tannm | 3:d7624177cb9f | 1 | //#if !FEATURE_LWIP |
tannm | 3:d7624177cb9f | 2 | // #error [NOT_SUPPORTED] LWIP not supported for this target |
tannm | 3:d7624177cb9f | 3 | //#endif |
group-ST | 0:6e8275981824 | 4 | |
group-ST | 0:6e8275981824 | 5 | #include "mbed.h" |
group-ST | 0:6e8275981824 | 6 | #include "EthernetInterface.h" |
group-ST | 0:6e8275981824 | 7 | #include "TCPServer.h" |
group-ST | 0:6e8275981824 | 8 | #include "TCPSocket.h" |
group-ST | 0:6e8275981824 | 9 | |
tannm | 3:d7624177cb9f | 10 | #include "stm32746g_discovery_audio.h" |
tannm | 3:d7624177cb9f | 11 | #include "stm32746g_discovery_sdram.h" |
tannm | 3:d7624177cb9f | 12 | |
tannm | 3:d7624177cb9f | 13 | typedef enum { |
tannm | 3:d7624177cb9f | 14 | BUFFER_OFFSET_NONE = 0, |
tannm | 3:d7624177cb9f | 15 | BUFFER_OFFSET_HALF = 1, |
tannm | 3:d7624177cb9f | 16 | BUFFER_OFFSET_FULL = 2, |
tannm | 3:d7624177cb9f | 17 | } BUFFER_StateTypeDef; |
tannm | 3:d7624177cb9f | 18 | |
tannm | 3:d7624177cb9f | 19 | #define AUDIO_BLOCK_SIZE ((uint32_t)4096) |
tannm | 3:d7624177cb9f | 20 | #define AUDIO_BUFFER_IN SDRAM_DEVICE_ADDR |
tannm | 3:d7624177cb9f | 21 | #define AUDIO_BUFFER_OUT (AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE * 2)) |
tannm | 3:d7624177cb9f | 22 | //#define NETWORK_BUFFER (AUDIO_BUFFER_OUT + (AUDIO_BLOCK_SIZE * 2)) |
tannm | 3:d7624177cb9f | 23 | |
tannm | 3:d7624177cb9f | 24 | char temp[AUDIO_BLOCK_SIZE]; |
tannm | 3:d7624177cb9f | 25 | |
tannm | 3:d7624177cb9f | 26 | volatile uint32_t audio_rec_buffer_state = BUFFER_OFFSET_NONE; |
tannm | 3:d7624177cb9f | 27 | Serial pc(USBTX, USBRX); |
tannm | 3:d7624177cb9f | 28 | Mutex mutex; |
tannm | 3:d7624177cb9f | 29 | ConditionVariable cond(mutex); |
tannm | 3:d7624177cb9f | 30 | bool done = false; |
group-ST | 0:6e8275981824 | 31 | |
tannm | 3:d7624177cb9f | 32 | void tcp_thread(TCPSocket * send_socket) |
tannm | 3:d7624177cb9f | 33 | { |
tannm | 3:d7624177cb9f | 34 | while (true) { |
tannm | 3:d7624177cb9f | 35 | mutex.lock(); |
tannm | 3:d7624177cb9f | 36 | do { |
tannm | 3:d7624177cb9f | 37 | // Wait for a condition to change (network_buffer full) |
tannm | 3:d7624177cb9f | 38 | // pc.printf("Waiting for condition on mutex ...\n"); |
tannm | 3:d7624177cb9f | 39 | cond.wait(); |
tannm | 3:d7624177cb9f | 40 | } while (!done); |
tannm | 3:d7624177cb9f | 41 | // pc.printf("sending data over ethernet ...\n"); |
tannm | 3:d7624177cb9f | 42 | int ret = send_socket->send((void *)(temp), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 43 | pc.printf("ret = %d\n", ret); |
tannm | 3:d7624177cb9f | 44 | done = false; |
tannm | 3:d7624177cb9f | 45 | mutex.unlock(); |
tannm | 3:d7624177cb9f | 46 | } |
tannm | 3:d7624177cb9f | 47 | |
tannm | 3:d7624177cb9f | 48 | pc.printf("Worker: Exiting\r\n"); |
tannm | 3:d7624177cb9f | 49 | mutex.unlock(); |
tannm | 3:d7624177cb9f | 50 | } |
tannm | 3:d7624177cb9f | 51 | |
tannm | 3:d7624177cb9f | 52 | TCPServer srv; |
tannm | 3:d7624177cb9f | 53 | TCPSocket clt_sock; |
tannm | 3:d7624177cb9f | 54 | SocketAddress clt_addr; |
tannm | 3:d7624177cb9f | 55 | EthernetInterface eth; |
group-ST | 0:6e8275981824 | 56 | |
group-ST | 0:6e8275981824 | 57 | int main() |
group-ST | 0:6e8275981824 | 58 | { |
tannm | 3:d7624177cb9f | 59 | pc.baud(115200); |
tannm | 3:d7624177cb9f | 60 | Timer t; |
tannm | 3:d7624177cb9f | 61 | // ======================================= setup network ============================== |
tannm | 3:d7624177cb9f | 62 | eth.set_network("192.168.10.10", "255.255.255.0", "192.168.10.1"); |
group-ST | 0:6e8275981824 | 63 | eth.connect(); |
group-ST | 0:6e8275981824 | 64 | |
tannm | 3:d7624177cb9f | 65 | pc.printf("The target IP address is '%s'\n", eth.get_ip_address()); |
tannm | 3:d7624177cb9f | 66 | |
group-ST | 0:6e8275981824 | 67 | /* Open the server on ethernet stack */ |
group-ST | 0:6e8275981824 | 68 | srv.open(ð); |
group-ST | 0:6e8275981824 | 69 | |
group-ST | 0:6e8275981824 | 70 | /* Bind the HTTP port (TCP 80) to the server */ |
tannm | 3:d7624177cb9f | 71 | srv.bind(eth.get_ip_address(), 8000); |
group-ST | 0:6e8275981824 | 72 | |
group-ST | 0:6e8275981824 | 73 | /* Can handle 5 simultaneous connections */ |
group-ST | 0:6e8275981824 | 74 | srv.listen(5); |
group-ST | 0:6e8275981824 | 75 | |
tannm | 3:d7624177cb9f | 76 | // ======================== audio part ============================ |
tannm | 3:d7624177cb9f | 77 | pc.printf("\n\nAUDIO LOOPBACK EXAMPLE START:\n"); |
tannm | 3:d7624177cb9f | 78 | |
tannm | 3:d7624177cb9f | 79 | // BSP_AUDIO_IN_OUT_Init(INPUT_DEVICE_DIGITAL_MICROPHONE_2, OUTPUT_DEVICE_HEADPHONE, DEFAULT_AUDIO_IN_FREQ, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR); |
tannm | 3:d7624177cb9f | 80 | BSP_AUDIO_IN_OUT_Init(INPUT_DEVICE_DIGITAL_MICROPHONE_2, OUTPUT_DEVICE_HEADPHONE, DEFAULT_AUDIO_IN_FREQ, DEFAULT_AUDIO_IN_BIT_RESOLUTION, 1); |
tannm | 3:d7624177cb9f | 81 | |
tannm | 3:d7624177cb9f | 82 | /* Initialize SDRAM buffers */ |
tannm | 3:d7624177cb9f | 83 | BSP_SDRAM_Init(); |
tannm | 3:d7624177cb9f | 84 | memset((void *)AUDIO_BUFFER_IN, 0, AUDIO_BLOCK_SIZE * 2); |
tannm | 3:d7624177cb9f | 85 | memset((void *)AUDIO_BUFFER_OUT, 0, AUDIO_BLOCK_SIZE * 2); |
tannm | 3:d7624177cb9f | 86 | // memset((void *)NETWORK_BUFFER, 0, AUDIO_BLOCK_SIZE * 2); |
tannm | 3:d7624177cb9f | 87 | pc.printf("SDRAM init done\n"); |
tannm | 3:d7624177cb9f | 88 | |
tannm | 3:d7624177cb9f | 89 | audio_rec_buffer_state = BUFFER_OFFSET_NONE; |
tannm | 3:d7624177cb9f | 90 | |
tannm | 3:d7624177cb9f | 91 | /* Start Recording */ |
tannm | 3:d7624177cb9f | 92 | if (BSP_AUDIO_IN_Record((uint16_t *)AUDIO_BUFFER_IN, AUDIO_BLOCK_SIZE) != AUDIO_OK) { |
tannm | 3:d7624177cb9f | 93 | pc.printf("BSP_AUDIO_IN_Record error\n"); |
tannm | 3:d7624177cb9f | 94 | } |
tannm | 3:d7624177cb9f | 95 | |
tannm | 3:d7624177cb9f | 96 | /* Start Playback */ |
tannm | 3:d7624177cb9f | 97 | BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02); |
tannm | 3:d7624177cb9f | 98 | if (BSP_AUDIO_OUT_Play((uint16_t *)AUDIO_BUFFER_OUT, AUDIO_BLOCK_SIZE * 2) != AUDIO_OK) { |
tannm | 3:d7624177cb9f | 99 | pc.printf("BSP_AUDIO_OUT_Play error\n"); |
tannm | 3:d7624177cb9f | 100 | } |
tannm | 3:d7624177cb9f | 101 | |
tannm | 3:d7624177cb9f | 102 | int ret; |
tannm | 3:d7624177cb9f | 103 | |
group-ST | 0:6e8275981824 | 104 | while (true) { |
adustm | 1:ec61ea9f67de | 105 | srv.accept(&clt_sock, &clt_addr); |
tannm | 3:d7624177cb9f | 106 | pc.printf("accept %s:%d\n", clt_addr.get_ip_address(), clt_addr.get_port()); |
tannm | 3:d7624177cb9f | 107 | |
tannm | 3:d7624177cb9f | 108 | // Thread thread; |
tannm | 3:d7624177cb9f | 109 | // thread.start(callback(tcp_thread, &clt_sock)); |
tannm | 3:d7624177cb9f | 110 | |
tannm | 3:d7624177cb9f | 111 | int sleep_ms = 20; |
tannm | 3:d7624177cb9f | 112 | |
tannm | 3:d7624177cb9f | 113 | while (1) { |
tannm | 3:d7624177cb9f | 114 | /* Wait end of half block recording */ |
tannm | 3:d7624177cb9f | 115 | t.start(); |
tannm | 3:d7624177cb9f | 116 | while (audio_rec_buffer_state != BUFFER_OFFSET_HALF) { |
tannm | 3:d7624177cb9f | 117 | wait_ms(sleep_ms); |
tannm | 3:d7624177cb9f | 118 | } |
tannm | 3:d7624177cb9f | 119 | t.stop(); |
tannm | 3:d7624177cb9f | 120 | printf("t = %f\n", t.read()); |
tannm | 3:d7624177cb9f | 121 | t.reset(); |
tannm | 3:d7624177cb9f | 122 | |
tannm | 3:d7624177cb9f | 123 | audio_rec_buffer_state = BUFFER_OFFSET_NONE; |
tannm | 3:d7624177cb9f | 124 | |
tannm | 3:d7624177cb9f | 125 | /* Copy recorded 1st half block */ |
tannm | 3:d7624177cb9f | 126 | memcpy((void *)(AUDIO_BUFFER_OUT), (void *)(AUDIO_BUFFER_IN), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 127 | |
tannm | 3:d7624177cb9f | 128 | // mutex.lock(); |
tannm | 3:d7624177cb9f | 129 | // memcpy((void *)temp, (void *)(AUDIO_BUFFER_IN), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 130 | // done = true; |
tannm | 3:d7624177cb9f | 131 | // cond.notify_all(); |
tannm | 3:d7624177cb9f | 132 | // mutex.unlock(); |
tannm | 3:d7624177cb9f | 133 | |
tannm | 3:d7624177cb9f | 134 | memcpy((void *)temp, (void *)(AUDIO_BUFFER_IN), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 135 | int ret = clt_sock.send((void *)(temp), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 136 | pc.printf("ret = %d\n", ret); |
tannm | 3:d7624177cb9f | 137 | |
tannm | 3:d7624177cb9f | 138 | /* Wait end of one block recording */ |
tannm | 3:d7624177cb9f | 139 | while (audio_rec_buffer_state != BUFFER_OFFSET_FULL) { |
tannm | 3:d7624177cb9f | 140 | wait_ms(sleep_ms); |
tannm | 3:d7624177cb9f | 141 | } |
tannm | 3:d7624177cb9f | 142 | audio_rec_buffer_state = BUFFER_OFFSET_NONE; |
tannm | 3:d7624177cb9f | 143 | |
tannm | 3:d7624177cb9f | 144 | /* Copy recorded 2nd half block */ |
tannm | 3:d7624177cb9f | 145 | memcpy((void *)(AUDIO_BUFFER_OUT + (AUDIO_BLOCK_SIZE)), (void *)(AUDIO_BUFFER_IN + (AUDIO_BLOCK_SIZE)), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 146 | |
tannm | 3:d7624177cb9f | 147 | memcpy((void *)temp, (void *)(AUDIO_BUFFER_IN + AUDIO_BLOCK_SIZE), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 148 | ret = clt_sock.send((void *)(temp), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 149 | pc.printf("ret = %d\n", ret); |
tannm | 3:d7624177cb9f | 150 | |
tannm | 3:d7624177cb9f | 151 | // mutex.lock(); |
tannm | 3:d7624177cb9f | 152 | // memcpy((void *)temp, (void *)(AUDIO_BUFFER_IN + AUDIO_BLOCK_SIZE), AUDIO_BLOCK_SIZE); |
tannm | 3:d7624177cb9f | 153 | // done = true; |
tannm | 3:d7624177cb9f | 154 | // cond.notify_all(); |
tannm | 3:d7624177cb9f | 155 | // mutex.unlock(); |
tannm | 3:d7624177cb9f | 156 | } |
group-ST | 0:6e8275981824 | 157 | } |
group-ST | 0:6e8275981824 | 158 | } |
tannm | 3:d7624177cb9f | 159 | |
tannm | 3:d7624177cb9f | 160 | void BSP_AUDIO_IN_TransferComplete_CallBack(void) |
tannm | 3:d7624177cb9f | 161 | { |
tannm | 3:d7624177cb9f | 162 | audio_rec_buffer_state = BUFFER_OFFSET_FULL; |
tannm | 3:d7624177cb9f | 163 | } |
tannm | 3:d7624177cb9f | 164 | |
tannm | 3:d7624177cb9f | 165 | void BSP_AUDIO_IN_HalfTransfer_CallBack(void) |
tannm | 3:d7624177cb9f | 166 | { |
tannm | 3:d7624177cb9f | 167 | audio_rec_buffer_state = BUFFER_OFFSET_HALF; |
tannm | 3:d7624177cb9f | 168 | } |
tannm | 3:d7624177cb9f | 169 | |
tannm | 3:d7624177cb9f | 170 | void BSP_AUDIO_IN_Error_CallBack(void) |
tannm | 3:d7624177cb9f | 171 | { |
tannm | 3:d7624177cb9f | 172 | printf("BSP_AUDIO_IN_Error_CallBack\n"); |
tannm | 3:d7624177cb9f | 173 | } |