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

Dependents:   kitchenTimer LPC1114FN28_kitchenTimer_Clock

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SwAnalog.cpp Source File

SwAnalog.cpp

00001 //======================================================================
00002 //    SwAnalog.cpp
00003 //
00004 // 
00005 //======================================================================
00006 #define _SWANALOG_C
00007 
00008 #include "mbed.h"
00009 #include "SwAnalog.h"
00010 
00011 //======================================================================
00012 // syokika
00013 //======================================================================
00014 
00015 #ifdef LPC1768
00016     SwAnalog::SwAnalog(PinName adinput0, PinName adinput1, PinName adinput2, PinName adinput3, PinName adinput4,
00017                          PinName adinput5
00018                          ):
00019                          _adinput0(adinput0),   _adinput1(adinput1),   _adinput2(adinput2),   _adinput3(adinput3),   _adinput4(adinput4),
00020                          _adinput5(adinput5)
00021                          {
00022        
00023     //---------------------------------
00024     // touroku sareta Sw Suu wo kakunin
00025     //---------------------------------
00026     if(adinput0 != NC){D_swPinSuu = 1;}
00027     if(adinput1 != NC){D_swPinSuu = 2;}
00028     if(adinput2 != NC){D_swPinSuu = 3;}
00029     if(adinput3 != NC){D_swPinSuu = 4;}
00030     if(adinput4 != NC){D_swPinSuu = 5;}
00031     
00032     if(adinput5 != NC){D_swPinSuu = 6;}
00033     
00034     
00035     // sw ninsiki syuki 10[ms]
00036 //  swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle); 
00037         
00038 }
00039 #else // ~LPC1768
00040     SwAnalog::SwAnalog(PinName adinput0, PinName adinput1
00041                          ):
00042                          _adinput0(adinput0),   _adinput1(adinput1)
00043                          {
00044        
00045     //---------------------------------
00046     // touroku sareta Sw Suu wo kakunin
00047     //---------------------------------
00048     if(adinput0 != NC){D_swPinSuu = 1;}
00049     if(adinput1 != NC){D_swPinSuu = 2;}
00050    
00051     
00052     // sw ninsiki syuki 10[ms]
00053   swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle); 
00054         
00055 }
00056 #endif // LPC1768
00057 
00058 //=================================================
00059 // analog input data wo sw data ni henkan
00060 //=================================================
00061 void SwAnalog::adInput(float ad, uint8_t swPinSuu){
00062     uint8_t ans = 0;    // SW ninsikichi   2bit = sw2, 1bit = sw1, 0bit = sw0  0:OFF 1:ON 
00063     
00064       
00065     // ad ninsikich kara sw jotai wo kakutei 
00066      
00067     if     (ad <= Z_threshold0_1){ans = 0;}
00068     else if(ad <= Z_threshold1_2){ans = 1;}
00069     else if(ad <= Z_threshold2_3){ans = 2;}
00070     else if(ad <= Z_threshold3_4){ans = 3;}
00071     else if(ad <= Z_threshold4_5){ans = 4;}
00072     else if(ad <= Z_threshold5_6){ans = 5;}
00073     else if(ad <= Z_threshold6_7){ans = 6;}
00074     else                         {ans = 7;}
00075     
00076 
00077     B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] << 1) |  (ans & 0x01)      );
00078     B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] << 1) | ((ans & 0x02) >> 1));
00079     B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] << 1) | ((ans & 0x04) >> 2));
00080 }
00081 
00082 //==========================================
00083 // subeteno analog input port no sw ninsiki
00084 //==========================================
00085 void SwAnalog::input(void){
00086     // genzai level input
00087     switch(D_swPinSuu){
00088 #ifdef LPC1768
00089     case 6:
00090         adInput(_adinput5, 5);
00091         //break;
00092     case 5:
00093         adInput(_adinput4, 4);
00094         //break;
00095     case 4:
00096         adInput(_adinput3, 3);
00097         //break;
00098     case 3:
00099         adInput(_adinput2, 2);
00100         //break;        
00101 #endif // LPC1768
00102     case 2:
00103         adInput(_adinput1, 1);
00104         //break;        
00105     case 1:
00106         adInput(_adinput0, 0);
00107         //break;                       
00108     default:
00109         // nothing
00110         break;
00111     }
00112     
00113     // kakutei Level kosin
00114     uint8_t kakutei = 0;
00115     for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
00116         for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
00117             uint8_t work = B_kariLevel[(swPinSuu * Z_swInNoMax) + swInNo] & Z_itchiPattern;
00118             if(work == 0x00){
00119                 // off kakutei
00120                 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
00121                 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOff;
00122                 kakutei = 1;
00123             }
00124             else if(work == Z_itchiPattern){
00125                 // on kakutei
00126                 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
00127                 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOn;
00128                 kakutei = 1;
00129             }
00130             else{
00131                 // nothing
00132             }
00133         
00134             if(kakutei == 1){
00135                 // edge kosin
00136                 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn)){
00137                     B_edgeOn[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
00138                 }
00139                 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff)){
00140                     B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
00141                 }
00142             }
00143         }
00144     }              
00145 }
00146 
00147 //========================================
00148 // sw no ninsiki level ,edge data no kosin
00149 //========================================
00150 void SwAnalog::refreshEdgeData(void){
00151     for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
00152         for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
00153             __disable_irq();     // Disable Interrupts
00154             D_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo];
00155             D_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo];
00156         
00157             B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
00158             B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
00159             __enable_irq();     // Enable Interrupts
00160         }
00161     }
00162 }
00163 
00164 //===============================
00165 // sw no Off to On edge hantei
00166 //===============================
00167 uint8_t SwAnalog::checkEdgeOn(uint8_t swNo){
00168     uint8_t ans = 0;
00169     
00170     if(D_edgeOn[swNo] == Z_edgeAri){
00171         ans = 1;
00172     } 
00173 
00174     return (ans);
00175 }
00176 
00177 //===============================
00178 // sw no On to Off edge hantei
00179 //===============================
00180 uint8_t SwAnalog::checkEdgeOff(uint8_t swNo){
00181     uint8_t ans = 0;
00182     
00183     if(D_edgeOff[swNo] == Z_edgeAri){
00184         ans = 1;
00185     } 
00186 
00187     return (ans);
00188 }
00189 
00190 //==============================
00191 // sw no ninsiki level hantei
00192 //==============================
00193 uint8_t SwAnalog::checkLevel(uint8_t swNo){
00194     uint8_t ans = 0;
00195     
00196     if(D_nowLevel[swNo] == Z_levelOn){
00197         ans = 1;
00198     } 
00199 
00200     return (ans);
00201 }
00202