TanNM

Dependencies:   BSP_DISCO_F746NG

Committer:
tannm
Date:
Tue Mar 03 11:35:25 2020 +0000
Revision:
3:d7624177cb9f
Parent:
1:ec61ea9f67de
TanNM

Who changed what in which revision?

UserRevisionLine numberNew 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(&eth);
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 }