アナログポート から スイッチを3つ認識するライブラリです。 6つのアナログポートを同時に認識して、18個のSWまで認識できます。
Dependents: kitchenTimer LPC1114FN28_kitchenTimer_Clock
SwAnalog.cpp@0:ba027616fdf1, 2012-02-12 (annotated)
- Committer:
- suupen
- Date:
- Sun Feb 12 00:50:23 2012 +0000
- Revision:
- 0:ba027616fdf1
- Child:
- 1:ebaa87e67cef
2012/02/12 : V1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
suupen | 0:ba027616fdf1 | 1 | //====================================================================== |
suupen | 0:ba027616fdf1 | 2 | // SwAnalog.cpp |
suupen | 0:ba027616fdf1 | 3 | // |
suupen | 0:ba027616fdf1 | 4 | // |
suupen | 0:ba027616fdf1 | 5 | //====================================================================== |
suupen | 0:ba027616fdf1 | 6 | #define _SWANALOG_C |
suupen | 0:ba027616fdf1 | 7 | |
suupen | 0:ba027616fdf1 | 8 | #include "mbed.h" |
suupen | 0:ba027616fdf1 | 9 | #include "SwAnalog.h" |
suupen | 0:ba027616fdf1 | 10 | |
suupen | 0:ba027616fdf1 | 11 | //====================================================================== |
suupen | 0:ba027616fdf1 | 12 | // syokika |
suupen | 0:ba027616fdf1 | 13 | //====================================================================== |
suupen | 0:ba027616fdf1 | 14 | |
suupen | 0:ba027616fdf1 | 15 | SwAnalog::SwAnalog(PinName adinput0, PinName adinput1, PinName adinput2, PinName adinput3, PinName adinput4, |
suupen | 0:ba027616fdf1 | 16 | PinName adinput5 |
suupen | 0:ba027616fdf1 | 17 | ): |
suupen | 0:ba027616fdf1 | 18 | _adinput0(adinput0), _adinput1(adinput1), _adinput2(adinput2), _adinput3(adinput3), _adinput4(adinput4), |
suupen | 0:ba027616fdf1 | 19 | _adinput5(adinput5) |
suupen | 0:ba027616fdf1 | 20 | { |
suupen | 0:ba027616fdf1 | 21 | |
suupen | 0:ba027616fdf1 | 22 | //--------------------------------- |
suupen | 0:ba027616fdf1 | 23 | // touroku sareta Sw Suu wo kakunin |
suupen | 0:ba027616fdf1 | 24 | //--------------------------------- |
suupen | 0:ba027616fdf1 | 25 | if(adinput0 != NC){D_swPinSuu = 1;} |
suupen | 0:ba027616fdf1 | 26 | if(adinput1 != NC){D_swPinSuu = 2;} |
suupen | 0:ba027616fdf1 | 27 | if(adinput2 != NC){D_swPinSuu = 3;} |
suupen | 0:ba027616fdf1 | 28 | if(adinput3 != NC){D_swPinSuu = 4;} |
suupen | 0:ba027616fdf1 | 29 | if(adinput4 != NC){D_swPinSuu = 5;} |
suupen | 0:ba027616fdf1 | 30 | |
suupen | 0:ba027616fdf1 | 31 | if(adinput5 != NC){D_swPinSuu = 6;} |
suupen | 0:ba027616fdf1 | 32 | |
suupen | 0:ba027616fdf1 | 33 | |
suupen | 0:ba027616fdf1 | 34 | // sw ninsiki syuki 10[ms] |
suupen | 0:ba027616fdf1 | 35 | swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle); |
suupen | 0:ba027616fdf1 | 36 | |
suupen | 0:ba027616fdf1 | 37 | } |
suupen | 0:ba027616fdf1 | 38 | |
suupen | 0:ba027616fdf1 | 39 | //================================================= |
suupen | 0:ba027616fdf1 | 40 | // analog input data wo sw data ni henkan |
suupen | 0:ba027616fdf1 | 41 | //================================================= |
suupen | 0:ba027616fdf1 | 42 | void SwAnalog::adInput(float ad, uint8_t swPinSuu){ |
suupen | 0:ba027616fdf1 | 43 | uint8_t ans = 0; // SW ninsikichi 2bit = sw2, 1bit = sw1, 0bit = sw0 0:OFF 1:ON |
suupen | 0:ba027616fdf1 | 44 | |
suupen | 0:ba027616fdf1 | 45 | |
suupen | 0:ba027616fdf1 | 46 | // ad ninsikich kara sw jotai wo kakutei |
suupen | 0:ba027616fdf1 | 47 | |
suupen | 0:ba027616fdf1 | 48 | if (ad <= Z_threshold0_1){ans = 0;} |
suupen | 0:ba027616fdf1 | 49 | else if(ad <= Z_threshold1_2){ans = 1;} |
suupen | 0:ba027616fdf1 | 50 | else if(ad <= Z_threshold2_3){ans = 2;} |
suupen | 0:ba027616fdf1 | 51 | else if(ad <= Z_threshold3_4){ans = 3;} |
suupen | 0:ba027616fdf1 | 52 | else if(ad <= Z_threshold4_5){ans = 4;} |
suupen | 0:ba027616fdf1 | 53 | else if(ad <= Z_threshold5_6){ans = 5;} |
suupen | 0:ba027616fdf1 | 54 | else if(ad <= Z_threshold6_7){ans = 6;} |
suupen | 0:ba027616fdf1 | 55 | else {ans = 7;} |
suupen | 0:ba027616fdf1 | 56 | |
suupen | 0:ba027616fdf1 | 57 | |
suupen | 0:ba027616fdf1 | 58 | B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] << 1) | (ans & 0x01) ); |
suupen | 0:ba027616fdf1 | 59 | B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] << 1) | ((ans & 0x02) >> 1)); |
suupen | 0:ba027616fdf1 | 60 | B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] << 1) | ((ans & 0x04) >> 2)); |
suupen | 0:ba027616fdf1 | 61 | } |
suupen | 0:ba027616fdf1 | 62 | |
suupen | 0:ba027616fdf1 | 63 | //========================================== |
suupen | 0:ba027616fdf1 | 64 | // subeteno analog input port no sw ninsiki |
suupen | 0:ba027616fdf1 | 65 | //========================================== |
suupen | 0:ba027616fdf1 | 66 | void SwAnalog::input(void){ |
suupen | 0:ba027616fdf1 | 67 | // genzai level input |
suupen | 0:ba027616fdf1 | 68 | switch(D_swPinSuu){ |
suupen | 0:ba027616fdf1 | 69 | |
suupen | 0:ba027616fdf1 | 70 | case 6: |
suupen | 0:ba027616fdf1 | 71 | adInput(_adinput5, 5); |
suupen | 0:ba027616fdf1 | 72 | //break; |
suupen | 0:ba027616fdf1 | 73 | case 5: |
suupen | 0:ba027616fdf1 | 74 | adInput(_adinput4, 4); |
suupen | 0:ba027616fdf1 | 75 | //break; |
suupen | 0:ba027616fdf1 | 76 | case 4: |
suupen | 0:ba027616fdf1 | 77 | adInput(_adinput3, 3); |
suupen | 0:ba027616fdf1 | 78 | //break; |
suupen | 0:ba027616fdf1 | 79 | case 3: |
suupen | 0:ba027616fdf1 | 80 | adInput(_adinput2, 2); |
suupen | 0:ba027616fdf1 | 81 | //break; |
suupen | 0:ba027616fdf1 | 82 | case 2: |
suupen | 0:ba027616fdf1 | 83 | adInput(_adinput1, 1); |
suupen | 0:ba027616fdf1 | 84 | //break; |
suupen | 0:ba027616fdf1 | 85 | case 1: |
suupen | 0:ba027616fdf1 | 86 | adInput(_adinput0, 0); |
suupen | 0:ba027616fdf1 | 87 | //break; |
suupen | 0:ba027616fdf1 | 88 | default: |
suupen | 0:ba027616fdf1 | 89 | // nothing |
suupen | 0:ba027616fdf1 | 90 | break; |
suupen | 0:ba027616fdf1 | 91 | } |
suupen | 0:ba027616fdf1 | 92 | |
suupen | 0:ba027616fdf1 | 93 | // kakutei Level kosin |
suupen | 0:ba027616fdf1 | 94 | uint8_t kakutei = 0; |
suupen | 0:ba027616fdf1 | 95 | for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){ |
suupen | 0:ba027616fdf1 | 96 | for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){ |
suupen | 0:ba027616fdf1 | 97 | uint8_t work = B_kariLevel[(swPinSuu * Z_swInNoMax) + swInNo] & Z_itchiPattern; |
suupen | 0:ba027616fdf1 | 98 | if(work == 0x00){ |
suupen | 0:ba027616fdf1 | 99 | // off kakutei |
suupen | 0:ba027616fdf1 | 100 | D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo]; |
suupen | 0:ba027616fdf1 | 101 | D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOff; |
suupen | 0:ba027616fdf1 | 102 | kakutei = 1; |
suupen | 0:ba027616fdf1 | 103 | } |
suupen | 0:ba027616fdf1 | 104 | else if(work == Z_itchiPattern){ |
suupen | 0:ba027616fdf1 | 105 | // on kakutei |
suupen | 0:ba027616fdf1 | 106 | D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo]; |
suupen | 0:ba027616fdf1 | 107 | D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOn; |
suupen | 0:ba027616fdf1 | 108 | kakutei = 1; |
suupen | 0:ba027616fdf1 | 109 | } |
suupen | 0:ba027616fdf1 | 110 | else{ |
suupen | 0:ba027616fdf1 | 111 | // nothing |
suupen | 0:ba027616fdf1 | 112 | } |
suupen | 0:ba027616fdf1 | 113 | |
suupen | 0:ba027616fdf1 | 114 | if(kakutei == 1){ |
suupen | 0:ba027616fdf1 | 115 | // edge kosin |
suupen | 0:ba027616fdf1 | 116 | if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn)){ |
suupen | 0:ba027616fdf1 | 117 | B_edgeOn[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri; |
suupen | 0:ba027616fdf1 | 118 | } |
suupen | 0:ba027616fdf1 | 119 | if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff)){ |
suupen | 0:ba027616fdf1 | 120 | B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri; |
suupen | 0:ba027616fdf1 | 121 | } |
suupen | 0:ba027616fdf1 | 122 | } |
suupen | 0:ba027616fdf1 | 123 | } |
suupen | 0:ba027616fdf1 | 124 | } |
suupen | 0:ba027616fdf1 | 125 | } |
suupen | 0:ba027616fdf1 | 126 | |
suupen | 0:ba027616fdf1 | 127 | //======================================== |
suupen | 0:ba027616fdf1 | 128 | // sw no ninsiki level ,edge data no kosin |
suupen | 0:ba027616fdf1 | 129 | //======================================== |
suupen | 0:ba027616fdf1 | 130 | void SwAnalog::refreshEdgeData(void){ |
suupen | 0:ba027616fdf1 | 131 | for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){ |
suupen | 0:ba027616fdf1 | 132 | for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){ |
suupen | 0:ba027616fdf1 | 133 | __disable_irq(); // Disable Interrupts |
suupen | 0:ba027616fdf1 | 134 | D_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo]; |
suupen | 0:ba027616fdf1 | 135 | D_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo]; |
suupen | 0:ba027616fdf1 | 136 | |
suupen | 0:ba027616fdf1 | 137 | B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi; |
suupen | 0:ba027616fdf1 | 138 | B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi; |
suupen | 0:ba027616fdf1 | 139 | __enable_irq(); // Enable Interrupts |
suupen | 0:ba027616fdf1 | 140 | } |
suupen | 0:ba027616fdf1 | 141 | } |
suupen | 0:ba027616fdf1 | 142 | } |
suupen | 0:ba027616fdf1 | 143 | |
suupen | 0:ba027616fdf1 | 144 | //=============================== |
suupen | 0:ba027616fdf1 | 145 | // sw no Off to On edge hantei |
suupen | 0:ba027616fdf1 | 146 | //=============================== |
suupen | 0:ba027616fdf1 | 147 | uint8_t SwAnalog::checkEdgeOn(uint8_t swNo){ |
suupen | 0:ba027616fdf1 | 148 | uint8_t ans = 0; |
suupen | 0:ba027616fdf1 | 149 | |
suupen | 0:ba027616fdf1 | 150 | if(D_edgeOn[swNo] == Z_edgeAri){ |
suupen | 0:ba027616fdf1 | 151 | ans = 1; |
suupen | 0:ba027616fdf1 | 152 | } |
suupen | 0:ba027616fdf1 | 153 | |
suupen | 0:ba027616fdf1 | 154 | return (ans); |
suupen | 0:ba027616fdf1 | 155 | } |
suupen | 0:ba027616fdf1 | 156 | |
suupen | 0:ba027616fdf1 | 157 | //=============================== |
suupen | 0:ba027616fdf1 | 158 | // sw no On to Off edge hantei |
suupen | 0:ba027616fdf1 | 159 | //=============================== |
suupen | 0:ba027616fdf1 | 160 | uint8_t SwAnalog::checkEdgeOff(uint8_t swNo){ |
suupen | 0:ba027616fdf1 | 161 | uint8_t ans = 0; |
suupen | 0:ba027616fdf1 | 162 | |
suupen | 0:ba027616fdf1 | 163 | if(D_edgeOff[swNo] == Z_edgeAri){ |
suupen | 0:ba027616fdf1 | 164 | ans = 1; |
suupen | 0:ba027616fdf1 | 165 | } |
suupen | 0:ba027616fdf1 | 166 | |
suupen | 0:ba027616fdf1 | 167 | return (ans); |
suupen | 0:ba027616fdf1 | 168 | } |
suupen | 0:ba027616fdf1 | 169 | |
suupen | 0:ba027616fdf1 | 170 | //============================== |
suupen | 0:ba027616fdf1 | 171 | // sw no ninsiki level hantei |
suupen | 0:ba027616fdf1 | 172 | //============================== |
suupen | 0:ba027616fdf1 | 173 | uint8_t SwAnalog::checkLevel(uint8_t swNo){ |
suupen | 0:ba027616fdf1 | 174 | uint8_t ans = 0; |
suupen | 0:ba027616fdf1 | 175 | |
suupen | 0:ba027616fdf1 | 176 | if(D_nowLevel[swNo] == Z_levelOn){ |
suupen | 0:ba027616fdf1 | 177 | ans = 1; |
suupen | 0:ba027616fdf1 | 178 | } |
suupen | 0:ba027616fdf1 | 179 | |
suupen | 0:ba027616fdf1 | 180 | return (ans); |
suupen | 0:ba027616fdf1 | 181 | } |