你有5只腳各3個狀態。你可以用幾種方法來表達這一點。
首先,設想利用這種框架:
#define LOW (0)
#define HIGH (1)
#define OPEN (2)
uint16_t config = PIN_CONFIG(pin1, pin2, pin3, pin4, pin5);
if(config == PIN_CONFIG(LOW, HIGH, OPEN, LOW, LOW))
{
// do something
}
switch(config) {
case PIN_CONFIG(LOW, HIGH, OPEN, LOW, HIGH):
// do something;
break;
}
uint16_t config_max = PIN_CONFIG(OPEN, OPEN, OPEN, OPEN, OPEN);
uint32_t hardware_ids[config_max + 1] = {0};
// init your hardware ids
hardware_ids[PIN_CONFIG(LOW, HIGH, HIGH, LOW, LOW)] = 0xF315;
hardware_ids[PIN_CONFIG(LOW, LOW, HIGH, LOW, LOW)] = 0xF225;
// look up a HWID
uint32_t hwid = hardware_ids[config];
此代碼只是那種東西你想和引腳配置做。留下來實施的唯一的一點是PIN_CONFIG
方法1
第一種方法是使用它作爲一個位字段保留,但每銷,而不是1位使用2個比特來表示每個引腳的狀態。我認爲這是最乾淨的,即使你爲每個銷釘「浪費」了一半。
#define PIN_CLAMP(x) ((x) & 0x03)
#define PIN_CONFIG(p1, p2, p3, p4, p5) \\
(PIN_CLAMP(p1) & \\
(PIN_CLAMP(p2) << 2) & \\
(PIN_CLAMP(p3) << 4) & \\
(PIN_CLAMP(p4) << 6) & \\
(PIN_CLAMP(p5) << 8))
這是一種不錯的,因爲它留下餘地「不關心」或「無效」值,如果你打算以後做搜索。
方法2
或者,你可以用算術來做到這一點,並確保您使用的必要位的最小量。也就是說,〜1.5位來編碼3個值。正如預期的那樣,這從0到242共計3^5 = 243個狀態。 不知道你的情況,我相信這是你的針狀態最小的完整編碼。 (實際上,你必須使用8位編碼243個值,所以它的每個引腳的1.5位)
#define PIN_CLAMP(x) ((x) % 3) /* note this should really assert */
#define PIN_CONFIG(p1, p2, p3, p4, p5) \\
(PIN_CLAMP(p1) & \\
(PIN_CLAMP(p2) * 3) & \\
(PIN_CLAMP(p3) * 9) & \\
(PIN_CLAMP(p4) * 27) & \\
(PIN_CLAMP(p5) * 81))
方法1.1
如果你不喜歡預處理的東西,你可以使用函數有點像這樣:
enum PinLevel (low = 0, high, open);
void set_pin(uint32_t * config, uint8_t pin_number, enum PinLevel value) {
int shift = pin_number * 2; // 2 bits
int mask = 0x03 << shift; // 2 bits set to on, moved to the right spot
*config &= ~pinmask;
*config |= (((int)value) << shift) & pinmask;
}
enum PinLevel get_pin(uint32_t config, uint8_t pin_number) {
int shift = pin_number * 2; // 2 bits
return (enum PinLevel)((config >> shift) & 0x03);
}
這跟隨第一(每值2位)的方法。
方法1.2
YET用C的冷靜位域語法另一種方式:
struct pins {
uint16_t pin1 : 2;
uint16_t pin2 : 2;
uint16_t pin3 : 2;
uint16_t pin4 : 2;
uint16_t pin5 : 2;
};
typedef union pinconfig_ {
struct pins pins;
uint16_t value;
} pinconfig;
pinconfig input;
input.value = 0; // don't forget to init the members unless static
input.pins.pin1 = HIGH;
input.pins.pin2 = LOW;
printf("%d", input.value);
input.value = 0x0003;
printd("%d", input.pins.pin1);
工會允許您查看位域爲一個數字,反之亦然。
(注:所有的代碼經過充分測試)
什麼常量'LOW','HIGH'和'OPEN'對應? – 2015-03-25 02:31:51
據我瞭解,你將有125種組合(5L * 5H * 5O)或者我正在失去一些東西? – CrApHeR 2015-03-25 02:32:53
@CrApHeR不會,它會是pow(3,5)= 243的組合。 – kibibu 2015-03-25 02:55:49