yuwen sun / Mbed 2 deprecated Hw3B_Final_SNE_Master

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 Serial pc(USBTX, USBRX); // tx, rx
00004 Serial ss(p9, p10); //tx rx
00005 Serial ss_sne(p13, p14); //tx rx
00006 
00007 DigitalOut myled1(LED1);
00008 DigitalOut myled2(LED2);
00009 
00010 DigitalOut masterOut(p23);
00011 InterruptIn masterIn(p22);
00012 InterruptIn slaveIn(p21);
00013 
00014 unsigned long counter = 0;
00015 int divider = 1;
00016 int pro_flag = 0;  
00017 int task_flag = 0;
00018 unsigned long long t1, t2, t3, t4;
00019 typedef struct timeval {
00020     unsigned long tv_sec;
00021     unsigned long tv_usec;
00022 } timeval;
00023 
00024 void Timer0_init(void);
00025 void Timer0_IRQHandler(void);
00026 void Sync_protocol(void);
00027 void getTime(struct timeval *tv);
00028 int runAtTime (void (*fptr)(void), struct timeval tv);
00029 void toggle(void);
00030 void runAtTrigger( );
00031 void reportToggle(struct timeval *tv);
00032 long long sne(void);
00033 
00034 int main( )
00035 {   
00036     struct timeval t_run;
00037     long long t_run_m;
00038     t_run.tv_sec = 1000;
00039     t_run.tv_usec = 0;
00040     wait(1);
00041 //    masterIn.rise(&runAtTrigger);
00042 //    masterIn.fall(&runAtTrigger);
00043     slaveIn.rise(&runAtTrigger);
00044     slaveIn.fall(&runAtTrigger);
00045     Timer0_init( );
00046     while (1)
00047     {   
00048         if (pc.readable( )){
00049             t_run_m = sne( );
00050             t_run.tv_sec = t_run_m/1000000;
00051             t_run.tv_usec = t_run_m%1000000;
00052             pc.printf("%lu\n",t_run.tv_sec);
00053             pc.printf("%lu\n",t_run.tv_usec);
00054         }    
00055         if (!task_flag)
00056             task_flag = runAtTime (&toggle, t_run);
00057         if (pro_flag == 1){
00058             Sync_protocol( );
00059             pro_flag = 0;
00060         }   
00061     }
00062 }
00063 
00064 void Timer0_init(void)
00065 {
00066     LPC_SC->PCLKSEL0 = 0x0066;
00067     LPC_SC->PCONP |= 1<<1; // Timer0 Power On
00068     LPC_TIM0->MR0 = 2880000000;  // Match count for 30S
00069     LPC_TIM0->MCR = 3;     // Interrupt and Reset on Match
00070     LPC_TIM0->TCR = 1;     // Enable Timer0  
00071     NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler);
00072     NVIC_EnableIRQ(TIMER0_IRQn);
00073 }
00074 
00075 void Timer0_IRQHandler(void)
00076 {
00077     LPC_TIM0->IR = 1;
00078     LPC_TIM0->MR0 = 2880000000;  // Match count for 30S
00079     LPC_TIM0->TCR = 1;     // Enable Timer0
00080     counter = counter + 1;
00081     if ( counter % divider ==0 )
00082         pro_flag = 1;
00083 }
00084 
00085 void Sync_protocol(void)
00086 {   
00087     char x;
00088     t1 = counter * 4294967296 + LPC_TIM0->TC;
00089     ss.putc('S');
00090     pc.printf("t1 = %llu\n", t1);
00091     ss.printf("%llu", t1);
00092     ss.putc('E');
00093     while (1){
00094         if (ss.readable( )){
00095             x = ss.getc( );
00096             t4 = counter * 4294967296 + LPC_TIM0->TC;
00097             ss.printf("%llu", t4);
00098             ss.putc('E');
00099             pc.printf("%c\n", x);
00100             pc.printf("t4 = %llu\n", t4);
00101             break;
00102         }
00103     }    
00104 }
00105 
00106 void getTime(struct timeval *tv){
00107     unsigned long ns, hs;
00108     ns = LPC_TIM0->TC;
00109     hs = counter;
00110     tv->tv_sec = hs*30 + ns/100000000;
00111     tv->tv_usec = (ns%100000000)/100;
00112 }
00113 
00114 int runAtTime (void (*fptr)(void), struct timeval tv){
00115       struct timeval current_t;
00116       getTime(&current_t);
00117       if (tv.tv_sec <= current_t.tv_sec && tv.tv_usec <= current_t.tv_usec){
00118           (*fptr) ( );
00119           return 1;
00120       }
00121       else 
00122           return 0;  
00123 }
00124 
00125 void toggle(void){
00126     masterOut = !masterOut;
00127 }
00128 
00129 void runAtTrigger(void){
00130    struct timeval response_t;
00131    reportToggle(&response_t);  
00132 }
00133 
00134 void reportToggle(struct timeval *tv)
00135 {
00136     getTime(tv);
00137     pc.printf("%u\n", tv->tv_sec);
00138     pc.printf("%u\n", tv->tv_usec);
00139     myled2 = !myled2;   
00140 }
00141 
00142 long long sne( ){
00143     char temp;
00144     char incode[100];
00145     int i=0;
00146     int j=0;
00147     long long sum = 0;
00148     while ((temp = pc.getc())!= 'E') {    //getchar
00149         incode[i] = temp;    //put the original char in incode      
00150         i++;
00151     } 
00152     for (j=1;j<i;j++){
00153         sum = (incode[j]-'0')+sum*10;
00154     }
00155     if (incode[0]=='S'){
00156         ss_sne.printf("%llu", sum);
00157         ss_sne.putc('E');
00158         return sum;
00159     }
00160     else
00161         return 0;
00162 }