]> Pileus Git - ~andy/csm213a-hw/blobdiff - yue/main.cpp
Move timer to main
[~andy/csm213a-hw] / yue / main.cpp
index 19c88030b31f75966d63d439762d1495e99f7b40..ce909d4eeff3eb9d95e69f8d6825b7c1f76209ea 100644 (file)
@@ -15,9 +15,9 @@
          (x) > (max) ? (max) : (x))\r
 \r
 #define MMA8451_I2C_ADDRESS (0x1d<<1)   // acc sensor address\r
-#define TIME_ACCURACY     0.01\r
+#define TIME_ACCURACY     0.001\r
 \r
-#define ACC_SNS_DEFAULT   0.1   // default collecting interval in seconds\r
+#define ACC_SNS_DEFAULT   0.01 // default collecting interval in seconds\r
 #define MAG_SNS_DEFAULT   0.1\r
 #define LGT_SNS_DEFAULT   0.1\r
 #define TCH_SNS_DEFAULT   0.1\r
@@ -58,6 +58,7 @@ typedef enum {
 } cmd_t;\r
 \r
 // Data Frame Information\r
+#pragma pack(1)\r
 typedef struct {\r
     uint8_t header;\r
     struct {\r
@@ -66,9 +67,11 @@ typedef struct {
     } bits;\r
     uint8_t count;\r
     uint8_t data[];\r
-} __attribute__((__packed__)) state_t;\r
+} state_t;\r
+#pragma pack()\r
 \r
 // Command Frame Information\r
+#pragma pack(1)\r
 typedef struct {\r
     uint8_t header;\r
     struct {\r
@@ -76,7 +79,8 @@ typedef struct {
         uint8_t sns : 4;\r
     } bits;\r
     float   interval;\r
-} __attribute__((__packed__)) control_t;\r
+} control_t;\r
+#pragma pack()\r
 \r
 // Define Devices & Pins\r
 MMA8451Q   accSensor(PTE25, PTE24, MMA8451_I2C_ADDRESS);\r
@@ -85,6 +89,8 @@ TSISensor  tchSensor;
 AnalogIn   lgtSensor(PTE22);\r
 AnalogIn   a2dSensor(A0);\r
 \r
+AnalogOut  a2dOutput(PTE30);\r
+\r
 DigitalOut led1(LED1);\r
 DigitalOut led2(LED2);\r
 \r
@@ -100,11 +106,11 @@ float lgtTmr = LGT_SNS_DEFAULT;
 float a2dTmr = A2D_SNS_DEFAULT;\r
 float ledTmr = LED_OUT_DEFAULT;\r
 \r
-bool accEnable = true;\r
+bool accEnable = false;\r
 bool magEnable = false;\r
 bool lgtEnable = false;\r
 bool tchEnable = false;\r
-bool a2dEnable = false;\r
+bool a2dEnable = true;\r
 bool ledEnable = true;\r
 \r
 bool useStr = false;\r
@@ -140,7 +146,7 @@ void printBin(uint8_t *frame, int len);
 int main(void) {\r
     // Initialization\r
     // Interruption Declarations\r
-    clock1.attach(&clock1_interrupt, TIME_ACCURACY);    // maximun accuracy be 0.1s\r
+    //clock1.attach(&clock1_interrupt, TIME_ACCURACY);    // maximun accuracy be 0.1s\r
     serial.attach(&serialRx_interrupt, Serial::RxIrq);  // receive interrupt for serialS\r
     serial.baud(115200);\r
     magSensor.begin();\r
@@ -149,8 +155,13 @@ int main(void) {
 \r
     printStr("\r\n============= Start of the program ============\r\n");\r
 \r
+    int ticks = 0, tocks = 0;\r
     while(1){\r
-        wait(3);\r
+       ticks = us_ticker_read() * TIME_ACCURACY;\r
+       if (tocks < ticks) {\r
+               clock1_interrupt();\r
+               tocks++;\r
+       }\r
     }\r
 }\r
 \r
@@ -214,6 +225,9 @@ void clock1_interrupt(void){
     a2dCnt++;\r
     ledCnt++;\r
 \r
+    // Write A2D output sine wave\r
+    a2dOutput.write(sin(a2dCnt * TIME_ACCURACY * (2*PI) * 0.1));\r
+\r
     // Send data through Serial\r
     if (accEnable && (accCnt<0 || accCnt>=accTmr/TIME_ACCURACY)){\r
         sendAccInfo();\r
@@ -358,7 +372,7 @@ void sendTchInfo(void){
 \r
 void sendA2dInfo(void){\r
     float a2dData[6];\r
-    a2dData[0] = 0;\r
+    a2dData[0] = a2dSensor.read();\r
     a2dData[1] = 0;\r
     a2dData[2] = 0;\r
     a2dData[3] = 0;\r