Implementation of AFE4404 in mbed and C#

Dependencies:   AFE4404 EthernetInterface HTTPServer mbed-rpc mbed-rtos mbed

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?

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