Skip to content

Commit 871399a

Browse files
authored
Merge pull request #993 from pimoroni/patch-as7343-channels
as7343: Fix channel and status order.
2 parents dfc1875 + 052dbce commit 871399a

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

drivers/as7343/as7343.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace pimoroni {
3030
i2c->set_bits(address, reg::FIFO_MAP, 0, FIFO_MAP_CH5 | FIFO_MAP_CH4 | FIFO_MAP_CH3 | FIFO_MAP_CH2 | FIFO_MAP_CH1 | FIFO_MAP_CH0 | FIFO_MAP_ASTATUS);
3131

3232
// Set the PON bit
33-
i2c->reg_write_uint8(address, reg::ENABLE, ENABLE_WEN | ENABLE_SMUXEN | ENABLE_SP_EN | ENABLE_PON);
33+
i2c->reg_write_uint8(address, reg::ENABLE, ENABLE_WEN | ENABLE_SP_EN | ENABLE_PON);
3434

3535
return true;
3636
}
@@ -135,10 +135,23 @@ namespace pimoroni {
135135
}
136136
}
137137

138+
void AS7343::start_measurement() {
139+
if(running) return;
140+
i2c->set_bits(address, reg::ENABLE, 0, ENABLE_SMUXEN);
141+
running = true;
142+
}
143+
144+
void AS7343::stop_measurement() {
145+
i2c->set_bits(address, reg::ENABLE, 0, ENABLE_SMUXEN);
146+
running = false;
147+
}
148+
138149
void AS7343::read_fifo(uint16_t *buf) {
139150
uint16_t expected_results = read_cycles * 7;
140151
uint16_t result_slot = 0;
141152

153+
start_measurement();
154+
142155
while (i2c->reg_read_uint8(address, reg::FIFO_LVL) < expected_results) {
143156
sleep_ms(1);
144157
}

drivers/as7343/as7343.hpp

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,36 +49,68 @@ namespace pimoroni {
4949
public:
5050
struct reading {
5151
// Cycle 1
52+
uint16_t c1_astatus = 0; // (c1_astatus >> 8) & 0b10001111
53+
// 0b10000000 = saturated
54+
// 0b00001111 = gain lowest nibble
5255
uint16_t FZ = 0; // 428-480 nm
5356
uint16_t FY = 0; // 534-593 nm
5457
uint16_t FXL = 0; // 593-628 nm
5558
uint16_t NIR = 0; // 849-903 nm
5659

5760
uint16_t c1_vis_tl = 0; // Visible top-left
5861
uint16_t c1_vis_br = 0; // Visible bottom-right
59-
uint16_t c1_astatus = 0; // (c1_astatus >> 8) & 0b10001111
60-
// 0b10000000 = saturated
61-
// 0b00001111 = gain lowest nibble
62+
//uint16_t c1_fd = 0; // This is where flicker detect *would* be
6263

6364
// Cycle 2
65+
uint16_t c2_astatus = 0;
6466
uint16_t F2 = 0; // 408-448 nm
6567
uint16_t F3 = 0; // 448-500 mn
6668
uint16_t F4 = 0; // 500-534 nm
6769
uint16_t F6 = 0; // 618-665 nm
6870

6971
uint16_t c2_vis_tl = 0;
7072
uint16_t c2_vis_br = 0;
71-
uint16_t c2_astatus = 0;
73+
//uint16_t c2_fd = 0;
7274

7375
// Cycle 3
76+
uint16_t c3_astatus = 0;
7477
uint16_t F1 = 0; // 396-408 nm
75-
uint16_t F5 = 0; // 531-594 nm
7678
uint16_t F7 = 0; // 685-715 nm
7779
uint16_t F8 = 0; // 715-766 nm
80+
uint16_t F5 = 0; // 531-594 nm
7881

7982
uint16_t c3_vis_tl = 0;
8083
uint16_t c3_vis_br = 0;
81-
uint16_t c3_astatus = 0;
84+
//uint16_t c3_fd = 0;
85+
86+
float gain(uint8_t cycle) {
87+
uint8_t status = 0;
88+
switch(cycle) {
89+
case 1:
90+
status = c1_astatus & 0xf;
91+
break;
92+
case 2:
93+
status = c2_astatus & 0xf;
94+
break;
95+
case 3:
96+
status = c3_astatus & 0xf;
97+
break;
98+
}
99+
return status ? 1 << (status - 1) : 0.5f;
100+
}
101+
102+
bool saturated(uint8_t cycle) {
103+
switch(cycle) {
104+
case 1:
105+
return c1_astatus & 0x80;
106+
case 2:
107+
return c2_astatus & 0x80;
108+
case 3:
109+
return c3_astatus & 0x80;
110+
default:
111+
return false;
112+
}
113+
}
82114
};
83115

84116

@@ -95,6 +127,8 @@ namespace pimoroni {
95127
uint8_t read_cycles = 1;
96128
uint8_t ch_count = (uint8_t)channel_count::SIX_CHANNEL;
97129

130+
bool running = false;
131+
98132

99133
//--------------------------------------------------
100134
// Constructors/Destructor
@@ -120,6 +154,9 @@ namespace pimoroni {
120154

121155
void get_version(uint8_t &auxid, uint8_t &revid, uint8_t &hwid);
122156

157+
void start_measurement();
158+
void stop_measurement();
159+
123160
reading read();
124161

125162
void read_fifo(uint16_t *buf);

examples/breakout_as7343/as7343_demo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ int main() {
6262
reading.F8
6363
);
6464

65+
printf("Gain: C1: %fx C2: %fx C3: %fx\n", reading.gain(1), reading.gain(2), reading.gain(3));
66+
6567
sleep_ms(1000);
6668
}
6769

0 commit comments

Comments
 (0)