Implementation of AFE4404 in mbed and C#
Dependencies: AFE4404 EthernetInterface HTTPServer mbed-rpc mbed-rtos mbed
main.cpp@0:70a556780334, 2017-05-04 (annotated)
- Committer:
- dotunhunter
- Date:
- Thu May 04 12:12:05 2017 +0000
- Revision:
- 0:70a556780334
First commit with working GUI and mbed code to obtain PPG data from AFE4404
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dotunhunter | 0:70a556780334 | 1 | #include "mbed.h" |
dotunhunter | 0:70a556780334 | 2 | #include "EthernetInterface.h" |
dotunhunter | 0:70a556780334 | 3 | #include "HTTPServer.h" |
dotunhunter | 0:70a556780334 | 4 | #include "mbed_rpc.h" |
dotunhunter | 0:70a556780334 | 5 | #include "RPCFunction.h" |
dotunhunter | 0:70a556780334 | 6 | #include "AFE_4404.h" |
dotunhunter | 0:70a556780334 | 7 | |
dotunhunter | 0:70a556780334 | 8 | EthernetInterface eth; |
dotunhunter | 0:70a556780334 | 9 | HTTPServer svr; |
dotunhunter | 0:70a556780334 | 10 | |
dotunhunter | 0:70a556780334 | 11 | int baudRate = 115200; |
dotunhunter | 0:70a556780334 | 12 | Serial pc(USBTX, USBRX); |
dotunhunter | 0:70a556780334 | 13 | |
dotunhunter | 0:70a556780334 | 14 | extern int32_t data; |
dotunhunter | 0:70a556780334 | 15 | extern bool dataAvailable; |
dotunhunter | 0:70a556780334 | 16 | // p22: rxSupplyEn, p8: txSupplyEn, p6: resetz, p7: powerEn, |
dotunhunter | 0:70a556780334 | 17 | // p5: drdy, p21: clk, p9: sda, p10: scl |
dotunhunter | 0:70a556780334 | 18 | AFE_4404 afe(p22, p8, p6, p7, p5, p21, p9, p10); |
dotunhunter | 0:70a556780334 | 19 | |
dotunhunter | 0:70a556780334 | 20 | Thread rpcThread; |
dotunhunter | 0:70a556780334 | 21 | //automatically lock rpcBusy when it's been used |
dotunhunter | 0:70a556780334 | 22 | volatile bool rpcBusy = true; |
dotunhunter | 0:70a556780334 | 23 | void afeRpc(Arguments *input, Reply *output); |
dotunhunter | 0:70a556780334 | 24 | RPCFunction afeRpcFunction(&afeRpc, "afe"); |
dotunhunter | 0:70a556780334 | 25 | |
dotunhunter | 0:70a556780334 | 26 | void afeRpc(Arguments *input, Reply *output){ |
dotunhunter | 0:70a556780334 | 27 | |
dotunhunter | 0:70a556780334 | 28 | int32_t registerAddress; |
dotunhunter | 0:70a556780334 | 29 | int32_t registerData; |
dotunhunter | 0:70a556780334 | 30 | int32_t suspend; // prevents main from writing to data if it's 1 |
dotunhunter | 0:70a556780334 | 31 | |
dotunhunter | 0:70a556780334 | 32 | // prevent main loop from writing data to serial |
dotunhunter | 0:70a556780334 | 33 | rpcBusy = true; |
dotunhunter | 0:70a556780334 | 34 | Thread::wait(100); |
dotunhunter | 0:70a556780334 | 35 | |
dotunhunter | 0:70a556780334 | 36 | registerAddress = input->getArg<int32_t>(); |
dotunhunter | 0:70a556780334 | 37 | registerData = input->getArg<int32_t>(); |
dotunhunter | 0:70a556780334 | 38 | suspend = input->getArg<int32_t>(); |
dotunhunter | 0:70a556780334 | 39 | |
dotunhunter | 0:70a556780334 | 40 | // write data to afe register |
dotunhunter | 0:70a556780334 | 41 | afe.writeData( |
dotunhunter | 0:70a556780334 | 42 | static_cast<uint8_t>(registerAddress), |
dotunhunter | 0:70a556780334 | 43 | static_cast<uint32_t>(registerData)); |
dotunhunter | 0:70a556780334 | 44 | |
dotunhunter | 0:70a556780334 | 45 | output->putData(registerAddress); |
dotunhunter | 0:70a556780334 | 46 | output->putData(registerData); |
dotunhunter | 0:70a556780334 | 47 | |
dotunhunter | 0:70a556780334 | 48 | // suspend serial writes in main loop. functionality isn't currently |
dotunhunter | 0:70a556780334 | 49 | // being used, so rpcBusy is always false in current C# GUI version |
dotunhunter | 0:70a556780334 | 50 | rpcBusy = (suspend == 1) ? true : false; |
dotunhunter | 0:70a556780334 | 51 | } |
dotunhunter | 0:70a556780334 | 52 | |
dotunhunter | 0:70a556780334 | 53 | void rpcThreadRoutine() { |
dotunhunter | 0:70a556780334 | 54 | |
dotunhunter | 0:70a556780334 | 55 | printf("Setting up...\n"); |
dotunhunter | 0:70a556780334 | 56 | eth.init(); |
dotunhunter | 0:70a556780334 | 57 | |
dotunhunter | 0:70a556780334 | 58 | // wait for a while because the initialization doesn't work without the delay |
dotunhunter | 0:70a556780334 | 59 | // maybe the initialization is done asynchronously?? |
dotunhunter | 0:70a556780334 | 60 | wait(10.0); |
dotunhunter | 0:70a556780334 | 61 | |
dotunhunter | 0:70a556780334 | 62 | int ethErr = eth.connect(); |
dotunhunter | 0:70a556780334 | 63 | |
dotunhunter | 0:70a556780334 | 64 | if(ethErr < 0) |
dotunhunter | 0:70a556780334 | 65 | printf("Error %d in setup.\n", ethErr); |
dotunhunter | 0:70a556780334 | 66 | |
dotunhunter | 0:70a556780334 | 67 | svr.addHandler<HTTPRpcRequestHandler>("/rpc"); |
dotunhunter | 0:70a556780334 | 68 | //attach server to port 80 |
dotunhunter | 0:70a556780334 | 69 | svr.start(80, ð); |
dotunhunter | 0:70a556780334 | 70 | |
dotunhunter | 0:70a556780334 | 71 | // gives enough time to pause terminal application to obtain IP address |
dotunhunter | 0:70a556780334 | 72 | Thread::wait(2000); |
dotunhunter | 0:70a556780334 | 73 | printf("Listening...\n"); |
dotunhunter | 0:70a556780334 | 74 | |
dotunhunter | 0:70a556780334 | 75 | rpcBusy = false; |
dotunhunter | 0:70a556780334 | 76 | |
dotunhunter | 0:70a556780334 | 77 | //Listen indefinitely |
dotunhunter | 0:70a556780334 | 78 | while(true) { |
dotunhunter | 0:70a556780334 | 79 | svr.poll(); |
dotunhunter | 0:70a556780334 | 80 | Thread::wait(1000); |
dotunhunter | 0:70a556780334 | 81 | } |
dotunhunter | 0:70a556780334 | 82 | } |
dotunhunter | 0:70a556780334 | 83 | |
dotunhunter | 0:70a556780334 | 84 | int main() { |
dotunhunter | 0:70a556780334 | 85 | |
dotunhunter | 0:70a556780334 | 86 | pc.baud(baudRate); |
dotunhunter | 0:70a556780334 | 87 | |
dotunhunter | 0:70a556780334 | 88 | rpcThread.start(rpcThreadRoutine); |
dotunhunter | 0:70a556780334 | 89 | // spin until RPC is setup |
dotunhunter | 0:70a556780334 | 90 | while(rpcBusy) {} |
dotunhunter | 0:70a556780334 | 91 | |
dotunhunter | 0:70a556780334 | 92 | afe.powerUpSequence(); |
dotunhunter | 0:70a556780334 | 93 | |
dotunhunter | 0:70a556780334 | 94 | while(true){ |
dotunhunter | 0:70a556780334 | 95 | if(dataAvailable && !rpcBusy) { |
dotunhunter | 0:70a556780334 | 96 | pc.printf("%d ", data); |
dotunhunter | 0:70a556780334 | 97 | dataAvailable = false; |
dotunhunter | 0:70a556780334 | 98 | } |
dotunhunter | 0:70a556780334 | 99 | } |
dotunhunter | 0:70a556780334 | 100 | } |