skeleton

Dependencies:   MAG3110 MMA8451Q SLCD TSI mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "MMA8451Q.h"
00003 #include "MAG3110.h"
00004 #include "SLCD.h"
00005 #include "TSISensor.h"
00006 #include <math.h>
00007 #include "InterruptManager.h"
00008 #include "TPM_init.h"
00009 
00010 
00011 //#define IS_TRANSMITTER
00012  
00013 #ifndef IS_TRANSMITTER
00014     #define IS_RECEIVER
00015 #endif
00016 
00017  
00018 #define BAUD_RATE   921600
00019  
00020 #define MMA8451_I2C_ADDRESS (0x1d << 1)
00021 #define MAG3110_I2C_ADDRESS (0x0e << 1)
00022 #define NVIC_ISER   0xE000E100
00023 #define NVIC_ISPR   0xE000E200
00024  
00025 #define SIM_SOPT2_ADDRESS 0x40048004
00026 #define SIM_SCGC6_ADDRESS 0x4004803C
00027  
00028 
00029  
00030 Serial pc(USBTX, USBRX);
00031 RawSerial mbed_rec(PTE0, PTE1);
00032  
00033 Timer timer;
00034 SLCD slcd;
00035 
00036 DigitalOut go(D1); 
00037  
00038 int offset_start_usec;
00039 int offset_end_usec;
00040 unsigned int flag;
00041  
00042 gpio_t gpio_1;
00043 gpio_t gpio_2;
00044 
00045 RawSerial uart_mbed(PTE0, PTE1);
00046 RawSerial uart_beagle(PTE22, PTE23);
00047 
00048 
00049 // signal
00050 const int sigSYN   = 44;
00051 
00052 // now mode
00053 int now_mode;
00054 const int modeGEN = 1;
00055 const int modeMON = 2;
00056 
00057 int now_interval;
00058 int now_output;
00059 
00060 
00061 
00062 void TPM0_handler() {
00063     //pc.printf("handler called\n");
00064     unsigned int overflow = TPM0_SC_read() & 0x000000C0; 
00065     if(overflow == 0xC0) {
00066         //pc.printf("SC_REG = 0x%x\n", TPM0_SC_read());
00067         TPM0_clear_overflow();
00068         //__ISB();
00069         //__DSB();
00070         //pc.printf("SC_REG = 0x%x\n", TPM0_SC_read());
00071         
00072         //set gpio pin
00073         //int prev_val = gpio_read(&gpio_1);
00074         //gpio_write(&gpio_1, ~prev_val);
00075         //pc.printf("handler called\n");
00076         flag++;   
00077         //pc.printf("flag = %d\n", flag);
00078         
00079         //TPM0_clear_overflow();
00080         NVIC_ClearPendingIRQ(TPM0_IRQn);
00081         //__ISB();
00082         //__DSB();
00083         
00084     }
00085     //NVIC_ClearPendingIRQ(TPM0_IRQn);
00086     
00087 }
00088 
00089 
00090 #ifdef IS_TRANSMITTER
00091 void transmitter_rec_byte_from_mbed() {
00092 }
00093 #endif
00094     
00095 #ifdef IS_RECEIVER
00096 void receiver_rec_byte_from_mbed(){
00097     int c = uart_mbed.getc();
00098     //pc.printf("%d\n", c);
00099     if(c == sigSYN) {
00100         go = 1;
00101         // TODO: enable timer, register timer_fire_signal(), prescale = 0, modulo = 48000
00102     }
00103 }
00104 #endif
00105 
00106 #ifdef IS_TRANSMITTER
00107 void transmitter_timer_handler_reset_countdown() {
00108     // TODO: disable timer
00109     // TODO: reset timer
00110     // TODO: enable timer, register timer_fire_signal(), prescale = 0, modulo = 48000
00111     go = 1;
00112 }
00113 #endif
00114 
00115 void timer_fire_signal() {
00116 #ifdef IS_RECEIVER
00117     // TODO: do time drift calibration, if have time. 2912ms drift 740 clk
00118 #endif
00119     go = !go;
00120 }
00121 
00122 void rec_byte_from_beagle() {
00123     //01: Generation mode start
00124     //00: Generation mode stop
00125     //1X: Monitoring mode
00126     
00127     int c1 = uart_mbed.getc();
00128     int c2 = uart_mbed.getc();
00129     int n = (c1 << 8) | c2;
00130     if (n & 0x8000) { // Monitoring mode
00131         if (now_mode != modeMON) {
00132             // TODO: disable timer 
00133             // TODO: sync again?
00134             // TODO: initial monitor mode
00135         }
00136     }
00137     else { // Generation mode
00138         if (now_mode != modeGEN) {
00139             // TODO: disable previous timer
00140             // TODO: sync again?
00141             // TODO: init monitor mode
00142         }
00143         
00144         if (n & 0x4000) {  // start signal
00145             now_interval = n & 0x3f;
00146             now_output = 1;
00147         }
00148         else {  // stop signal
00149             now_output = 0;
00150         }
00151     }
00152 }
00153 
00154 int main() {
00155     pc.baud(921600);
00156 
00157     
00158     //TPM1->SC = 0;
00159 #ifdef IS_TRANSMITTER
00160     slcd.printf("sen0");
00161     pc.printf("I'm sender\n");
00162 #else  // IS_RECEIVER
00163     slcd.printf("1rec");
00164     pc.printf("I'm receiver\n");
00165 #endif
00166 
00167     flag = 0;
00168     unsigned int modulo_val = 48000;   //period = 1000usec
00169     unsigned int prescale_val = 0;
00170     pc.baud(BAUD_RATE);
00171     
00172     volatile unsigned int *ptrMyReg;
00173  
00174  
00175  /* 
00176     // ------lagacy code ----------------------------------
00177     NVIC_SetVector(TPM0_IRQn, (uint32_t) TPM0_handler);
00178     NVIC_SetPriority(TPM0_IRQn, 0);
00179     //NVIC_EnableIRQ(TPM0_IRQn);
00180  
00181     //ptrMyReg = (volatile unsigned int *) NVIC_ISER;
00182     //*ptrMyReg = 0x14020000;
00183 //    pc.printf("NVIC_ISER = 0x%x ", *ptrMyReg);
00184     
00185 //    ptrMyReg = (volatile unsigned int *) NVIC_ISPR;
00186 //    pc.printf("NVIC_ISPR = 0x%x ", *ptrMyReg);
00187     
00188     TPM0_init(modulo_val, prescale_val);
00189     //ptrMyReg = (volatile unsigned int *) TPM0_MOD_ADDR;
00190     //pc.printf("TPM0_MOD_ADDR = 0x%x ", *ptrMyReg);
00191  
00192     NVIC_EnableIRQ(TPM0_IRQn);
00193 //    ptrMyReg = (volatile unsigned int *) TPM0_CONF_ADDR;
00194 //    pc.printf("TPM0_CONF = 0x%x\n", *ptrMyReg);
00195     
00196     gpio_init(&gpio_1, PTA1, PIN_OUTPUT);
00197     gpio_write(&gpio_1, 0);    
00198  
00199     gpio_init(&gpio_2, PTA1, PIN_OUTPUT);
00200     gpio_write(&gpio_2, 0);
00201     
00202     gpio_write(&gpio_1, 1);
00203     //gpio_write(&gpio_2, 1);
00204     // ------lagacy code ----------------------------------
00205 */
00206 
00207     uart_mbed.baud(921600);
00208 
00209 
00210     // register uart handler from BBB
00211     uart_beagle.attach(rec_byte_from_beagle, Serial::RxIrq);
00212 
00213 #ifdef IS_TRANSMITTER
00214     wait(1.0);  // wait enough time for receiver to attach handler
00215 #else //IS_RECEIVER 
00216     uart_mbed.attach(receiver_rec_byte_from_mbed, Serial::RxIrq);
00217 #endif
00218 
00219 #ifdef IS_TRANSMITTER
00220     // TODO: enable timer, attach handler "transmitter_timer_handler_reset_countdown", prescale = 0, modulo = ?
00221 #endif
00222     
00223     
00224     
00225     // a place should never reach
00226     while (true) {
00227         wait(999);
00228     }
00229     
00230     
00231 }