Alex Whittemore
/
BURTDAQ
Program to run data acquisition and control for BU Rocket Team's MKII hybrid rocket motor
Diff: main.cpp
- Revision:
- 0:7fd45d2b5926
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Apr 09 16:39:50 2012 +0000 @@ -0,0 +1,144 @@ +#include "mbed.h" +#include "rtos.h" +#include "burtdaq.h" +#include <vector> +#include "FastIO.h" +#include <stdio.h> // printf +#include <string.h> // strcat +#include <stdlib.h> // strtol + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); +//Serial pc(USBTX,USBRX); +Serial xbee(XBEETX,XBEERX); + +//Queue<uint8_t, 50> queue; + +#define kDisplayWidth 32 +char* pBinFill(long int x,char *so, char fillChar) +{ // fill in array from right to left + char s[kDisplayWidth+1]; + int i=kDisplayWidth; + s[i--]=0x00; // terminate string + do + { // fill in array from right to left + s[i--]=(x & 1) ? '1':'0'; + x>>=1; // shift right 1 bit + } while( x > 0); + while(i>=0) s[i--]=fillChar; // fill with fillChar + sprintf(so,"%s",s); + return so; +} + + +void bridgeReader(void const *argument) { + SPI spia(NC, SPIA_MISO, SPIA_CLK); + spia.format(16); + spia.frequency(1000000); + //DigitalOut spia_mosi(SPIA_MOSI); + FastOut<SPIA_MOSI> spia_mosi; + + FastPortOut<Port0, SPIA_CS_PORT_MASK> spiaCSPort; + //PortOut spiaCSPort(Port0, SPIA_CS_PORT_MASK); + unsigned int bridgeCSPinMasks[5] = {SPIA_P1_CS_PORT_MASK, SPIA_P2_CS_PORT_MASK, SPIA_P3_CS_PORT_MASK, SPIA_P4_CS_PORT_MASK}; + int deviceCount = 4; + + spiaCSPort = SPIA_CS_PORT_MASK; + + uint16_t outputs[4] = {0x0f0f, 0xf0f0, 0x0000, 0x0000}; + //bridgeCSPins = 3; + printf("ENTERING READ LOOP\n"); + while(true) { + __disable_irq(); + led2 = 1; + // READ BRIDGES + spia_mosi = 1; + int i = 0; // This constitutes ROUGHLY a 500ns delay + while(i<10) + i++; + for(i=0; i<deviceCount; i++){ + spiaCSPort = ~bridgeCSPinMasks[i]; + outputs[i] = spia.write(0x0); + } + spiaCSPort = SPIA_CS_PORT_MASK; + //spiaCSPort = 1; + spia_mosi = 0; + // END READING + + printf("%u, %u, %u, %u\n",outputs[0],outputs[1],outputs[2],outputs[3]); + led2 = 0; + __enable_irq(); + Thread::wait(5000); + } +} +void tcReader(void const *argument) { + SPI spib(SPIB_MOSI, SPIB_MISO, SPIB_CLK); + spib.format(16); + spib.frequency(1000000); + + DigitalOut spibCSPins[] = {SPIB_P1_CS, SPIB_P2_CS, SPIB_P3_CS}; + spibCSPins[0]=1; + spibCSPins[1]=1; + spibCSPins[2]=1; + + int numTCs = 3; + uint32_t rawTcData[3] = {0,0,0}; + uint32_t tcData[3] = {0,0,0}; + uint32_t ambientData[3] = {0,0,0}; + + float humanTcData[3] = {0,0,0}; + float humanAmbientData[3] = {0,0,0}; + + uint32_t buffer = 0; + char so[kDisplayWidth+1]; + while (true) { + __disable_irq(); + led3 = 1; + for(int i=0; i<numTCs; i++){ + rawTcData[i] = 0; + spibCSPins[i] = 0; + buffer = spib.write(0); + //printf("%s\n",binary_fmt(buffer,tmp)); + rawTcData[i] = (buffer << 16); + buffer = spib.write(0); + rawTcData[i] |= (buffer); + spibCSPins[i] = 1; + } + //printf("%s %s %s\n", byte_to_binary(tcData[0]), byte_to_binary(tcData[1]), byte_to_binary(tcData[2])); + //printf("Data is: %s %s %s\n",pBinFill(tcData[0], so, '0'), pBinFill(tcData[1], so, '0'), pBinFill(tcData[2], so, '0')); + + for(int i=0; i<numTCs; i++){ + tcData[i] = ((rawTcData[i] & 0xFFFC0000) >> 18); + ambientData[i] = ((rawTcData[i] & 0xFFF0) >> 4); + humanTcData[i] = (float) tcData[i] * .25; + humanAmbientData[i] = (float) ambientData[i]*.0625; + printf("Thermocouple %d ambient: %f, tc:%f\n",i,humanAmbientData[i],humanTcData[i]); + } + led3=0; + __enable_irq(); + Thread::wait(2000); + } +} + +void xbeeISR() { + led4 = !led4; +} + +int main() { + printf("Starting reader\n"); + Thread bridgeReader1(bridgeReader); + Thread tcReader1(tcReader); + //Thread actuatorController1(actuatorController); + + xbee.baud(115200); + xbee.attach(&xbeeISR); + int i = 0; + while(1){ + //xbee.printf("In Range: %d",i); + i++; + led1 = !led1; + Thread::wait(1000); + } +}