アナログポート から スイッチを3つ認識するライブラリです。 6つのアナログポートを同時に認識して、18個のSWまで認識できます。

Dependents:   kitchenTimer LPC1114FN28_kitchenTimer_Clock

Revision:
0:ba027616fdf1
Child:
1:ebaa87e67cef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SwAnalog.cpp	Sun Feb 12 00:50:23 2012 +0000
@@ -0,0 +1,181 @@
+//======================================================================
+//    SwAnalog.cpp
+//
+// 
+//======================================================================
+#define _SWANALOG_C
+
+#include "mbed.h"
+#include "SwAnalog.h"
+
+//======================================================================
+// syokika
+//======================================================================
+
+    SwAnalog::SwAnalog(PinName adinput0, PinName adinput1, PinName adinput2, PinName adinput3, PinName adinput4,
+                         PinName adinput5
+                         ):
+                         _adinput0(adinput0),   _adinput1(adinput1),   _adinput2(adinput2),   _adinput3(adinput3),   _adinput4(adinput4),
+                         _adinput5(adinput5)
+                         {
+       
+    //---------------------------------
+    // touroku sareta Sw Suu wo kakunin
+    //---------------------------------
+    if(adinput0 != NC){D_swPinSuu = 1;}
+    if(adinput1 != NC){D_swPinSuu = 2;}
+    if(adinput2 != NC){D_swPinSuu = 3;}
+    if(adinput3 != NC){D_swPinSuu = 4;}
+    if(adinput4 != NC){D_swPinSuu = 5;}
+    
+    if(adinput5 != NC){D_swPinSuu = 6;}
+    
+    
+    // sw ninsiki syuki 10[ms]
+    swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle); 
+        
+}
+
+//=================================================
+// analog input data wo sw data ni henkan
+//=================================================
+void SwAnalog::adInput(float ad, uint8_t swPinSuu){
+    uint8_t ans = 0;    // SW ninsikichi   2bit = sw2, 1bit = sw1, 0bit = sw0  0:OFF 1:ON 
+    
+      
+    // ad ninsikich kara sw jotai wo kakutei 
+     
+    if     (ad <= Z_threshold0_1){ans = 0;}
+    else if(ad <= Z_threshold1_2){ans = 1;}
+    else if(ad <= Z_threshold2_3){ans = 2;}
+    else if(ad <= Z_threshold3_4){ans = 3;}
+    else if(ad <= Z_threshold4_5){ans = 4;}
+    else if(ad <= Z_threshold5_6){ans = 5;}
+    else if(ad <= Z_threshold6_7){ans = 6;}
+    else                         {ans = 7;}
+    
+
+    B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] << 1) |  (ans & 0x01)      );
+    B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] << 1) | ((ans & 0x02) >> 1));
+    B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] << 1) | ((ans & 0x04) >> 2));
+}
+
+//==========================================
+// subeteno analog input port no sw ninsiki
+//==========================================
+void SwAnalog::input(void){
+    // genzai level input
+    switch(D_swPinSuu){
+
+    case 6:
+        adInput(_adinput5, 5);
+        //break;
+    case 5:
+        adInput(_adinput4, 4);
+        //break;
+    case 4:
+        adInput(_adinput3, 3);
+        //break;
+    case 3:
+        adInput(_adinput2, 2);
+        //break;        
+    case 2:
+        adInput(_adinput1, 1);
+        //break;        
+    case 1:
+        adInput(_adinput0, 0);
+        //break;                       
+    default:
+        // nothing
+        break;
+    }
+    
+    // kakutei Level kosin
+    uint8_t kakutei = 0;
+    for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
+        for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
+            uint8_t work = B_kariLevel[(swPinSuu * Z_swInNoMax) + swInNo] & Z_itchiPattern;
+            if(work == 0x00){
+                // off kakutei
+                D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
+                D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOff;
+                kakutei = 1;
+            }
+            else if(work == Z_itchiPattern){
+                // on kakutei
+                D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
+                D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOn;
+                kakutei = 1;
+            }
+            else{
+                // nothing
+            }
+        
+            if(kakutei == 1){
+                // edge kosin
+                if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn)){
+                    B_edgeOn[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
+                }
+                if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff)){
+                    B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
+                }
+            }
+        }
+    }              
+}
+
+//========================================
+// sw no ninsiki level ,edge data no kosin
+//========================================
+void SwAnalog::refreshEdgeData(void){
+    for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
+        for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
+            __disable_irq();     // Disable Interrupts
+            D_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo];
+            D_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo];
+        
+            B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
+            B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
+            __enable_irq();     // Enable Interrupts
+        }
+    }
+}
+
+//===============================
+// sw no Off to On edge hantei
+//===============================
+uint8_t SwAnalog::checkEdgeOn(uint8_t swNo){
+    uint8_t ans = 0;
+    
+    if(D_edgeOn[swNo] == Z_edgeAri){
+        ans = 1;
+    } 
+
+    return (ans);
+}
+
+//===============================
+// sw no On to Off edge hantei
+//===============================
+uint8_t SwAnalog::checkEdgeOff(uint8_t swNo){
+    uint8_t ans = 0;
+    
+    if(D_edgeOff[swNo] == Z_edgeAri){
+        ans = 1;
+    } 
+
+    return (ans);
+}
+
+//==============================
+// sw no ninsiki level hantei
+//==============================
+uint8_t SwAnalog::checkLevel(uint8_t swNo){
+    uint8_t ans = 0;
+    
+    if(D_nowLevel[swNo] == Z_levelOn){
+        ans = 1;
+    } 
+
+    return (ans);
+}