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.
Diff: mbedInterface/mbedInterface.cpp
- Revision:
- 0:8dbd6bd9167f
- Child:
- 1:3a050d26d4f6
- Child:
- 3:d7b0a0890d96
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbedInterface/mbedInterface.cpp Tue May 19 15:45:42 2015 +0000
@@ -0,0 +1,362 @@
+#include "mbedInterface.h"
+#include "mbed.h"
+
+
+
+//--------------------------------------------------------------
+//--------------------------------------------------------------
+//This section is required for all custom harware interfaces
+
+//globals defined in hardwareInterface.cpp
+extern uint32_t timeKeeper; //the master clock
+extern bool resetTimer;
+extern bool clockSlave;
+extern bool changeToSlave;
+extern bool changeToStandAlone;
+extern outputStream textDisplay;
+
+int externalIncrementMod = 30;
+int externalIncrementCounter = 0;
+
+
+#ifdef MBED_RF
+//Karpova version----------------------------------------
+//Uses DB9->RJ45 connector to map the following channels:
+//1: P28 Clock Signal In
+//2: P27 Data Signal In
+//3: P20 FiberLED Out Signal
+//4: 5V
+//5: GND
+//6: P6 NC
+//7: P7 NC
+//8: P8 NC
+
+DigitalOut mainLED(LED1);
+DigitalOut secondaryLED(LED2);
+
+bool lightOn = false;
+bool lightOn2 = false;
+int pulseCounter = 0;
+uint32_t lastPulse = 0;
+uint32_t currentRFTime = 0;
+uint32_t lastRFTime = 0;
+uint32_t timeKeeperAtCurrentRFTime = 0;
+uint32_t timeKeeperAtLastRFTime = 0;
+int RFSyncCounter = 0;
+bool RFSyncReadable = false;
+bool RFSyncWritable = true;
+
+//Recieve clock signal from RF system
+InterruptIn RFClock(p28);
+DigitalIn RFData(p27);
+
+
+void callback_RFClock(void) {
+
+ //if this amount of time has passed since the last pulse, we have a new timestamp
+ if ((timeKeeper-lastPulse) > 4) {
+
+ //make sure the previous timestamp was 32 pulses
+ //if so, update lastRFTime
+ //we only process every 100th stamp (once every 10 seconds with 10 Hz timestamps)
+ if ((pulseCounter == 31) && (RFSyncCounter == 99)){
+ if (RFSyncWritable) {
+ lastRFTime = currentRFTime;
+ timeKeeperAtLastRFTime = timeKeeperAtCurrentRFTime;
+ RFSyncReadable = true;
+ RFSyncWritable = false;
+ }
+ }
+
+ pulseCounter = 0;
+ currentRFTime = 0;
+ timeKeeperAtCurrentRFTime = timeKeeper;
+ RFSyncCounter = (RFSyncCounter+1)%100;
+
+
+ if (lightOn) {
+ mainLED = 0;
+ lightOn = false;
+ } else {
+ mainLED = 1;
+ lightOn = true;
+ }
+ } else {
+ if (pulseCounter < 32) {
+ currentRFTime = (currentRFTime | ( RFData.read() << pulseCounter));
+ pulseCounter++;
+ }
+ }
+ lastPulse = timeKeeper;
+}
+
+//------------------------------------------------------------
+#endif
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+//MBED-specific stuff
+//---------------------------------------------------------------------
+
+//translate pin numbers to hardware pins
+PinName outPins[NUMPORTS] = {p11,p13,p15,p18,p21,p23,p25,p29,p20};
+PinName inPins[NUMPORTS] = {p12,p14,p16,p17,p22,p24,p26,p30,p7};
+
+
+
+//The sound output uses a SmartWav device and their simple serial library
+SMARTWAV sWav(p9,p10,p19); //(TX,RX,Reset);
+
+//This is the callback for the MBED timer
+extern "C" void TIMER0_IRQHandler (void) {
+
+ if((LPC_TIM0->IR & 0x01) == 0x01) { // if MR0 interrupt, proceed
+
+ LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
+ timeKeeper++;
+
+ if (resetTimer) {
+ timeKeeper = 0;
+ resetTimer = false;
+ }
+ }
+}
+//-----------------------------------------------------------------------
+
+
+
+MBEDSystem::MBEDSystem():
+ clockResetInt(p5),
+ clockExternalIncrement(p8) {
+
+ clockResetInt.rise(this, &MBEDSystem::externalClockReset);
+ clockResetInt.mode(PullDown);
+
+ clockExternalIncrement.mode(PullDown);
+
+ #ifdef MBED_RF
+ //Karpova version-------------
+ //Set up callbacks for RF clock signal
+ RFClock.rise(&callback_RFClock);
+ RFClock.mode(PullDown);
+ #endif
+
+ //-------------------------------
+
+ for (int i=0; i < NUMPORTS; i++) {
+ dIn[i].init(i);
+ dOut[i].init(i);
+ }
+
+
+
+ sWav.reset();
+
+}
+
+void MBEDSystem::timerinit() {
+ //intiatiation of timer (specific to the LPC17xx chip). This is used in
+ //standalone mode to increment the clock every ms.
+ //----------------------------------------------------
+ //LPC_SC->PCLKSEL1 &= (3 << 12); //mask
+ //LPC_SC->PCLKSEL1 |= (1 << 12); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
+ //LPC_SC->PCLKSEL0 &= (3 << 3); //mask
+ //LPC_SC->PCLKSEL0 |= (1 << 3); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
+ LPC_SC->PCONP |=1<1; //timer0 power on
+ LPC_TIM0->MR0 = 23980; //1 msec
+ //LPC_TIM0->PR = (SystemCoreClock / 1000000); //microsecond steps
+ //LPC_TIM0->MR0 = 1000; //100 msec
+ //LPC_TIM0->MR0 = (SystemCoreClock / 1000000); //microsecond steps
+ LPC_TIM0->MCR = 3; //interrupt and reset control
+ //3 = Interrupt & reset timer0 on match
+ //1 = Interrupt only, no reset of timer0
+ NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt
+ LPC_TIM0->TCR = 1; //enable Timer0
+ //--------------------------------------------------------------
+}
+
+void MBEDSystem::mainLoopToDo() {
+ #ifdef MBED_RF
+ //Karpova version--------------------------
+ //Karpova lab RF addition. Print out time sync.
+ if (RFSyncReadable) {
+ /*
+ ostringstream RFTimeConvert;
+ RFTimeConvert << timeKeeperAtLastRFTime << " " << "RFsync " << lastRFTime << " "; //broadcast the earliest timestamp when a change occured
+
+ textDisplay.send(RFTimeConvert.str() + "\r\n");
+ RFTimeConvert.clear();
+ RFTimeConvert.seekp(0);
+ */
+
+ textDisplay << timeKeeperAtLastRFTime << " RFsync " << lastRFTime << "\r\n";
+
+ RFSyncReadable = false;
+ RFSyncWritable = true;
+ }
+ //------------------------------------------------------------
+ #endif
+}
+
+sDigitalOut* MBEDSystem::getDigitalOutPtr(int portNum){
+ if (portNum < NUMPORTS) {
+ return &dOut[portNum];
+ } else {
+ return NULL;
+ }
+}
+
+sDigitalIn* MBEDSystem::getDigitalInPtr(int portNum) {
+ if (portNum < NUMPORTS) {
+ return &dIn[portNum];
+ } else {
+ return NULL;
+ }
+}
+
+sSound* MBEDSystem::createNewSoundAction() {
+ MBEDSound *tmpSound = new MBEDSound();
+ return tmpSound;
+}
+
+
+void MBEDSystem::externalClockReset() {
+
+ if (clockSlave) {
+ LPC_TIM0->TCR = 0x02; // reset timer
+ externalIncrementCounter = 0;
+ immediateClockReset();
+ }
+
+}
+
+void MBEDSystem::setStandAloneClock() {
+ timerinit();
+ clockExternalIncrement.rise(NULL); //remove the callback to the external interrupt
+ clockSlave = false;
+ changeToSlave = false;
+ changeToStandAlone = false;
+}
+
+void MBEDSystem::setSlaveClock() {
+ NVIC_DisableIRQ(TIMER0_IRQn); // Disable the interrupt
+ clockExternalIncrement.rise(this, &MBEDSystem::incrementClock);
+ clockSlave = true;
+ changeToSlave = false;
+ changeToStandAlone = false;
+}
+
+void MBEDSystem::incrementClock() {
+
+ if (clockSlave) {
+ externalIncrementCounter = (externalIncrementCounter+1) % externalIncrementMod;
+ if (externalIncrementCounter==0) {
+ timeKeeper++;
+ }
+
+ } else {
+ timeKeeper++;
+ }
+ //Clock resets happen upon update so we dont get a partial first ms
+ if (resetTimer) {
+ timeKeeper = 0;
+ resetTimer = false;
+ }
+}
+
+//-----------------------------------------------------
+
+MBEDSound::MBEDSound() {
+
+}
+
+void MBEDSound::execute() {
+ if (reset) {
+ sWav.reset();
+ } else if (!play) {
+ sWav.stopTrack();
+ } else {
+ if (volume > -1) {
+ sWav.volume(volume);
+ } else if (volumePtr != NULL) {
+ sWav.volume(*volumePtr);
+ }
+
+ if (fileNameExists) {
+ //sWav.playTracks();
+ sWav.stopTrack();
+ sWav.playTrackName(fileName);
+ }
+ }
+}
+
+//-----------------------------------------------------
+MBEDDigitalOut::MBEDDigitalOut() {
+
+}
+
+void MBEDDigitalOut::init(int pin) {
+ outpin = new DigitalOut(outPins[pin]);
+}
+
+int MBEDDigitalOut::read() {
+ return outpin->read();
+}
+
+void MBEDDigitalOut::write(int value) {
+ outpin->write(value);
+}
+//--------------------------------------------------------
+
+MBEDDigitalIn::MBEDDigitalIn() {
+
+}
+
+void MBEDDigitalIn::init(int pin) {
+ inpin = new DigitalIn(inPins[pin]);
+ inpin_interrupt = new InterruptIn(inPins[pin]);
+ inpin->mode(PullDown);
+ //Set up callbacks for the port interrupts
+ inpin_interrupt->rise(this, &MBEDDigitalIn::interrupt_up_callback);
+ inpin_interrupt->fall(this, &MBEDDigitalIn::interrupt_down_callback);
+}
+
+int MBEDDigitalIn::read() {
+ return inpin->read();
+}
+
+void MBEDDigitalIn::interrupt_up_callback() {
+ addStateChange(1, timeKeeper);
+}
+
+void MBEDDigitalIn::interrupt_down_callback() {
+ addStateChange(0, timeKeeper);
+}
+
+//----------------------------------------------------------
+MBEDSerialPort::MBEDSerialPort() {
+
+}
+
+void MBEDSerialPort::init() {
+ //Initialize serial communication
+ serialToPC = new Serial(USBTX, USBRX); // tx, rx
+ serialToPC->baud(115200);
+
+
+}
+
+bool MBEDSerialPort::readable() {
+ return serialToPC->readable();
+}
+
+char MBEDSerialPort::readChar() {
+ return serialToPC->getc();
+}
+
+void MBEDSerialPort::writeChar(char s) {
+ serialToPC->printf("%c", s);
+}