Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Impedance_Fast_Circuitry by
main.cpp@22:523e316cbe70, 2014-12-03 (annotated)
- Committer:
- timmey9
- Date:
- Wed Dec 03 05:30:45 2014 +0000
- Revision:
- 22:523e316cbe70
- Parent:
- 21:1fb5023b72af
- Child:
- 23:9e5141647775
Motor, angle encoder, and analog sampling code is all copied in, but it is commented out. I'm slowly uncommenting it and verifying that it runs properly piece by piece. I also changed the namespace.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
timmey9 | 20:f533b3c9296f | 1 | // Server code |
donatien | 0:bb128f0e952f | 2 | #include "mbed.h" |
timmey9 | 22:523e316cbe70 | 3 | |
timmey9 | 22:523e316cbe70 | 4 | // Ethernet |
donatien | 0:bb128f0e952f | 5 | #include "EthernetInterface.h" |
timmey9 | 17:2f978f823020 | 6 | #include "NetworkAPI/buffer.hpp" |
timmey9 | 17:2f978f823020 | 7 | #include "NetworkAPI/select.hpp" |
timmey9 | 17:2f978f823020 | 8 | #include "NetworkAPI/ip/address.hpp" |
timmey9 | 17:2f978f823020 | 9 | #include "NetworkAPI/tcp/socket.hpp" |
timmey9 | 18:b17ddeeb1c09 | 10 | |
timmey9 | 22:523e316cbe70 | 11 | |
timmey9 | 22:523e316cbe70 | 12 | // Angle encoder and motor control |
timmey9 | 22:523e316cbe70 | 13 | #include "AngleEncoder.h" |
timmey9 | 22:523e316cbe70 | 14 | #include "MotorControl.h" |
timmey9 | 22:523e316cbe70 | 15 | |
timmey9 | 22:523e316cbe70 | 16 | // Analog sampling |
timmey9 | 22:523e316cbe70 | 17 | #include "PeripheralNames.h" |
timmey9 | 22:523e316cbe70 | 18 | #include "PeripheralPins.h" |
timmey9 | 22:523e316cbe70 | 19 | #include "fsl_adc_hal.h" |
timmey9 | 22:523e316cbe70 | 20 | #include "fsl_clock_manager.h" |
timmey9 | 22:523e316cbe70 | 21 | #include "fsl_dspi_hal.h" |
timmey9 | 22:523e316cbe70 | 22 | #include "AngleEncoder.h" |
timmey9 | 22:523e316cbe70 | 23 | |
timmey9 | 22:523e316cbe70 | 24 | |
timmey9 | 22:523e316cbe70 | 25 | /***************************************** |
timmey9 | 22:523e316cbe70 | 26 | * |
timmey9 | 22:523e316cbe70 | 27 | * Configuration |
timmey9 | 22:523e316cbe70 | 28 | * |
timmey9 | 22:523e316cbe70 | 29 | * Take the time to set these constants |
timmey9 | 22:523e316cbe70 | 30 | * |
timmey9 | 22:523e316cbe70 | 31 | *****************************************/ |
timmey9 | 21:1fb5023b72af | 32 | #define MALLET 6 // set mallet to a value between 1-7 |
timmey9 | 21:1fb5023b72af | 33 | #define STATIC 1 // set STATIC to 1 for static ip, set STATIC to 0 for dynamic |
timmey9 | 21:1fb5023b72af | 34 | #define PORT 22 // set to a random port number. All the mallets can use the same port number. |
timmey9 | 21:1fb5023b72af | 35 | #define MAX_CLIENTS 2 // set the max number of clients to at least 2 (first client is MATLAB, second is the distance unit) |
timmey9 | 22:523e316cbe70 | 36 | #define INVERT_ANGLE 0 // inverts whether the angle encoder counts up or down |
timmey9 | 22:523e316cbe70 | 37 | |
timmey9 | 22:523e316cbe70 | 38 | |
timmey9 | 21:1fb5023b72af | 39 | |
timmey9 | 21:1fb5023b72af | 40 | |
timmey9 | 21:1fb5023b72af | 41 | |
timmey9 | 22:523e316cbe70 | 42 | // Analog sampling |
timmey9 | 22:523e316cbe70 | 43 | #define MAX_FADC 6000000 |
timmey9 | 22:523e316cbe70 | 44 | #define SAMPLING_RATE 10000 // In microseconds, so 10 us will be a sampling rate of 100 kHz |
timmey9 | 22:523e316cbe70 | 45 | #define TOTAL_SAMPLES 300 // originally 30000 for 0.3 ms of sampling. |
timmey9 | 22:523e316cbe70 | 46 | |
timmey9 | 22:523e316cbe70 | 47 | #define LAST_SAMPLE_INDEX (TOTAL_SAMPLES-1) // If sampling time is 25 us, then 2000 corresponds to 50 ms |
timmey9 | 22:523e316cbe70 | 48 | #define FIRST_SAMPLE_INDEX 0 |
timmey9 | 22:523e316cbe70 | 49 | #define BEGIN_SAMPLING 0xFFFFFFFF |
timmey9 | 22:523e316cbe70 | 50 | #define WAITING_TO_BEGIN (BEGIN_SAMPLING-1) |
timmey9 | 22:523e316cbe70 | 51 | |
timmey9 | 22:523e316cbe70 | 52 | #define CHANNEL_STORAGE_OFFSET 16 // For storing the 16 bits and the 16 bits in a single 32 bit array |
timmey9 | 22:523e316cbe70 | 53 | #define PERIOD 3000 // make sure PERIOD >= ON_OFF_TIME |
timmey9 | 22:523e316cbe70 | 54 | #define ON_OFF_TIME 300 // time it takes for relay to turn on |
timmey9 | 22:523e316cbe70 | 55 | |
timmey9 | 22:523e316cbe70 | 56 | |
timmey9 | 22:523e316cbe70 | 57 | // Ethernet |
timmey9 | 22:523e316cbe70 | 58 | #define GATEWAY "169.254.225.1" |
timmey9 | 22:523e316cbe70 | 59 | #define MASK "255.255.0.0" |
timmey9 | 22:523e316cbe70 | 60 | |
timmey9 | 22:523e316cbe70 | 61 | // used for assign different mallets their ip addresses |
timmey9 | 21:1fb5023b72af | 62 | #if MALLET == 1 |
timmey9 | 22:523e316cbe70 | 63 | #define IP "169.254.225.206" |
timmey9 | 21:1fb5023b72af | 64 | #define NAME "Mallet1\n\r" |
timmey9 | 21:1fb5023b72af | 65 | |
timmey9 | 21:1fb5023b72af | 66 | #elif MALLET == 2 |
timmey9 | 22:523e316cbe70 | 67 | #define IP "169.254.225.207" |
timmey9 | 21:1fb5023b72af | 68 | #define NAME "Mallet2\n\r" |
timmey9 | 21:1fb5023b72af | 69 | |
timmey9 | 21:1fb5023b72af | 70 | #elif MALLET == 3 |
timmey9 | 22:523e316cbe70 | 71 | #define IP "169.254.225.208" |
timmey9 | 21:1fb5023b72af | 72 | #define NAME "Mallet3\n\r" |
timmey9 | 21:1fb5023b72af | 73 | |
timmey9 | 21:1fb5023b72af | 74 | #elif MALLET == 4 |
timmey9 | 22:523e316cbe70 | 75 | #define IP "169.254.225.209" |
timmey9 | 21:1fb5023b72af | 76 | #define NAME "Mallet4\n\r" |
timmey9 | 21:1fb5023b72af | 77 | |
timmey9 | 21:1fb5023b72af | 78 | #elif MALLET == 5 |
timmey9 | 22:523e316cbe70 | 79 | #define IP "169.254.225.210" |
timmey9 | 21:1fb5023b72af | 80 | #define NAME "Mallet5\n\r" |
timmey9 | 21:1fb5023b72af | 81 | |
timmey9 | 21:1fb5023b72af | 82 | #elif MALLET == 6 |
timmey9 | 22:523e316cbe70 | 83 | #define IP "169.254.225.211" |
timmey9 | 21:1fb5023b72af | 84 | #define NAME "Mallet6\n\r" |
timmey9 | 21:1fb5023b72af | 85 | |
timmey9 | 21:1fb5023b72af | 86 | #elif MALLET == 7 |
timmey9 | 22:523e316cbe70 | 87 | #define IP "169.254.225.212" |
timmey9 | 21:1fb5023b72af | 88 | #define NAME "Mallet7\n\r" |
timmey9 | 21:1fb5023b72af | 89 | |
timmey9 | 20:f533b3c9296f | 90 | #endif |
timmey9 | 20:f533b3c9296f | 91 | |
timmey9 | 21:1fb5023b72af | 92 | |
timmey9 | 22:523e316cbe70 | 93 | // for debug purposes |
timmey9 | 18:b17ddeeb1c09 | 94 | Serial pc(USBTX, USBRX); |
timmey9 | 18:b17ddeeb1c09 | 95 | DigitalOut led_red(LED_RED); |
timmey9 | 18:b17ddeeb1c09 | 96 | DigitalOut led_green(LED_GREEN); |
timmey9 | 18:b17ddeeb1c09 | 97 | DigitalOut led_blue(LED_BLUE); |
timmey9 | 18:b17ddeeb1c09 | 98 | |
timmey9 | 22:523e316cbe70 | 99 | /* |
timmey9 | 22:523e316cbe70 | 100 | // motor control and angle encoder |
timmey9 | 22:523e316cbe70 | 101 | MotorControl motor(PTC2, PTA2, PERIOD, ON_OFF_TIME); // forward, backward, period, safetyPeriod |
timmey9 | 22:523e316cbe70 | 102 | AngleEncoder angle_encoder(PTD2, PTD3, PTD1, PTD0, 8, 0, 1000000); // mosi, miso, sclk, cs, bit_width, mode, hz |
timmey9 | 22:523e316cbe70 | 103 | DigitalIn AMT20_A(PTC0); // input for quadrature encoding from angle encoder |
timmey9 | 22:523e316cbe70 | 104 | DigitalIn AMT20_B(PTC1); // input for quadrature encoding from angle encoder |
timmey9 | 22:523e316cbe70 | 105 | |
timmey9 | 22:523e316cbe70 | 106 | // Analog sampling |
timmey9 | 22:523e316cbe70 | 107 | Ticker Sampler; |
timmey9 | 22:523e316cbe70 | 108 | Timer timer; |
timmey9 | 22:523e316cbe70 | 109 | Timer timeStamp; |
timmey9 | 22:523e316cbe70 | 110 | AnalogIn A0_pin(A0); |
timmey9 | 22:523e316cbe70 | 111 | AnalogIn A2_pin(A2); |
timmey9 | 22:523e316cbe70 | 112 | |
timmey9 | 22:523e316cbe70 | 113 | //DigitalIn SW3_switch(PTA4); |
timmey9 | 22:523e316cbe70 | 114 | //DigitalIn SW2_switch(PTC6); |
timmey9 | 22:523e316cbe70 | 115 | |
timmey9 | 22:523e316cbe70 | 116 | |
timmey9 | 20:f533b3c9296f | 117 | |
timmey9 | 22:523e316cbe70 | 118 | |
timmey9 | 22:523e316cbe70 | 119 | uint32_t current_sample_index = WAITING_TO_BEGIN; |
timmey9 | 22:523e316cbe70 | 120 | uint32_t sample_array[TOTAL_SAMPLES]; |
timmey9 | 22:523e316cbe70 | 121 | uint16_t angle_array[TOTAL_SAMPLES]; |
timmey9 | 22:523e316cbe70 | 122 | |
timmey9 | 22:523e316cbe70 | 123 | |
timmey9 | 22:523e316cbe70 | 124 | // Declaration of functions |
timmey9 | 22:523e316cbe70 | 125 | void analog_initialization(PinName pin); |
timmey9 | 22:523e316cbe70 | 126 | void output_data(uint32_t iteration_number); |
timmey9 | 22:523e316cbe70 | 127 | void timed_sampling(); |
timmey9 | 22:523e316cbe70 | 128 | |
timmey9 | 22:523e316cbe70 | 129 | |
timmey9 | 22:523e316cbe70 | 130 | // Important globabl variables necessary for the sampling every interval |
timmey9 | 22:523e316cbe70 | 131 | int rotary_count = 0; |
timmey9 | 22:523e316cbe70 | 132 | uint32_t last_AMT20_AB_read = 0; |
timmey9 | 22:523e316cbe70 | 133 | */ |
timmey9 | 22:523e316cbe70 | 134 | //using namespace network; |
timmey9 | 22:523e316cbe70 | 135 | using namespace std; |
timmey9 | 17:2f978f823020 | 136 | |
emilmont | 7:65188f4a8c25 | 137 | int main() { |
timmey9 | 22:523e316cbe70 | 138 | uint32_t sample_array[TOTAL_SAMPLES]; |
timmey9 | 22:523e316cbe70 | 139 | for(int i = 0; i < TOTAL_SAMPLES; i++) {sample_array[i] = i;} |
timmey9 | 22:523e316cbe70 | 140 | led_blue = 1; |
timmey9 | 22:523e316cbe70 | 141 | led_green = 1; |
timmey9 | 18:b17ddeeb1c09 | 142 | led_red = 1; |
timmey9 | 22:523e316cbe70 | 143 | |
timmey9 | 18:b17ddeeb1c09 | 144 | pc.baud(230400); |
timmey9 | 18:b17ddeeb1c09 | 145 | pc.printf("Starting Server\r\n"); |
timmey9 | 22:523e316cbe70 | 146 | /* |
timmey9 | 22:523e316cbe70 | 147 | analog_initialization(A0); |
timmey9 | 22:523e316cbe70 | 148 | analog_initialization(A2); |
timmey9 | 20:f533b3c9296f | 149 | |
timmey9 | 22:523e316cbe70 | 150 | // setup this timer |
timmey9 | 22:523e316cbe70 | 151 | timeStamp.stop(); |
timmey9 | 22:523e316cbe70 | 152 | timeStamp.reset(); |
timmey9 | 22:523e316cbe70 | 153 | |
timmey9 | 22:523e316cbe70 | 154 | // Start the sampling loop |
timmey9 | 22:523e316cbe70 | 155 | current_sample_index = WAITING_TO_BEGIN; |
timmey9 | 22:523e316cbe70 | 156 | Sampler.attach_us(&timed_sampling, SAMPLING_RATE); |
timmey9 | 22:523e316cbe70 | 157 | __disable_irq(); // Disable Interrupts |
timmey9 | 22:523e316cbe70 | 158 | timer.reset(); |
timmey9 | 22:523e316cbe70 | 159 | timer.start(); |
timmey9 | 22:523e316cbe70 | 160 | |
timmey9 | 22:523e316cbe70 | 161 | uint32_t trigger_count = 0; |
timmey9 | 22:523e316cbe70 | 162 | |
timmey9 | 22:523e316cbe70 | 163 | // corresponding duty 1 0 0.7 1 0.75 |
timmey9 | 22:523e316cbe70 | 164 | uint32_t duration[8] = {10000, 60000, 10000, 39000, 7000, 7000, 0, 0}; |
timmey9 | 22:523e316cbe70 | 165 | //uint32_t duration[8] = {10000, 100000, 10000, 92000, 25000, 7000, 0, 0}; |
timmey9 | 22:523e316cbe70 | 166 | int32_t pointer = 0; |
timmey9 | 22:523e316cbe70 | 167 | |
timmey9 | 22:523e316cbe70 | 168 | double duty_cycle = 0.25; |
timmey9 | 22:523e316cbe70 | 169 | */ |
timmey9 | 22:523e316cbe70 | 170 | // flash red LED |
timmey9 | 22:523e316cbe70 | 171 | led_red = 0; |
timmey9 | 22:523e316cbe70 | 172 | wait_ms(500); |
timmey9 | 22:523e316cbe70 | 173 | led_red = 1; |
timmey9 | 22:523e316cbe70 | 174 | |
timmey9 | 22:523e316cbe70 | 175 | |
timmey9 | 22:523e316cbe70 | 176 | |
timmey9 | 22:523e316cbe70 | 177 | |
timmey9 | 22:523e316cbe70 | 178 | |
timmey9 | 22:523e316cbe70 | 179 | |
timmey9 | 22:523e316cbe70 | 180 | |
timmey9 | 22:523e316cbe70 | 181 | // initialize ethernet connection and server |
timmey9 | 17:2f978f823020 | 182 | EthernetInterface interface; |
timmey9 | 22:523e316cbe70 | 183 | |
timmey9 | 21:1fb5023b72af | 184 | #if STATIC == 1 |
timmey9 | 20:f533b3c9296f | 185 | interface.init(IP, MASK, GATEWAY); |
timmey9 | 20:f533b3c9296f | 186 | #else |
timmey9 | 17:2f978f823020 | 187 | interface.init(); |
timmey9 | 20:f533b3c9296f | 188 | #endif |
timmey9 | 21:1fb5023b72af | 189 | |
timmey9 | 22:523e316cbe70 | 190 | // turn on yellow led |
timmey9 | 22:523e316cbe70 | 191 | led_red = 0; |
timmey9 | 22:523e316cbe70 | 192 | led_green = 0; |
timmey9 | 22:523e316cbe70 | 193 | |
timmey9 | 17:2f978f823020 | 194 | interface.connect(); |
timmey9 | 21:1fb5023b72af | 195 | pc.printf(NAME); |
timmey9 | 20:f533b3c9296f | 196 | pc.printf("IP Address is: %s\n\r", interface.getIPAddress()); |
timmey9 | 20:f533b3c9296f | 197 | pc.printf("Network Mask is: %s\n\r", interface.getNetworkMask()); |
timmey9 | 20:f533b3c9296f | 198 | pc.printf("MAC address is: %s\n\r", interface.getMACAddress()); |
timmey9 | 20:f533b3c9296f | 199 | pc.printf("Gateway is: %s\n\r", interface.getGateway()); |
timmey9 | 21:1fb5023b72af | 200 | pc.printf("Port is: %i\n\r", PORT); |
timmey9 | 20:f533b3c9296f | 201 | |
timmey9 | 22:523e316cbe70 | 202 | // ethernet setup failed for some reason. Flash yellow light then uC resets itself |
timmey9 | 22:523e316cbe70 | 203 | /*if(interface.getIPAddress() == 0) |
timmey9 | 22:523e316cbe70 | 204 | { |
timmey9 | 22:523e316cbe70 | 205 | for(int i = 0; i < 5; i++) |
timmey9 | 22:523e316cbe70 | 206 | { |
timmey9 | 22:523e316cbe70 | 207 | led_red = 0; |
timmey9 | 22:523e316cbe70 | 208 | led_green = 0; |
timmey9 | 22:523e316cbe70 | 209 | wait_ms(500); |
timmey9 | 22:523e316cbe70 | 210 | led_red = 1; |
timmey9 | 22:523e316cbe70 | 211 | led_green = 1; |
timmey9 | 22:523e316cbe70 | 212 | wait_ms(1000); |
timmey9 | 22:523e316cbe70 | 213 | } |
timmey9 | 22:523e316cbe70 | 214 | NVIC_SystemReset(); |
timmey9 | 22:523e316cbe70 | 215 | }*/ |
timmey9 | 22:523e316cbe70 | 216 | |
timmey9 | 22:523e316cbe70 | 217 | network::Select select; |
timmey9 | 22:523e316cbe70 | 218 | network::tcp::Socket server; |
timmey9 | 22:523e316cbe70 | 219 | network::tcp::Socket client[MAX_CLIENTS]; |
timmey9 | 22:523e316cbe70 | 220 | network::tcp::Socket *socket = NULL; |
timmey9 | 17:2f978f823020 | 221 | |
timmey9 | 17:2f978f823020 | 222 | int result = 0; |
timmey9 | 17:2f978f823020 | 223 | int index = 0; |
timmey9 | 17:2f978f823020 | 224 | |
timmey9 | 22:523e316cbe70 | 225 | network::Buffer buffer(TOTAL_SAMPLES); |
timmey9 | 21:1fb5023b72af | 226 | std::string message(NAME); |
timmey9 | 17:2f978f823020 | 227 | |
timmey9 | 21:1fb5023b72af | 228 | // Configure the server socket (assume every thing works) |
timmey9 | 17:2f978f823020 | 229 | server.open(); |
timmey9 | 20:f533b3c9296f | 230 | server.bind(PORT); |
timmey9 | 17:2f978f823020 | 231 | server.listen(MAX_CLIENTS); |
timmey9 | 17:2f978f823020 | 232 | |
timmey9 | 17:2f978f823020 | 233 | // Add sockets to the select api |
timmey9 | 22:523e316cbe70 | 234 | select.set(&server, network::Select::Read); |
timmey9 | 17:2f978f823020 | 235 | for (index = 0; index < MAX_CLIENTS; index++) { |
timmey9 | 22:523e316cbe70 | 236 | select.set(&client[index], network::Select::Read); |
timmey9 | 17:2f978f823020 | 237 | } |
timmey9 | 22:523e316cbe70 | 238 | |
timmey9 | 22:523e316cbe70 | 239 | led_red = 1; |
timmey9 | 22:523e316cbe70 | 240 | led_green = 1; |
timmey9 | 22:523e316cbe70 | 241 | led_blue = 0; |
timmey9 | 22:523e316cbe70 | 242 | wait_ms(1000); |
timmey9 | 22:523e316cbe70 | 243 | led_blue = 1; |
timmey9 | 22:523e316cbe70 | 244 | |
timmey9 | 22:523e316cbe70 | 245 | |
timmey9 | 17:2f978f823020 | 246 | do { |
timmey9 | 17:2f978f823020 | 247 | // Wait for activity |
timmey9 | 17:2f978f823020 | 248 | result = select.wait(); |
timmey9 | 17:2f978f823020 | 249 | if (result < -1) { |
timmey9 | 18:b17ddeeb1c09 | 250 | pc.printf("Failed to select\n\r"); |
emilmont | 7:65188f4a8c25 | 251 | break; |
timmey9 | 16:c3f922f61b8f | 252 | } |
timmey9 | 17:2f978f823020 | 253 | |
timmey9 | 17:2f978f823020 | 254 | // Get the first socket |
timmey9 | 22:523e316cbe70 | 255 | socket = (network::tcp::Socket *)select.getReadable(); |
timmey9 | 17:2f978f823020 | 256 | |
timmey9 | 22:523e316cbe70 | 257 | for (; socket != NULL; socket = (network::tcp::Socket *)select.getReadable()) { |
timmey9 | 17:2f978f823020 | 258 | // Check if there was a connection request. |
timmey9 | 17:2f978f823020 | 259 | if (socket->getHandle() == server.getHandle()) { |
timmey9 | 17:2f978f823020 | 260 | // Find an unused client |
timmey9 | 17:2f978f823020 | 261 | for (index = 0; index < MAX_CLIENTS; index++) { |
timmey9 | 17:2f978f823020 | 262 | if (client[index].getStatus() == network::Socket::Closed) { |
timmey9 | 17:2f978f823020 | 263 | break; |
timmey9 | 17:2f978f823020 | 264 | } |
timmey9 | 17:2f978f823020 | 265 | } |
timmey9 | 17:2f978f823020 | 266 | |
timmey9 | 17:2f978f823020 | 267 | // Maximum connections reached |
timmey9 | 17:2f978f823020 | 268 | if (index == MAX_CLIENTS) { |
timmey9 | 18:b17ddeeb1c09 | 269 | pc.printf("Maximum connections reached\n\r"); |
timmey9 | 21:1fb5023b72af | 270 | wait(1); |
timmey9 | 17:2f978f823020 | 271 | continue; |
timmey9 | 17:2f978f823020 | 272 | } |
timmey9 | 20:f533b3c9296f | 273 | |
timmey9 | 17:2f978f823020 | 274 | // Accept the client |
timmey9 | 17:2f978f823020 | 275 | socket->accept(client[index]); |
timmey9 | 18:b17ddeeb1c09 | 276 | pc.printf("Client connected %s:%d\n\r", |
timmey9 | 17:2f978f823020 | 277 | client[index].getRemoteEndpoint().getAddress().toString().c_str(), |
timmey9 | 17:2f978f823020 | 278 | client[index].getRemoteEndpoint().getPort()); |
timmey9 | 17:2f978f823020 | 279 | |
timmey9 | 21:1fb5023b72af | 280 | // Send a nice message to the client (tell MATLAB your name |
timmey9 | 17:2f978f823020 | 281 | client[index].write((void *)message.data(), message.size()); |
timmey9 | 20:f533b3c9296f | 282 | |
timmey9 | 20:f533b3c9296f | 283 | // read some registers for some info. |
timmey9 | 20:f533b3c9296f | 284 | //uint32_t* rcr = (uint32_t*) 0x400C0084; |
timmey9 | 20:f533b3c9296f | 285 | //uint32_t* ecr = (uint32_t*) 0x400C0024; |
timmey9 | 20:f533b3c9296f | 286 | //pc.printf("RCR register: %x\r\n", *rcr); |
timmey9 | 20:f533b3c9296f | 287 | //pc.printf("ECR register: %x\r\n", *ecr); |
timmey9 | 20:f533b3c9296f | 288 | |
timmey9 | 17:2f978f823020 | 289 | continue; |
timmey9 | 16:c3f922f61b8f | 290 | } |
timmey9 | 20:f533b3c9296f | 291 | |
timmey9 | 17:2f978f823020 | 292 | // It was not the server socket, so it must be a client talking to us. |
timmey9 | 17:2f978f823020 | 293 | switch (socket->read(buffer)) { |
timmey9 | 17:2f978f823020 | 294 | case 0: |
timmey9 | 17:2f978f823020 | 295 | // Remote end disconnected |
timmey9 | 18:b17ddeeb1c09 | 296 | pc.printf("Client disconnected %s:%d\n\r", |
timmey9 | 17:2f978f823020 | 297 | socket->getRemoteEndpoint().getAddress().toString().c_str(), |
timmey9 | 17:2f978f823020 | 298 | socket->getRemoteEndpoint().getPort()); |
timmey9 | 17:2f978f823020 | 299 | |
timmey9 | 17:2f978f823020 | 300 | // Close socket |
timmey9 | 17:2f978f823020 | 301 | socket->close(); |
timmey9 | 17:2f978f823020 | 302 | break; |
timmey9 | 20:f533b3c9296f | 303 | |
timmey9 | 17:2f978f823020 | 304 | case -1: |
timmey9 | 18:b17ddeeb1c09 | 305 | pc.printf("Error while reading data from socket\n\r"); |
timmey9 | 17:2f978f823020 | 306 | socket->close(); |
timmey9 | 17:2f978f823020 | 307 | break; |
timmey9 | 20:f533b3c9296f | 308 | //************* this is where data is printed to the screen |
timmey9 | 17:2f978f823020 | 309 | default: |
timmey9 | 18:b17ddeeb1c09 | 310 | pc.printf("Message from %s:%d\n\r", |
timmey9 | 17:2f978f823020 | 311 | socket->getRemoteEndpoint().getAddress().toString().c_str(), |
timmey9 | 17:2f978f823020 | 312 | socket->getRemoteEndpoint().getPort()); |
timmey9 | 17:2f978f823020 | 313 | |
timmey9 | 21:1fb5023b72af | 314 | pc.printf("%s\n\r", (char *)buffer.data()); |
timmey9 | 21:1fb5023b72af | 315 | |
timmey9 | 21:1fb5023b72af | 316 | // read first character for command |
timmey9 | 21:1fb5023b72af | 317 | char command[2]; |
timmey9 | 21:1fb5023b72af | 318 | buffer.read(command,2,0); |
timmey9 | 21:1fb5023b72af | 319 | if(command[1] == ':') { |
timmey9 | 21:1fb5023b72af | 320 | switch(command[0]) |
timmey9 | 21:1fb5023b72af | 321 | { |
timmey9 | 21:1fb5023b72af | 322 | case 'b': |
timmey9 | 21:1fb5023b72af | 323 | led_blue = !led_blue; |
timmey9 | 21:1fb5023b72af | 324 | client[index].write((void *)"Blue LED\n",9); |
timmey9 | 21:1fb5023b72af | 325 | break; |
timmey9 | 21:1fb5023b72af | 326 | case 'r': |
timmey9 | 21:1fb5023b72af | 327 | led_red = !led_red; |
timmey9 | 21:1fb5023b72af | 328 | client[index].write((void *)"Red LED\n",8); |
timmey9 | 21:1fb5023b72af | 329 | break; |
timmey9 | 21:1fb5023b72af | 330 | case 'p': |
timmey9 | 21:1fb5023b72af | 331 | led_green = !led_green; |
timmey9 | 21:1fb5023b72af | 332 | client[index].write((void *)"Data\n",5); |
timmey9 | 22:523e316cbe70 | 333 | client[index].write((void *)&sample_array,TOTAL_SAMPLES); |
timmey9 | 21:1fb5023b72af | 334 | } |
timmey9 | 21:1fb5023b72af | 335 | } |
timmey9 | 21:1fb5023b72af | 336 | else { |
timmey9 | 21:1fb5023b72af | 337 | |
timmey9 | 21:1fb5023b72af | 338 | } |
timmey9 | 21:1fb5023b72af | 339 | |
timmey9 | 21:1fb5023b72af | 340 | |
timmey9 | 20:f533b3c9296f | 341 | |
timmey9 | 20:f533b3c9296f | 342 | //***************** print a message back to the client |
timmey9 | 21:1fb5023b72af | 343 | |
timmey9 | 21:1fb5023b72af | 344 | //client[index].write((void *)&sample_array,SAMPLES); |
timmey9 | 21:1fb5023b72af | 345 | |
timmey9 | 21:1fb5023b72af | 346 | |
timmey9 | 21:1fb5023b72af | 347 | |
timmey9 | 20:f533b3c9296f | 348 | |
timmey9 | 21:1fb5023b72af | 349 | /*for(int i = 1; i <= SAMPLES+1;) |
timmey9 | 21:1fb5023b72af | 350 | { |
timmey9 | 21:1fb5023b72af | 351 | for(int j = 0; j < 20; j++) |
timmey9 | 21:1fb5023b72af | 352 | { |
timmey9 | 21:1fb5023b72af | 353 | Timer timeStamp; |
timmey9 | 21:1fb5023b72af | 354 | timeStamp.stop(); |
timmey9 | 21:1fb5023b72af | 355 | timeStamp.reset(); |
timmey9 | 21:1fb5023b72af | 356 | timeStamp.start(); |
timmey9 | 21:1fb5023b72af | 357 | |
timmey9 | 21:1fb5023b72af | 358 | client[index].write((void *)&sample_array,i); |
timmey9 | 21:1fb5023b72af | 359 | int timeStampVar = timeStamp.read_us(); |
timmey9 | 21:1fb5023b72af | 360 | timeStamp.stop(); |
timmey9 | 21:1fb5023b72af | 361 | |
timmey9 | 21:1fb5023b72af | 362 | pc.printf("*******\r\n%i\r\nTime taken to send data: %i\r\n", i,timeStampVar); |
timmey9 | 21:1fb5023b72af | 363 | |
timmey9 | 21:1fb5023b72af | 364 | char premessage[40]; |
timmey9 | 21:1fb5023b72af | 365 | sprintf(premessage, "******\r\n%i\r\nTime taken to send data: %i\r\n", i, timeStampVar); |
timmey9 | 21:1fb5023b72af | 366 | std::string response1 = premessage; |
timmey9 | 21:1fb5023b72af | 367 | client[index].write((void *)response1.data(), response1.size()); |
timmey9 | 21:1fb5023b72af | 368 | wait_us(5000); |
timmey9 | 21:1fb5023b72af | 369 | } |
timmey9 | 21:1fb5023b72af | 370 | if(i == 10000) i = SAMPLES; |
timmey9 | 21:1fb5023b72af | 371 | else if(i == SAMPLES) i = i*10; |
timmey9 | 21:1fb5023b72af | 372 | else i = i*10; |
timmey9 | 21:1fb5023b72af | 373 | } |
timmey9 | 21:1fb5023b72af | 374 | std::string endMessage("end"); |
timmey9 | 21:1fb5023b72af | 375 | client[index].write((void *)endMessage.data(), endMessage.size()); |
timmey9 | 21:1fb5023b72af | 376 | */ |
timmey9 | 17:2f978f823020 | 377 | break; |
timmey9 | 17:2f978f823020 | 378 | } |
timmey9 | 16:c3f922f61b8f | 379 | } |
timmey9 | 17:2f978f823020 | 380 | |
timmey9 | 17:2f978f823020 | 381 | } while (server.getStatus() == network::Socket::Listening); |
timmey9 | 22:523e316cbe70 | 382 | } |
timmey9 | 22:523e316cbe70 | 383 | /* |
timmey9 | 22:523e316cbe70 | 384 | void timed_sampling() { |
timmey9 | 22:523e316cbe70 | 385 | __disable_irq(); // Disable Interrupts |
timmey9 | 22:523e316cbe70 | 386 | timeStamp.start(); |
timmey9 | 22:523e316cbe70 | 387 | |
timmey9 | 22:523e316cbe70 | 388 | // The following performs analog-to-digital conversions - first reading the last conversion - then initiating another |
timmey9 | 22:523e316cbe70 | 389 | uint32_t A0_value = adc_hal_get_conversion_value(0, 0); |
timmey9 | 22:523e316cbe70 | 390 | uint32_t A2_value = adc_hal_get_conversion_value(1, 0); |
timmey9 | 22:523e316cbe70 | 391 | BW_ADC_SC1n_ADCH(0, 0, kAdcChannel12); // This corresponds to starting an ADC conversion on channel 12 of ADC 0 - which is A0 (PTB2) |
timmey9 | 22:523e316cbe70 | 392 | BW_ADC_SC1n_ADCH(1, 0, kAdcChannel14); // This corresponds to starting an ADC conversion on channel 14 of ADC 1 - which is A2 (PTB10) |
timmey9 | 22:523e316cbe70 | 393 | |
timmey9 | 22:523e316cbe70 | 394 | // The following updates the rotary counter for the AMT20 sensor |
timmey9 | 22:523e316cbe70 | 395 | // Put A on PTC0 |
timmey9 | 22:523e316cbe70 | 396 | // Put B on PTC1 |
timmey9 | 22:523e316cbe70 | 397 | uint32_t AMT20_AB = HW_GPIO_PDIR_RD(HW_PORTC) & 0x03; |
timmey9 | 22:523e316cbe70 | 398 | //AMT20_AB = ~last_AMT20_AB_read; // Used to force a count - extend time. |
timmey9 | 22:523e316cbe70 | 399 | if (AMT20_AB != last_AMT20_AB_read) |
timmey9 | 22:523e316cbe70 | 400 | { |
timmey9 | 22:523e316cbe70 | 401 | // change "INVERT_ANGLE" to change whether relative angle counts up or down. |
timmey9 | 22:523e316cbe70 | 402 | if ((AMT20_AB >> 1)^(last_AMT20_AB_read) & 1U) |
timmey9 | 22:523e316cbe70 | 403 | #if INVERT_ANGLE == 1 |
timmey9 | 22:523e316cbe70 | 404 | {rotary_count--;} |
timmey9 | 22:523e316cbe70 | 405 | else |
timmey9 | 22:523e316cbe70 | 406 | {rotary_count++;} |
timmey9 | 22:523e316cbe70 | 407 | #else |
timmey9 | 22:523e316cbe70 | 408 | {rotary_count++;} |
timmey9 | 22:523e316cbe70 | 409 | else |
timmey9 | 22:523e316cbe70 | 410 | {rotary_count--;} |
timmey9 | 22:523e316cbe70 | 411 | #endif |
timmey9 | 22:523e316cbe70 | 412 | |
timmey9 | 22:523e316cbe70 | 413 | last_AMT20_AB_read = AMT20_AB; |
timmey9 | 22:523e316cbe70 | 414 | } |
timmey9 | 22:523e316cbe70 | 415 | //current_sample_index = BEGIN_SAMPLING; // Used to force extra time. |
timmey9 | 22:523e316cbe70 | 416 | if (current_sample_index == WAITING_TO_BEGIN) {} |
timmey9 | 22:523e316cbe70 | 417 | else |
timmey9 | 22:523e316cbe70 | 418 | { |
timmey9 | 22:523e316cbe70 | 419 | if (current_sample_index == BEGIN_SAMPLING) { |
timmey9 | 22:523e316cbe70 | 420 | current_sample_index = FIRST_SAMPLE_INDEX; |
timmey9 | 22:523e316cbe70 | 421 | } |
timmey9 | 22:523e316cbe70 | 422 | |
timmey9 | 22:523e316cbe70 | 423 | sample_array[current_sample_index] = (A0_value << CHANNEL_STORAGE_OFFSET) | A2_value; |
timmey9 | 22:523e316cbe70 | 424 | |
timmey9 | 22:523e316cbe70 | 425 | angle_array[current_sample_index] = rotary_count; |
timmey9 | 22:523e316cbe70 | 426 | |
timmey9 | 22:523e316cbe70 | 427 | if (current_sample_index == LAST_SAMPLE_INDEX) { |
timmey9 | 22:523e316cbe70 | 428 | current_sample_index = WAITING_TO_BEGIN; |
timmey9 | 22:523e316cbe70 | 429 | //led_green = 1; |
timmey9 | 22:523e316cbe70 | 430 | } |
timmey9 | 22:523e316cbe70 | 431 | else { current_sample_index++; } |
timmey9 | 22:523e316cbe70 | 432 | } |
timmey9 | 22:523e316cbe70 | 433 | |
timmey9 | 22:523e316cbe70 | 434 | int tempVar = timeStamp.read_us(); |
timmey9 | 22:523e316cbe70 | 435 | timeStamp.stop(); |
timmey9 | 22:523e316cbe70 | 436 | timeStamp.reset(); |
timmey9 | 22:523e316cbe70 | 437 | pc.printf("TimeStamp: %i\r\n", tempVar); |
timmey9 | 22:523e316cbe70 | 438 | __enable_irq(); // Enable Interrupts |
timmey9 | 22:523e316cbe70 | 439 | } |
timmey9 | 22:523e316cbe70 | 440 | |
timmey9 | 22:523e316cbe70 | 441 | void analog_initialization(PinName pin) |
timmey9 | 22:523e316cbe70 | 442 | { |
timmey9 | 22:523e316cbe70 | 443 | ADCName adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC); |
timmey9 | 22:523e316cbe70 | 444 | // MBED_ASSERT(adc != (ADCName)NC); |
timmey9 | 22:523e316cbe70 | 445 | |
timmey9 | 22:523e316cbe70 | 446 | uint32_t instance = adc >> ADC_INSTANCE_SHIFT; |
timmey9 | 22:523e316cbe70 | 447 | |
timmey9 | 22:523e316cbe70 | 448 | clock_manager_set_gate(kClockModuleADC, instance, true); |
timmey9 | 22:523e316cbe70 | 449 | |
timmey9 | 22:523e316cbe70 | 450 | uint32_t bus_clock; |
timmey9 | 22:523e316cbe70 | 451 | clock_manager_get_frequency(kBusClock, &bus_clock); |
timmey9 | 22:523e316cbe70 | 452 | uint32_t clkdiv; |
timmey9 | 22:523e316cbe70 | 453 | for (clkdiv = 0; clkdiv < 4; clkdiv++) { |
timmey9 | 22:523e316cbe70 | 454 | if ((bus_clock >> clkdiv) <= MAX_FADC) |
timmey9 | 22:523e316cbe70 | 455 | break; |
timmey9 | 22:523e316cbe70 | 456 | } |
timmey9 | 22:523e316cbe70 | 457 | if (clkdiv == 4) { |
timmey9 | 22:523e316cbe70 | 458 | clkdiv = 0x7; //Set max div |
timmey9 | 22:523e316cbe70 | 459 | } |
timmey9 | 22:523e316cbe70 | 460 | // adc is enabled/triggered when reading. |
timmey9 | 22:523e316cbe70 | 461 | adc_hal_set_clock_source_mode(instance, (adc_clock_source_mode_t)(clkdiv >> 2)); |
timmey9 | 22:523e316cbe70 | 462 | adc_hal_set_clock_divider_mode(instance, (adc_clock_divider_mode_t)(clkdiv & 0x3)); |
timmey9 | 22:523e316cbe70 | 463 | adc_hal_set_reference_voltage_mode(instance, kAdcVoltageVref); |
timmey9 | 22:523e316cbe70 | 464 | adc_hal_set_resolution_mode(instance, kAdcSingleDiff16); |
timmey9 | 22:523e316cbe70 | 465 | adc_hal_configure_continuous_conversion(instance, false); |
timmey9 | 22:523e316cbe70 | 466 | adc_hal_configure_hw_trigger(instance, false); // sw trigger |
timmey9 | 22:523e316cbe70 | 467 | adc_hal_configure_hw_average(instance, false); |
timmey9 | 22:523e316cbe70 | 468 | adc_hal_set_hw_average_mode(instance, kAdcHwAverageCount4); |
timmey9 | 22:523e316cbe70 | 469 | adc_hal_set_group_mux(instance, kAdcChannelMuxB); // only B channels are avail |
timmey9 | 22:523e316cbe70 | 470 | |
timmey9 | 22:523e316cbe70 | 471 | pinmap_pinout(pin, PinMap_ADC); |
timmey9 | 22:523e316cbe70 | 472 | } |
timmey9 | 22:523e316cbe70 | 473 | |
timmey9 | 22:523e316cbe70 | 474 | void output_data(uint32_t iteration_number) |
timmey9 | 22:523e316cbe70 | 475 | { |
timmey9 | 22:523e316cbe70 | 476 | pc.printf("Iteration: %i\n\r", iteration_number); |
timmey9 | 22:523e316cbe70 | 477 | pc.printf("Sampling rate: %i\n\r", SAMPLING_RATE); |
timmey9 | 22:523e316cbe70 | 478 | pc.printf("Data length: %i\n\r", TOTAL_SAMPLES); |
timmey9 | 22:523e316cbe70 | 479 | for (int n = FIRST_SAMPLE_INDEX; n <= LAST_SAMPLE_INDEX; n++) { |
timmey9 | 22:523e316cbe70 | 480 | //pc.printf("%i\t%i\t%i\r\n", (sample_array[n] >> CHANNEL_STORAGE_OFFSET), (sample_array[n] & 0xFFFF), angle_array[n]); |
timmey9 | 22:523e316cbe70 | 481 | } |
timmey9 | 22:523e316cbe70 | 482 | |
timmey9 | 22:523e316cbe70 | 483 | } |
timmey9 | 22:523e316cbe70 | 484 | */ |