Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
E
e7020e_2021
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Deux Babiri Futari
e7020e_2021
Commits
1a5afe5e
Commit
1a5afe5e
authored
4 years ago
by
Per Lindgren
Browse files
Options
Downloads
Patches
Plain Diff
refactored pwm3389
parent
eb54a0ff
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
examples/pmw3389.rs
+691
-722
691 additions, 722 deletions
examples/pmw3389.rs
src/lib.rs
+37
-0
37 additions, 0 deletions
src/lib.rs
src/pmw3389.rs
+692
-0
692 additions, 0 deletions
src/pmw3389.rs
with
1420 additions
and
722 deletions
examples/pmw3389.rs
+
691
−
722
View file @
1a5afe5e
...
@@ -3,13 +3,16 @@
...
@@ -3,13 +3,16 @@
#![no_main]
#![no_main]
#![no_std]
#![no_std]
use
cortex_m
::{
iprintln
,
peripheral
::
DWT
};
//
use cortex_m::{iprintln, peripheral::DWT};
use
embedded_hal
::
spi
::
MODE_3
;
use
embedded_hal
::
spi
::
MODE_3
;
// use cortex_m_semihosting::hprintln;
// use cortex_m_semihosting::hprintln;
use
panic_halt
as
_
;
use
panic_halt
as
_
;
use
rtic
::
cyccnt
::{
Instant
,
U32Ext
as
_
};
use
rtic
::
cyccnt
::{
Instant
,
U32Ext
as
_
};
use
stm32f4xx_hal
::{
dwt
::
Dwt
,
gpio
::
Speed
,
prelude
::
*
,
rcc
::
Clocks
,
spi
::
Spi
,
stm32
};
use
stm32f4xx_hal
::{
dwt
::
Dwt
,
gpio
::
Speed
,
prelude
::
*
,
rcc
::
Clocks
,
spi
::
Spi
,
stm32
};
use
app
::{
pmw3389
,
DwtDelay
};
use
rtt_target
::{
rprint
,
rprintln
,
rtt_init_print
};
//use crate::hal::gpio::{gpioa::PA0, Edge, Input, PullDown};
//use crate::hal::gpio::{gpioa::PA0, Edge, Input, PullDown};
//use hal::spi::{Mode, Phase, Polarity};
//use hal::spi::{Mode, Phase, Polarity};
...
@@ -18,10 +21,11 @@ const APP: () = {
...
@@ -18,10 +21,11 @@ const APP: () = {
struct
Resources
{
struct
Resources
{
// late resources
// late resources
GPIOA
:
stm32
::
GPIOA
,
GPIOA
:
stm32
::
GPIOA
,
ITM
:
stm32
::
ITM
,
}
}
#[init(schedule
=
[
toggle]
)]
#[init(schedule
=
[
toggle]
)]
fn
init
(
cx
:
init
::
Context
)
->
init
::
LateResources
{
fn
init
(
cx
:
init
::
Context
)
->
init
::
LateResources
{
rtt_init_print!
();
let
mut
core
=
cx
.core
;
let
mut
core
=
cx
.core
;
let
device
=
cx
.device
;
let
device
=
cx
.device
;
...
@@ -36,10 +40,8 @@ const APP: () = {
...
@@ -36,10 +40,8 @@ const APP: () = {
let
clocks
=
rcc
.cfgr
.freeze
();
let
clocks
=
rcc
.cfgr
.freeze
();
let
stim
=
&
mut
core
.ITM.stim
[
0
];
rprintln!
(
"------------"
);
rprintln!
(
"pmw3389"
);
iprintln!
(
stim
,
"------------"
);
iprintln!
(
stim
,
"pmw3389"
);
// Initialize (enable) the monotonic timer (CYCCNT)
// Initialize (enable) the monotonic timer (CYCCNT)
core
.DCB
.enable_trace
();
core
.DCB
.enable_trace
();
...
@@ -73,55 +75,54 @@ const APP: () = {
...
@@ -73,55 +75,54 @@ const APP: () = {
);
);
let
mut
delay
=
DwtDelay
::
new
(
&
mut
core
.DWT
,
clocks
);
let
mut
delay
=
DwtDelay
::
new
(
&
mut
core
.DWT
,
clocks
);
i
println!
(
stim
,
"clocks:"
);
r
println!
(
"clocks:"
);
i
println!
(
stim
,
"hclk {}"
,
clocks
.hclk
()
.0
);
r
println!
(
"hclk {}"
,
clocks
.hclk
()
.0
);
// test the delay
// test the delay
let
t1
=
stm32
::
DWT
::
get_cycle_count
();
let
t1
=
stm32
::
DWT
::
get_cycle_count
();
delay
.delay_us
(
1000
);
delay
.delay_us
(
1000
);
let
t2
=
stm32
::
DWT
::
get_cycle_count
();
let
t2
=
stm32
::
DWT
::
get_cycle_count
();
i
println!
(
stim
,
"1000us {}"
,
t2
.wrapping_sub
(
t1
));
r
println!
(
"1000us {}"
,
t2
.wrapping_sub
(
t1
));
let
t1
=
stm32
::
DWT
::
get_cycle_count
();
let
t1
=
stm32
::
DWT
::
get_cycle_count
();
delay
.delay_ms
(
1000
);
delay
.delay_ms
(
1000
);
let
t2
=
stm32
::
DWT
::
get_cycle_count
();
let
t2
=
stm32
::
DWT
::
get_cycle_count
();
i
println!
(
stim
,
"1000ms {}"
,
t2
.wrapping_sub
(
t1
));
r
println!
(
"1000ms {}"
,
t2
.wrapping_sub
(
t1
));
let
mut
pmw3389
=
pmw3389
::
Pmw3389
::
new
(
spi
,
cs
,
delay
,
&
mut
core
.ITM
)
.unwrap
();
let
mut
pmw3389
=
pmw3389
::
Pmw3389
::
new
(
spi
,
cs
,
delay
)
.unwrap
();
let
stim
=
&
mut
core
.ITM.stim
[
0
];
let
id
=
pmw3389
.product_id
()
.unwrap
();
let
id
=
pmw3389
.product_id
()
.unwrap
();
i
println!
(
stim
,
"id {}"
,
id
);
r
println!
(
"id {}"
,
id
);
let
id
=
pmw3389
let
id
=
pmw3389
.read_register
(
pmw3389
::
Register
::
RevisionId
)
.read_register
(
pmw3389
::
Register
::
RevisionId
)
.unwrap
();
.unwrap
();
i
println!
(
stim
,
"rev {}"
,
id
);
r
println!
(
"rev {}"
,
id
);
let
id
=
pmw3389
let
id
=
pmw3389
.read_register
(
pmw3389
::
Register
::
ShutterLower
)
.read_register
(
pmw3389
::
Register
::
ShutterLower
)
.unwrap
();
.unwrap
();
i
println!
(
stim
,
"lower {}"
,
id
);
r
println!
(
"lower {}"
,
id
);
let
id
=
pmw3389
let
id
=
pmw3389
.read_register
(
pmw3389
::
Register
::
ShutterUpper
)
.read_register
(
pmw3389
::
Register
::
ShutterUpper
)
.unwrap
();
.unwrap
();
i
println!
(
stim
,
"upper {}"
,
id
);
r
println!
(
"upper {}"
,
id
);
let
id
=
pmw3389
.read_register
(
pmw3389
::
Register
::
SROMId
)
.unwrap
();
let
id
=
pmw3389
.read_register
(
pmw3389
::
Register
::
SROMId
)
.unwrap
();
i
println!
(
stim
,
"sromid {}"
,
id
);
r
println!
(
"sromid {}"
,
id
);
let
id
=
pmw3389
let
id
=
pmw3389
.read_register
(
pmw3389
::
Register
::
InverseProductID
)
.read_register
(
pmw3389
::
Register
::
InverseProductID
)
.unwrap
();
.unwrap
();
i
println!
(
stim
,
"-id {}"
,
id
);
r
println!
(
"-id {}"
,
id
);
let
id
=
pmw3389
let
id
=
pmw3389
.read_register
(
pmw3389
::
Register
::
RippleControl
)
.read_register
(
pmw3389
::
Register
::
RippleControl
)
.unwrap
();
.unwrap
();
i
println!
(
stim
,
"ripple_control {:x}"
,
id
);
r
println!
(
"ripple_control {:x}"
,
id
);
// semantically, the monotonic timer is frozen at time "zero" during `init`
// semantically, the monotonic timer is frozen at time "zero" during `init`
// NOTE do *not* call `Instant::now` in this context; it will return a nonsense value
// NOTE do *not* call `Instant::now` in this context; it will return a nonsense value
...
@@ -133,14 +134,13 @@ const APP: () = {
...
@@ -133,14 +134,13 @@ const APP: () = {
// pass on late resources
// pass on late resources
init
::
LateResources
{
init
::
LateResources
{
GPIOA
:
device
.GPIOA
,
GPIOA
:
device
.GPIOA
,
ITM
:
core
.ITM
,
}
}
}
}
#[task(resources
=
[
GPIOA
,
ITM
]
,
schedule
=
[
toggle
])]
#[task(resources
=
[
GPIOA]
,
schedule
=
[
toggle
])]
fn
toggle
(
cx
:
toggle
::
Context
)
{
fn
toggle
(
cx
:
toggle
::
Context
)
{
static
mut
TOGGLE
:
bool
=
false
;
static
mut
TOGGLE
:
bool
=
false
;
i
println!
(
&
mut
cx
.resources.ITM.stim
[
0
],
"foo
@ {:?}"
,
Instant
::
now
());
r
println!
(
"toggle
@ {:?}"
,
Instant
::
now
());
if
*
TOGGLE
{
if
*
TOGGLE
{
cx
.resources.GPIOA.bsrr
.write
(|
w
|
w
.bs5
()
.set_bit
());
cx
.resources.GPIOA.bsrr
.write
(|
w
|
w
.bs5
()
.set_bit
());
...
@@ -159,714 +159,683 @@ const APP: () = {
...
@@ -159,714 +159,683 @@ const APP: () = {
}
}
};
};
pub
struct
DwtDelay
{
// mod pmw3389 {
clocks
:
Clocks
,
// use super::DwtDelay;
}
// use cortex_m::{iprint, iprintln};
impl
DwtDelay
{
// use embedded_hal::blocking::spi::{Transfer, Write};
pub
fn
new
(
dwt
:
&
mut
stm32
::
DWT
,
clocks
:
Clocks
)
->
DwtDelay
{
// use embedded_hal::digital::v2::OutputPin;
// required on Cortex-M7 devices that software lock the DWT (e.g. STM32F7)
// use stm32f4xx_hal::{prelude::*, stm32};
stm32
::
DWT
::
unlock
();
// // use stm32f4xx_hal::{dwt::Dwt, gpio::Speed, prelude::*, rcc::Clocks, spi::Spi, stm32};
dwt
.enable_cycle_counter
();
Self
{
clocks
}
// #[allow(dead_code)]
}
// #[derive(Clone, Copy)]
}
// pub enum Register {
// ProductId = 0x00,
impl
_embedded_hal_blocking_delay_DelayUs
<
u32
>
for
DwtDelay
{
// RevisionId = 0x01,
fn
delay_us
(
&
mut
self
,
us
:
u32
)
{
// Motion = 0x02,
let
freq_m_hertz
=
self
.clocks
.hclk
()
.0
/
1_000_000
;
// DeltaXL = 0x03,
// DeltaXH = 0x04,
let
start
=
stm32
::
DWT
::
get_cycle_count
()
as
i32
;
// DeltaYL = 0x05,
let
end
=
start
.wrapping_add
((
us
*
freq_m_hertz
)
as
i32
);
// DeltaYH = 0x06,
// SQUAL = 0x07,
while
(
stm32
::
DWT
::
get_cycle_count
()
as
i32
)
.wrapping_sub
(
end
)
<
0
{
// RawDataSum = 0x08,
// this nop should be ok as the `DWT::get_cycle_count() provides side effects
// MaximumRawdata = 0x09,
}
// MinimumRawdata = 0x0A,
}
// ShutterLower = 0x0B,
}
// ShutterUpper = 0x0C,
// RippleControl = 0x0D,
impl
_embedded_hal_blocking_delay_DelayMs
<
u32
>
for
DwtDelay
{
// ResolutionL = 0x0E,
fn
delay_ms
(
&
mut
self
,
ms
:
u32
)
{
// ResolutionH = 0x0F,
self
.delay_us
(
ms
*
1000
)
// Config2 = 0x10,
}
// AngleTune = 0x11,
}
// FrameCapture = 0x12,
mod
pmw3389
{
// SROMEnable = 0x13,
use
super
::
DwtDelay
;
// RunDownshift = 0x14,
// Rest1RateLower = 0x15,
use
cortex_m
::{
iprint
,
iprintln
};
// Rest1RateUpper = 0x16,
use
embedded_hal
::
blocking
::
spi
::{
Transfer
,
Write
};
// Rest1Downshift = 0x17,
use
embedded_hal
::
digital
::
v2
::
OutputPin
;
// Rest2RateLower = 0x18,
use
stm32f4xx_hal
::{
prelude
::
*
,
stm32
};
// Rest2RateUpper = 0x19,
// use stm32f4xx_hal::{dwt::Dwt, gpio::Speed, prelude::*, rcc::Clocks, spi::Spi, stm32};
// Rest2Downshift = 0x1A,
// Rest3RateLower = 0x1B,
#[allow(dead_code)]
// Rest3RateUpper = 0x1C,
#[derive(Clone,
Copy)]
// Observation = 0x24,
pub
enum
Register
{
// DataOutLower = 0x25,
ProductId
=
0x00
,
// DataOutUpper = 0x26,
RevisionId
=
0x01
,
// RawDataDump = 0x29,
Motion
=
0x02
,
// SROMId = 0x2A,
DeltaXL
=
0x03
,
// MinSQRun = 0x2B,
DeltaXH
=
0x04
,
// RawDataThreshold = 0x2C,
DeltaYL
=
0x05
,
// Control2 = 0x2D,
DeltaYH
=
0x06
,
// Config5L = 0x2E,
SQUAL
=
0x07
,
// Config5H = 0x2F,
RawDataSum
=
0x08
,
// PowerUpReset = 0x3A,
MaximumRawdata
=
0x09
,
// Shutdown = 0x3B,
MinimumRawdata
=
0x0A
,
// InverseProductID = 0x3F,
ShutterLower
=
0x0B
,
// LiftCutoffTune3 = 0x41,
ShutterUpper
=
0x0C
,
// AngleSnap = 0x42,
RippleControl
=
0x0D
,
// LiftCutoffTune1 = 0x4A,
ResolutionL
=
0x0E
,
// MotionBurst = 0x50,
ResolutionH
=
0x0F
,
// LiftCutoffTune1Timeout = 0x58,
Config2
=
0x10
,
// LiftCutoffTune1MinLength = 0x5A,
AngleTune
=
0x11
,
// SROMLoadBurst = 0x62,
FrameCapture
=
0x12
,
// LiftConfig = 0x63,
SROMEnable
=
0x13
,
// RawDataBurst = 0x64,
RunDownshift
=
0x14
,
// LiftCutoffTune2 = 0x65,
Rest1RateLower
=
0x15
,
// LiftCutoffTune2Timeout = 0x71,
Rest1RateUpper
=
0x16
,
// LiftCutoffTune2MinLength = 0x72,
Rest1Downshift
=
0x17
,
// PWMPeriodCnt = 0x73,
Rest2RateLower
=
0x18
,
// PWMWidthCnt = 0x74,
Rest2RateUpper
=
0x19
,
// }
Rest2Downshift
=
0x1A
,
Rest3RateLower
=
0x1B
,
// impl Register {
Rest3RateUpper
=
0x1C
,
// fn addr(self) -> u8 {
Observation
=
0x24
,
// self as u8
DataOutLower
=
0x25
,
// }
DataOutUpper
=
0x26
,
// }
RawDataDump
=
0x29
,
SROMId
=
0x2A
,
// pub struct Pmw3389<SPI, CS> {
MinSQRun
=
0x2B
,
// spi: SPI,
RawDataThreshold
=
0x2C
,
// cs: CS,
Control2
=
0x2D
,
// delay: DwtDelay,
Config5L
=
0x2E
,
// }
Config5H
=
0x2F
,
PowerUpReset
=
0x3A
,
// impl<SPI, CS, E> Pmw3389<SPI, CS>
Shutdown
=
0x3B
,
// where
InverseProductID
=
0x3F
,
// SPI: Transfer<u8, Error = E> + Write<u8, Error = E>,
LiftCutoffTune3
=
0x41
,
// CS: OutputPin,
AngleSnap
=
0x42
,
// {
LiftCutoffTune1
=
0x4A
,
// fn com_begin(&mut self) {
MotionBurst
=
0x50
,
// self.cs.set_low().ok();
LiftCutoffTune1Timeout
=
0x58
,
// }
LiftCutoffTune1MinLength
=
0x5A
,
SROMLoadBurst
=
0x62
,
// fn com_end(&mut self) {
LiftConfig
=
0x63
,
// self.cs.set_high().ok();
RawDataBurst
=
0x64
,
// }
LiftCutoffTune2
=
0x65
,
LiftCutoffTune2Timeout
=
0x71
,
// /// Creates a new driver from a SPI peripheral and a NCS pin
LiftCutoffTune2MinLength
=
0x72
,
// pub fn new(spi: SPI, cs: CS, delay: DwtDelay, itm: &mut stm32::ITM) -> Result<Self, E> {
PWMPeriodCnt
=
0x73
,
// let mut pmw3389 = Pmw3389 { spi, cs, delay };
PWMWidthCnt
=
0x74
,
}
// iprintln!(&mut itm.stim[0], "pmw3389 - new");
impl
Register
{
// // ensure SPI is reset
fn
addr
(
self
)
->
u8
{
// pmw3389.com_end();
self
as
u8
// pmw3389.delay.delay_us(40);
}
// pmw3389.com_begin();
}
// pmw3389.delay.delay_us(40);
// pmw3389.com_end();
pub
struct
Pmw3389
<
SPI
,
CS
>
{
spi
:
SPI
,
// // read product id
cs
:
CS
,
// let id = pmw3389.product_id()?;
delay
:
DwtDelay
,
// iprintln!(&mut itm.stim[0], "product_id 0x{:x}", id);
}
// let srom_id = pmw3389.read_register(Register::SROMId)?;
impl
<
SPI
,
CS
,
E
>
Pmw3389
<
SPI
,
CS
>
// iprintln!(&mut itm.stim[0], "srom_id {}, 0x{:x}", srom_id, srom_id);
where
SPI
:
Transfer
<
u8
,
Error
=
E
>
+
Write
<
u8
,
Error
=
E
>
,
// iprintln!(&mut itm.stim[0], "reset");
CS
:
OutputPin
,
{
// // shutdown
fn
com_begin
(
&
mut
self
)
{
self
.cs
.set_low
()
.ok
();
// // adns_write_reg(Shutdown, 0xb6); // Shutdown first
}
// // delay(300);
fn
com_end
(
&
mut
self
)
{
// // adns_com_begin(); // drop and raise ncs to reset spi port
self
.cs
.set_high
()
.ok
();
// // delayMicroseconds(40);
}
// // adns_com_end();
// // delayMicroseconds(40);
/// Creates a new driver from a SPI peripheral and a NCS pin
pub
fn
new
(
spi
:
SPI
,
cs
:
CS
,
delay
:
DwtDelay
,
itm
:
&
mut
stm32
::
ITM
)
->
Result
<
Self
,
E
>
{
// // pmw3389.write_register(Register::Shutdown, 0xb6)?;
let
mut
pmw3389
=
Pmw3389
{
spi
,
cs
,
delay
};
// // pmw3389.delay.delay_ms(300);
// // pmw3389.com_begin();
iprintln!
(
&
mut
itm
.stim
[
0
],
"pmw3389 - new"
);
// // pmw3389.delay.delay_us(40);
// // pmw3389.com_end();
// ensure SPI is reset
// // pmw3389.delay.delay_us(40);
pmw3389
.com_end
();
pmw3389
.delay
.delay_us
(
40
);
// // force reset
pmw3389
.com_begin
();
// pmw3389.write_register(Register::PowerUpReset, 0x5a)?;
pmw3389
.delay
.delay_us
(
40
);
pmw3389
.com_end
();
// // wait for reboot
// pmw3389.delay.delay_ms(50);
// read product id
let
id
=
pmw3389
.product_id
()
?
;
// // read product id
iprintln!
(
&
mut
itm
.stim
[
0
],
"product_id 0x{:x}"
,
id
);
// let id = pmw3389.product_id()?;
// iprintln!(&mut itm.stim[0], "product_id 0x{:x}", id);
let
srom_id
=
pmw3389
.read_register
(
Register
::
SROMId
)
?
;
iprintln!
(
&
mut
itm
.stim
[
0
],
"srom_id {}, 0x{:x}"
,
srom_id
,
srom_id
);
// let srom_id = pmw3389.read_register(Register::SROMId)?;
// iprintln!(&mut itm.stim[0], "srom_id {}, 0x{:x}", srom_id, srom_id);
iprintln!
(
&
mut
itm
.stim
[
0
],
"reset"
);
// // read registers 0x02 to 0x06 (and discard the data)
// shutdown
// pmw3389.read_register(Register::Motion)?;
// pmw3389.read_register(Register::DeltaXL)?;
// adns_write_reg(Shutdown, 0xb6); // Shutdown first
// pmw3389.read_register(Register::DeltaXH)?;
// delay(300);
// pmw3389.read_register(Register::DeltaYL)?;
// pmw3389.read_register(Register::DeltaYH)?;
// adns_com_begin(); // drop and raise ncs to reset spi port
// delayMicroseconds(40);
// pmw3389.upload_firmware(itm)?;
// adns_com_end();
// delayMicroseconds(40);
// pmw3389.delay.delay_ms(1000);
// pmw3389.write_register(Register::Shutdown, 0xb6)?;
// iprintln!(&mut itm.stim[0], "Optical Chip Initialized");
// pmw3389.delay.delay_ms(300);
// pmw3389.com_begin();
// pmw3389.delay.delay_us(40);
// pmw3389.com_end();
// pmw3389.delay.delay_us(40);
// force reset
pmw3389
.write_register
(
Register
::
PowerUpReset
,
0x5a
)
?
;
// wait for reboot
pmw3389
.delay
.delay_ms
(
50
);
// read product id
let
id
=
pmw3389
.product_id
()
?
;
iprintln!
(
&
mut
itm
.stim
[
0
],
"product_id 0x{:x}"
,
id
);
let
srom_id
=
pmw3389
.read_register
(
Register
::
SROMId
)
?
;
iprintln!
(
&
mut
itm
.stim
[
0
],
"srom_id {}, 0x{:x}"
,
srom_id
,
srom_id
);
// read registers 0x02 to 0x06 (and discard the data)
pmw3389
.read_register
(
Register
::
Motion
)
?
;
pmw3389
.read_register
(
Register
::
DeltaXL
)
?
;
pmw3389
.read_register
(
Register
::
DeltaXH
)
?
;
pmw3389
.read_register
(
Register
::
DeltaYL
)
?
;
pmw3389
.read_register
(
Register
::
DeltaYH
)
?
;
pmw3389
.upload_firmware
(
itm
)
?
;
pmw3389
.delay
.delay_ms
(
1000
);
iprintln!
(
&
mut
itm
.stim
[
0
],
"Optical Chip Initialized"
);
// read product id
let
id
=
pmw3389
.product_id
()
?
;
iprintln!
(
&
mut
itm
.stim
[
0
],
"product_id 0x{:x}"
,
id
);
let
srom_id
=
pmw3389
.read_register
(
Register
::
SROMId
)
?
;
iprintln!
(
&
mut
itm
.stim
[
0
],
"srom_id {}, 0x{:x}"
,
srom_id
,
srom_id
);
loop
{
// // read product id
pmw3389
.write_register
(
Register
::
Motion
,
0x01
)
?
;
// let id = pmw3389.product_id()?;
// iprintln!(&mut itm.stim[0], "product_id 0x{:x}", id);
let
motion
=
pmw3389
.read_register
(
Register
::
Motion
)
?
;
// let srom_id = pmw3389.read_register(Register::SROMId)?;
let
xl
=
pmw3389
.read_register
(
Register
::
DeltaXL
)
?
;
// iprintln!(&mut itm.stim[0], "srom_id {}, 0x{:x}", srom_id, srom_id);
let
xh
=
pmw3389
.read_register
(
Register
::
DeltaXH
)
?
;
let
yl
=
pmw3389
.read_register
(
Register
::
DeltaYL
)
?
;
let
yh
=
pmw3389
.read_register
(
Register
::
DeltaYH
)
?
;
l
et
x
=
(
xl
as
u16
+
(
xh
as
u16
)
<<
8
)
as
i16
;
//
l
oop {
let
y
=
(
yl
as
u16
+
(
yh
as
u16
)
<<
8
)
as
i16
;
//
pmw3389.write_register(Register::Motion, 0x01)?
;
let
surface
=
motion
&
0x08
;
// let motion = pmw3389.read_register(Register::Motion)?;
let
motion_detect
=
motion
&
0x80
;
// let xl = pmw3389.read_register(Register::DeltaXL)?;
// let xh = pmw3389.read_register(Register::DeltaXH)?;
// let yl = pmw3389.read_register(Register::DeltaYL)?;
// let yh = pmw3389.read_register(Register::DeltaYH)?;
iprintln!
(
// let x = (xl as u16 + (xh as u16) << 8) as i16;
&
mut
itm
.stim
[
0
],
// let y = (yl as u16 + (yh as u16) << 8) as i16;
"motion {}, surface {}, (x, y) {:?}"
,
motion_detect
,
surface
,
(
x
,
y
),
);
pmw3389
.delay
.delay_ms
(
200
);
}
// self.spi.transfer(&mut [Register::MotionBurst.addr()])?
;
//
let surface = motion & 0x08
;
// self.delay.delay_ms(35); // waits for tSRAD
//
let motion_detect = motion & 0x80;
// loop {
// iprintln!(
// pmw3389.read_status(itm)?;
// &mut itm.stim[0],
// pmw3389.delay.delay_ms(10);
// "motion {}, surface {}, (x, y) {:?}",
// }
// motion_detect,
// surface,
// (x, y),
// );
// pmw3389.delay.delay_ms(200);
// }
// Ok(pmw3389)
// // self.spi.transfer(&mut [Register::MotionBurst.addr()])?;
}
// // self.delay.delay_ms(35); // waits for tSRAD
pub
fn
read_register
(
&
mut
self
,
reg
:
Register
)
->
Result
<
u8
,
E
>
{
self
.com_begin
();
let
mut
buffer
=
[
reg
.addr
()
&
0x7f
];
self
.spi
.transfer
(
&
mut
buffer
)
?
;
// tSRAD
self
.delay
.delay_us
(
100
);
self
.delay
.delay_us
(
120
);
let
mut
buffer
=
[
0
];
self
.spi
.transfer
(
&
mut
buffer
)
?
;
// tSCLK-NCS for read operation is 120ns
self
.delay
.delay_us
(
1
);
self
.com_end
();
// tSRW/tSRR (=20us) minus tSCLK-NCS
self
.delay
.delay_us
(
19
);
self
.delay
.delay_us
(
120
);
Ok
(
buffer
[
0
])
}
pub
fn
write_register
(
&
mut
self
,
reg
:
Register
,
byte
:
u8
)
->
Result
<
(),
E
>
{
self
.com_begin
();
let
mut
buffer
=
[
reg
.addr
()
|
0x80
];
self
.spi
.transfer
(
&
mut
buffer
)
?
;
// send
let
mut
buffer
=
[
byte
];
self
.spi
.transfer
(
&
mut
buffer
)
?
;
// tSCLK-NCS for write operation
self
.delay
.delay_us
(
20
);
self
.com_end
();
// tSWW/tSWR (=120us) minus tSCLK-NCS.
// Could be shortened, but is looks like a safe lower bound
self
.delay
.delay_us
(
100
);
Ok
(())
}
/// Reads the ProductId register; should return `0x47`
pub
fn
product_id
(
&
mut
self
)
->
Result
<
u8
,
E
>
{
self
.read_register
(
Register
::
ProductId
)
}
/// Read status
pub
fn
read_status
(
&
mut
self
,
itm
:
&
mut
stm32
::
ITM
)
->
Result
<
(),
E
>
{
self
.com_begin
();
self
.spi
.transfer
(
&
mut
[
Register
::
MotionBurst
.addr
()])
?
;
self
.delay
.delay_us
(
35
);
// waits for tSRAD
// read burst buffer
let
mut
buf
=
[
0u8
;
12
];
self
.spi
.transfer
(
&
mut
buf
)
?
;
// tSCLK-NCS for read operation is 120ns
self
.delay
.delay_us
(
120
);
self
.com_end
();
iprint!
(
&
mut
itm
.stim
[
0
],
"burst ["
);
for
j
in
buf
.iter
()
{
iprint!
(
&
mut
itm
.stim
[
0
],
"0x{:02x}, "
,
j
);
}
iprintln!
(
&
mut
itm
.stim
[
0
],
"]"
);
// SPI.endTransaction(); // Per:Not sure what it does
// /*
// BYTE[00] = Motion = if the 7th bit is 1, a motion is detected.
// ==> 7 bit: MOT (1 when motion is detected)
// ==> 3 bit: 0 when chip is on surface / 1 when off surface
// ] = Observation
// BYTE[02] = Delta_X_L = dx (LSB)
// BYTE[03] = Delta_X_H = dx (MSB)
// BYTE[04] = Delta_Y_L = dy (LSB)
// BYTE[05] = Delta_Y_H = dy (MSB)
// BYTE[06] = SQUAL = Surface Quality register, max 0x80
// - Number of features on the surface = SQUAL * 8
// BYTE[07] = Raw_Data_Sum = It reports the upper byte of an 18‐bit counter which sums all 1296 raw data in the current frame;
// * Avg value = Raw_Data_Sum * 1024 / 1296
// BYTE[08] = Maximum_Raw_Data = Max raw data value in current frame, max=127
// BYTE[09] = Minimum_Raw_Data = Min raw data value in current frame, max=127
// BYTE[10] = Shutter_Upper = Shutter LSB
// BYTE[11] = Shutter_Lower = Shutter MSB, Shutter = shutter is adjusted to keep the average raw data values within normal operating ranges
// */
// int motion = (burstBuffer[0] & 0x80) > 0;
let
motion
=
buf
[
0
]
&
0x80
;
let
surface
=
buf
[
0
]
&
0x08
;
// 0 if on surface / 1 if off surface
let
x
=
buf
[
2
]
as
u16
+
(
buf
[
3
]
as
u16
)
<<
8
;
let
y
=
buf
[
4
]
as
u16
+
(
buf
[
5
]
as
u16
)
<<
8
;
let
squal
=
buf
[
6
];
iprintln!
(
&
mut
itm
.stim
[
0
],
"motion {}, surface {}, (x, y) {:?}, squal {}"
,
motion
,
surface
,
(
x
,
y
),
squal
);
Ok
(())
}
// Upload the firmware
pub
fn
upload_firmware
(
&
mut
self
,
itm
:
&
mut
stm32
::
ITM
)
->
Result
<
(),
E
>
{
let
stim
=
&
mut
itm
.stim
[
0
];
// send the firmware to the chip, cf p.18 of the datasheet
// Serial.println("Uploading firmware...");
iprintln!
(
stim
,
"Uploading firmware..."
);
//Write 0 to Rest_En bit of Config2 register to disable Rest mode.
// adns_write_reg(Config2, 0x20);
// is this correct?
self
.write_register
(
Register
::
Config2
,
0x00
)
?
;
// write 0x1d in SROM_enable reg for initializing
// adns_write_reg(SROM_Enable, 0x1d);
self
.write_register
(
Register
::
SROMEnable
,
0x1d
)
?
;
// wait for more than one frame period
// delay(10);
// assume that the frame rate is as low as 100fps...
// even if it should never be that low
self
.delay
.delay_ms
(
10
);
// write 0x18 to SROM_enable to start SROM download
// adns_write_reg(SROM_Enable, 0x18);
self
.write_register
(
Register
::
SROMEnable
,
0x18
)
?
;
iprintln!
(
stim
,
"Begin transfer..."
);
// write the SROM file (=firmware data)
// adns_com_begin();
self
.com_begin
();
// write burst destination address
// SPI.transfer(SROM_Load_Burst | 0x80); // write burst destination address
// delayMicroseconds(15);
self
.spi
.transfer
(
&
mut
[
Register
::
SROMLoadBurst
.addr
()
|
0x80
])
?
;
self
.delay
.delay_us
(
15
);
// send all bytes of the firmware
// // loop {
// unsigned char c;
// // pmw3389.read_status(itm)?;
// for(int i = 0; i < firmware_length; i++){
// // pmw3389.delay.delay_ms(10);
// c = (unsigned char)pgm_read_byte(firmware_data + i);
// // }
// SPI.transfer(c);
// delayMicroseconds(15);
// // Ok(pmw3389)
// }
// }
// pub fn read_register(&mut self, reg: Register) -> Result<u8, E> {
// self.com_begin();
for
i
in
FIRMWARE
.iter
()
{
// let mut buffer = [reg.addr() & 0x7f];
let
mut
buff
=
[
*
i
];
// self.spi.transfer(&mut buffer)?;
// iprintln!(stim, "0x{:x}", buff[0]);
self
.spi
.transfer
(
&
mut
buff
)
?
;
self
.delay
.delay_us
(
15
);
// 15
}
// // Per: added this, seems adequate
self
.delay
.delay_us
(
105
);
self
.com_end
();
//Read the SROM_ID register to verify the ID before any other register reads or writes.
// adns_read_reg(SROM_ID);
let
srom_id
=
self
.read_register
(
Register
::
SROMId
)
?
;
iprintln!
(
stim
,
"srom_id {}, 0x{:x}"
,
srom_id
,
srom_id
);
// //Write 0x00 to Config2 register for wired mouse or 0x20 for wireless mouse design.
// // adns_write_reg(Config2, 0x00);
self
.write_register
(
Register
::
Config2
,
0x20
)
?
;
// // set initial CPI resolution
// // adns_write_reg(Config1, 0x15);
// self.write_register(Register::ResolutionL, 0x15)?;
self
.write_register
(
Register
::
ResolutionL
,
0x5
)
?
;
// self.write_register(Register::ResolutionH, 0x15)?;
self
.write_register
(
Register
::
ResolutionH
,
0x00
)
?
;
// adns_com_end(); // why the CS is already high
self
.com_end
();
Ok
(())
}
}
// const unsigned char firmware_data[] PROGMEM
// // tSRAD
const
FIRMWARE
:
[
u8
;
4094
]
=
[
// self.delay.delay_us(100);
0x01
,
0xe8
,
0xba
,
0x26
,
0x0b
,
0xb2
,
0xbe
,
0xfe
,
0x7e
,
0x5f
,
0x3c
,
0xdb
,
0x15
,
0xa8
,
0xb3
,
// self.delay.delay_us(120);
0xe4
,
0x2b
,
0xb5
,
0xe8
,
0x53
,
0x07
,
0x6d
,
0x3b
,
0xd1
,
0x20
,
0xc2
,
0x06
,
0x6f
,
0x3d
,
0xd9
,
0x11
,
0xa0
,
0xc2
,
0xe7
,
0x2d
,
0xb9
,
0xd1
,
0x20
,
0xa3
,
0xa5
,
0xc8
,
0xf3
,
0x64
,
0x4a
,
0xf7
,
// let mut buffer = [0];
0x4d
,
0x18
,
0x93
,
0xa4
,
0xca
,
0xf7
,
0x6c
,
0x5a
,
0x36
,
0xee
,
0x5e
,
0x3e
,
0xfe
,
0x7e
,
0x7e
,
// self.spi.transfer(&mut buffer)?;
0x5f
,
0x1d
,
0x99
,
0xb0
,
0xc3
,
0xe5
,
0x29
,
0xd3
,
0x03
,
0x65
,
0x48
,
0x12
,
0x87
,
0x6d
,
0x58
,
0x32
,
0xe6
,
0x2f
,
0xdc
,
0x3a
,
0xf2
,
0x4f
,
0xfd
,
0x59
,
0x11
,
0x81
,
0x61
,
0x21
,
0xc0
,
0x02
,
// // tSCLK-NCS for read operation is 120ns
0x86
,
0x8e
,
0x7f
,
0x5d
,
0x38
,
0xf2
,
0x47
,
0x0c
,
0x7b
,
0x55
,
0x28
,
0xb3
,
0xe4
,
0x4a
,
0x16
,
// self.delay.delay_us(1);
0xab
,
0xbf
,
0xdd
,
0x38
,
0xf2
,
0x66
,
0x4e
,
0xff
,
0x5d
,
0x19
,
0x91
,
0xa0
,
0xa3
,
0xa5
,
0xc8
,
0x12
,
0xa6
,
0xaf
,
0xdc
,
0x3a
,
0xd1
,
0x41
,
0x60
,
0x75
,
0x58
,
0x24
,
0x92
,
0xd4
,
0x72
,
0x6c
,
// self.com_end();
0xe0
,
0x2f
,
0xfd
,
0x23
,
0x8d
,
0x1c
,
0x5b
,
0xb2
,
0x97
,
0x36
,
0x3d
,
0x0b
,
0xa2
,
0x49
,
0xb1
,
0x58
,
0xf2
,
0x1f
,
0xc0
,
0xcb
,
0xf8
,
0x41
,
0x4f
,
0xcd
,
0x1e
,
0x6b
,
0x39
,
0xa7
,
0x2b
,
0xe9
,
// // tSRW/tSRR (=20us) minus tSCLK-NCS
0x30
,
0x16
,
0x83
,
0xd2
,
0x0e
,
0x47
,
0x8f
,
0xe3
,
0xb1
,
0xdf
,
0xa2
,
0x15
,
0xdb
,
0x5d
,
0x30
,
// self.delay.delay_us(19);
0xc5
,
0x1a
,
0xab
,
0x31
,
0x99
,
0xf3
,
0xfa
,
0xb2
,
0x86
,
0x69
,
0xad
,
0x7a
,
0xe8
,
0xa7
,
0x18
,
// self.delay.delay_us(120);
0x6a
,
0xcc
,
0xc8
,
0x65
,
0x23
,
0x87
,
0xa8
,
0x5f
,
0xf5
,
0x21
,
0x59
,
0x75
,
0x09
,
0x71
,
0x45
,
0x55
,
0x25
,
0x4b
,
0xda
,
0xa1
,
0xc3
,
0xf7
,
0x41
,
0xab
,
0x59
,
0xd9
,
0x74
,
0x12
,
0x55
,
0x5f
,
// Ok(buffer[0])
0xbc
,
0xaf
,
0xd9
,
0xfd
,
0xb0
,
0x1e
,
0xa3
,
0x0f
,
0xff
,
0xde
,
0x11
,
0x16
,
0x6a
,
0xae
,
0x0e
,
// }
0xe1
,
0x5d
,
0x3c
,
0x10
,
0x43
,
0x9a
,
0xa1
,
0x0b
,
0x24
,
0x8f
,
0x0d
,
0x7f
,
0x0b
,
0x5e
,
0x4c
,
0x42
,
0xa4
,
0x84
,
0x2c
,
0x40
,
0xd0
,
0x55
,
0x39
,
0xe6
,
0x4b
,
0xf8
,
0x9b
,
0x2f
,
0xdc
,
0x28
,
// pub fn write_register(&mut self, reg: Register, byte: u8) -> Result<(), E> {
0xff
,
0xfa
,
0xb5
,
0x85
,
0x19
,
0xe5
,
0x28
,
0xa1
,
0x77
,
0xaa
,
0x73
,
0xf3
,
0x03
,
0xc7
,
0x62
,
// self.com_begin();
0xa6
,
0x91
,
0x18
,
0xc9
,
0xb0
,
0xcd
,
0x05
,
0xdc
,
0xca
,
0x81
,
0x26
,
0x1a
,
0x47
,
0x40
,
0xda
,
0x36
,
0x7d
,
0x6a
,
0x53
,
0xc8
,
0x5a
,
0x77
,
0x5d
,
0x19
,
0xa4
,
0x1b
,
0x23
,
0x83
,
0xd0
,
0xb2
,
// let mut buffer = [reg.addr() | 0x80];
0xaa
,
0x0e
,
0xbf
,
0x77
,
0x4e
,
0x3a
,
0x3b
,
0x59
,
0x00
,
0x31
,
0x0d
,
0x02
,
0x1b
,
0x88
,
0x7a
,
// self.spi.transfer(&mut buffer)?;
0xd4
,
0xbd
,
0x9d
,
0xcc
,
0x58
,
0x04
,
0x69
,
0xf6
,
0x3b
,
0xca
,
0x42
,
0xe2
,
0xfd
,
0xc3
,
0x3d
,
0x39
,
0xc5
,
0xd0
,
0x71
,
0xe4
,
0xc8
,
0xb7
,
0x3e
,
0x3f
,
0xc8
,
0xe9
,
0xca
,
0xc9
,
0x3f
,
0x04
,
// // send
0x4e
,
0x1b
,
0x79
,
0xca
,
0xa5
,
0x61
,
0xc2
,
0xed
,
0x1d
,
0xa6
,
0xda
,
0x5a
,
0xe9
,
0x7f
,
0x65
,
// let mut buffer = [byte];
0x8c
,
0xbe
,
0x12
,
0x6e
,
0xa4
,
0x5b
,
0x33
,
0x2f
,
0x84
,
0x28
,
0x9c
,
0x1c
,
0x88
,
0x2d
,
0xff
,
// self.spi.transfer(&mut buffer)?;
0x07
,
0xbf
,
0xa6
,
0xd7
,
0x5a
,
0x88
,
0x86
,
0xb0
,
0x3f
,
0xf6
,
0x31
,
0x5b
,
0x11
,
0x6d
,
0xf5
,
0x58
,
0xeb
,
0x58
,
0x02
,
0x9e
,
0xb5
,
0x9a
,
0xb1
,
0xff
,
0x25
,
0x9d
,
0x8b
,
0x4f
,
0xb6
,
0x0a
,
// // tSCLK-NCS for write operation
0xf9
,
0xea
,
0x3e
,
0x3f
,
0x21
,
0x09
,
0x65
,
0x21
,
0x22
,
0xfe
,
0x3d
,
0x4e
,
0x11
,
0x5b
,
0x9e
,
// self.delay.delay_us(20);
0x5a
,
0x59
,
0x8b
,
0xdd
,
0xd8
,
0xce
,
0xd6
,
0xd9
,
0x59
,
0xd2
,
0x1e
,
0xfd
,
0xef
,
0x0d
,
0x1b
,
0xd9
,
0x61
,
0x7f
,
0xd7
,
0x2d
,
0xad
,
0x62
,
0x09
,
0xe5
,
0x22
,
0x63
,
0xea
,
0xc7
,
0x31
,
0xd9
,
// self.com_end();
0xa1
,
0x38
,
0x80
,
0x5c
,
0xa7
,
0x32
,
0x82
,
0xec
,
0x1b
,
0xa2
,
0x49
,
0x5a
,
0x06
,
0xd2
,
0x7c
,
// // tSWW/tSWR (=120us) minus tSCLK-NCS.
0xc9
,
0x96
,
0x57
,
0xbb
,
0x17
,
0x75
,
0xfc
,
0x7a
,
0x8f
,
0x0d
,
0x77
,
0xb5
,
0x7a
,
0x8e
,
0x3e
,
// // Could be shortened, but is looks like a safe lower bound
0xf4
,
0xba
,
0x2f
,
0x69
,
0x13
,
0x26
,
0xd6
,
0xd9
,
0x21
,
0x60
,
0x2f
,
0x21
,
0x3e
,
0x87
,
0xee
,
0xfd
,
0x87
,
0x16
,
0x0d
,
0xc8
,
0x08
,
0x00
,
0x25
,
0x71
,
0xac
,
0x2c
,
0x03
,
0x2a
,
0x37
,
0x2d
,
// self.delay.delay_us(100);
0xb3
,
0x34
,
0x09
,
0x91
,
0xe3
,
0x06
,
0x2c
,
0x38
,
0x37
,
0x95
,
0x3b
,
0x17
,
0x7a
,
0xaf
,
0xac
,
0x99
,
0x55
,
0xab
,
0x41
,
0x39
,
0x5f
,
0x8e
,
0xa6
,
0x43
,
0x80
,
0x03
,
0x88
,
0x6f
,
0x7d
,
0xbd
,
// Ok(())
0x5a
,
0xb4
,
0x2b
,
0x32
,
0x23
,
0x5a
,
0xa9
,
0x31
,
0x32
,
0x39
,
0x4c
,
0x5b
,
0xf4
,
0x6b
,
0xaf
,
// }
0x66
,
0x6f
,
0x3c
,
0x8e
,
0x2d
,
0x82
,
0x97
,
0x9f
,
0x4a
,
0x01
,
0xdc
,
0x99
,
0x98
,
0x00
,
0xec
,
0x38
,
0x7a
,
0x79
,
0x70
,
0xa6
,
0x85
,
0xd6
,
0x21
,
0x63
,
0x0d
,
0x45
,
0x9a
,
0x2e
,
0x5e
,
0xa7
,
// /// Reads the ProductId register; should return `0x47`
0xb1
,
0xea
,
0x66
,
0x6a
,
0xbc
,
0x62
,
0x2d
,
0x7b
,
0x7d
,
0x85
,
0xea
,
0x95
,
0x2f
,
0xc0
,
0xe8
,
// pub fn product_id(&mut self) -> Result<u8, E> {
0x6f
,
0x35
,
0xa0
,
0x3a
,
0x02
,
0x25
,
0xbc
,
0xb2
,
0x5f
,
0x5c
,
0x43
,
0x96
,
0xcc
,
0x26
,
0xd2
,
// self.read_register(Register::ProductId)
0x16
,
0xb4
,
0x96
,
0x73
,
0xd7
,
0x13
,
0xc7
,
0xae
,
0x53
,
0x15
,
0x31
,
0x89
,
0x68
,
0x66
,
0x6d
,
// }
0x2c
,
0x92
,
0x1f
,
0xcc
,
0x5b
,
0xa7
,
0x8f
,
0x5d
,
0xbb
,
0xc9
,
0xdb
,
0xe8
,
0x3b
,
0x9d
,
0x61
,
0x74
,
0x8b
,
0x05
,
0xa1
,
0x58
,
0x52
,
0x68
,
0xee
,
0x3d
,
0x39
,
0x79
,
0xa0
,
0x9b
,
0xdd
,
0xe1
,
// /// Read status
0x55
,
0xc9
,
0x60
,
0xeb
,
0xad
,
0xb8
,
0x5b
,
0xc2
,
0x5a
,
0xb5
,
0x2c
,
0x18
,
0x55
,
0xa9
,
0x50
,
// pub fn read_status(&mut self, itm: &mut stm32::ITM) -> Result<(), E> {
0xc3
,
0xf6
,
0x72
,
0x5f
,
0xcc
,
0xe2
,
0xf4
,
0x55
,
0xb5
,
0xd6
,
0xb5
,
0x4a
,
0x99
,
0xa5
,
0x28
,
// self.com_begin();
0x74
,
0x97
,
0x18
,
0xe8
,
0xc0
,
0x84
,
0x89
,
0x50
,
0x03
,
0x86
,
0x4d
,
0x1a
,
0xb7
,
0x09
,
0x90
,
0xa2
,
0x01
,
0x04
,
0xbb
,
0x73
,
0x62
,
0xcb
,
0x97
,
0x22
,
0x70
,
0x5d
,
0x52
,
0x41
,
0x8e
,
0xd9
,
// self.spi.transfer(&mut [Register::MotionBurst.addr()])?;
0x90
,
0x15
,
0xaa
,
0xab
,
0x0a
,
0x31
,
0x65
,
0xb4
,
0xda
,
0xd0
,
0xee
,
0x24
,
0xc9
,
0x41
,
0x91
,
// self.delay.delay_us(35); // waits for tSRAD
0x1e
,
0xbc
,
0x46
,
0x70
,
0x40
,
0x9d
,
0xda
,
0x0e
,
0x2a
,
0xe4
,
0xb2
,
0x4c
,
0x9f
,
0xf2
,
0xfc
,
0xf3
,
0x84
,
0x17
,
0x44
,
0x1e
,
0xd7
,
0xca
,
0x23
,
0x1f
,
0x3f
,
0x5a
,
0x22
,
0x3d
,
0xaf
,
0x9b
,
// // read burst buffer
0x2d
,
0xfc
,
0x41
,
0xad
,
0x26
,
0xb4
,
0x45
,
0x67
,
0x0b
,
0x80
,
0x0e
,
0xf9
,
0x61
,
0x37
,
0xec
,
// let mut buf = [0u8; 12];
0x3b
,
0xf4
,
0x4b
,
0x14
,
0xdf
,
0x5a
,
0x0c
,
0x3a
,
0x50
,
0x0b
,
0x14
,
0x0c
,
0x72
,
0xae
,
0xc6
,
// self.spi.transfer(&mut buf)?;
0xc5
,
0xec
,
0x35
,
0x53
,
0x2d
,
0x59
,
0xed
,
0x91
,
0x74
,
0xe2
,
0xc4
,
0xc8
,
0xf2
,
0x25
,
0x6b
,
0x97
,
0x6f
,
0xc9
,
0x76
,
0xce
,
0xa9
,
0xb1
,
0x99
,
0x8f
,
0x5a
,
0x92
,
0x3b
,
0xc4
,
0x8d
,
0x54
,
// // tSCLK-NCS for read operation is 120ns
0x50
,
0x40
,
0x72
,
0xd6
,
0x90
,
0x83
,
0xfc
,
0xe5
,
0x49
,
0x8b
,
0x17
,
0xf5
,
0xfd
,
0x6b
,
0x8d
,
// self.delay.delay_us(120);
0x32
,
0x02
,
0xe9
,
0x0a
,
0xfe
,
0xbf
,
0x00
,
0x6b
,
0xa3
,
0xad
,
0x5f
,
0x09
,
0x4b
,
0x97
,
0x2b
,
0x00
,
0x58
,
0x65
,
0x2e
,
0x07
,
0x49
,
0x0a
,
0x3b
,
0x6b
,
0x2e
,
0x50
,
0x6c
,
0x1d
,
0xac
,
0xb7
,
// self.com_end();
0x6a
,
0x26
,
0xd8
,
0x13
,
0xa4
,
0xca
,
0x16
,
0xae
,
0xab
,
0x93
,
0xb9
,
0x1c
,
0x1c
,
0xb4
,
0x47
,
0x6a
,
0x38
,
0x36
,
0x17
,
0x27
,
0xc9
,
0x7f
,
0xc7
,
0x64
,
0xcb
,
0x89
,
0x58
,
0xc5
,
0x61
,
0xc2
,
// iprint!(&mut itm.stim[0], "burst [");
0xc6
,
0xea
,
0x15
,
0x0b
,
0x34
,
0x0c
,
0x5d
,
0x61
,
0x76
,
0x6e
,
0x2b
,
0x62
,
0x40
,
0x92
,
0xa3
,
// for j in buf.iter() {
0x6c
,
0xef
,
0xf4
,
0xe4
,
0xc3
,
0xa1
,
0xa8
,
0xf5
,
0x94
,
0x79
,
0x0d
,
0xd1
,
0x3d
,
0xcb
,
0x3d
,
// iprint!(&mut itm.stim[0], "0x{:02x}, ", j);
0x40
,
0xb6
,
0xd0
,
0xf0
,
0x10
,
0x54
,
0xd8
,
0x47
,
0x25
,
0x51
,
0xc5
,
0x41
,
0x79
,
0x00
,
0xe5
,
// }
0xa0
,
0x72
,
0xde
,
0xbb
,
0x3b
,
0x62
,
0x17
,
0xf6
,
0xbc
,
0x5d
,
0x00
,
0x76
,
0x2e
,
0xa7
,
0x3b
,
// iprintln!(&mut itm.stim[0], "]");
0xb6
,
0xf1
,
0x98
,
0x72
,
0x59
,
0x2a
,
0x73
,
0xb0
,
0x21
,
0xd6
,
0x49
,
0xe0
,
0xc0
,
0xd5
,
0xeb
,
0x02
,
0x7d
,
0x4b
,
0x41
,
0x28
,
0x70
,
0x2d
,
0xec
,
0x2b
,
0x71
,
0x1f
,
0x0b
,
0xb9
,
0x71
,
0x63
,
// // SPI.endTransaction(); // Per:Not sure what it does
0x06
,
0xe6
,
0xbc
,
0x60
,
0xbb
,
0xf4
,
0x9a
,
0x62
,
0x43
,
0x09
,
0x18
,
0x4e
,
0x93
,
0x06
,
0x4d
,
// // /*
0x76
,
0xfa
,
0x7f
,
0xbd
,
0x02
,
0xe4
,
0x50
,
0x91
,
0x12
,
0xe5
,
0x86
,
0xff
,
0x64
,
0x1e
,
0xaf
,
// // BYTE[00] = Motion = if the 7th bit is 1, a motion is detected.
0x7e
,
0xb3
,
0xb2
,
0xde
,
0x89
,
0xc1
,
0xa2
,
0x6f
,
0x40
,
0x7b
,
0x41
,
0x51
,
0x63
,
0xea
,
0x25
,
// // ==> 7 bit: MOT (1 when motion is detected)
0xd1
,
0x97
,
0x57
,
0x92
,
0xa8
,
0x45
,
0xa1
,
0xa5
,
0x45
,
0x21
,
0x43
,
0x7f
,
0x83
,
0x15
,
0x29
,
// // ==> 3 bit: 0 when chip is on surface / 1 when off surface
0xd0
,
0x30
,
0x53
,
0x32
,
0xb4
,
0x5a
,
0x17
,
0x96
,
0xbc
,
0xc2
,
0x68
,
0xa9
,
0xb7
,
0xaf
,
0xac
,
// // ] = Observation
0xdf
,
0xf1
,
0xe3
,
0x89
,
0xba
,
0x24
,
0x79
,
0x54
,
0xc6
,
0x14
,
0x07
,
0x1c
,
0x1e
,
0x0d
,
0x3a
,
// // BYTE[02] = Delta_X_L = dx (LSB)
0x6b
,
0xe5
,
0x3d
,
0x4e
,
0x10
,
0x60
,
0x96
,
0xec
,
0x6c
,
0xda
,
0x47
,
0xae
,
0x03
,
0x25
,
0x39
,
// // BYTE[03] = Delta_X_H = dx (MSB)
0x1d
,
0x74
,
0xc8
,
0xac
,
0x6a
,
0xf2
,
0x6b
,
0x05
,
0x2a
,
0x9a
,
0xe7
,
0xe8
,
0x92
,
0xd6
,
0xc2
,
// // BYTE[04] = Delta_Y_L = dy (LSB)
0x6d
,
0xfa
,
0xe8
,
0xa7
,
0x9d
,
0x5f
,
0x48
,
0xc9
,
0x75
,
0xf1
,
0x66
,
0x6a
,
0xdb
,
0x5d
,
0x9a
,
// // BYTE[05] = Delta_Y_H = dy (MSB)
0xcd
,
0x27
,
0xdd
,
0xb9
,
0x24
,
0x04
,
0x9c
,
0x18
,
0xc2
,
0x6d
,
0x0c
,
0x91
,
0x34
,
0x48
,
0x42
,
// // BYTE[06] = SQUAL = Surface Quality register, max 0x80
0x6f
,
0xe9
,
0x59
,
0x70
,
0xc4
,
0x7e
,
0x81
,
0x0e
,
0x32
,
0x0a
,
0x93
,
0x48
,
0xb0
,
0xc0
,
0x15
,
// // - Number of features on the surface = SQUAL * 8
0x9e
,
0x05
,
0xac
,
0x36
,
0x16
,
0xcb
,
0x59
,
0x65
,
0xa0
,
0x83
,
0xdf
,
0x3e
,
0xda
,
0xfb
,
0x1d
,
// // BYTE[07] = Raw_Data_Sum = It reports the upper byte of an 18‐bit counter which sums all 1296 raw data in the current frame;
0x1a
,
0xdb
,
0x65
,
0xec
,
0x9a
,
0xc6
,
0xc3
,
0x8e
,
0x3c
,
0x45
,
0xfd
,
0xc8
,
0xf5
,
0x1c
,
0x6a
,
// // * Avg value = Raw_Data_Sum * 1024 / 1296
0x67
,
0x0d
,
0x8f
,
0x99
,
0x7d
,
0x30
,
0x21
,
0x8c
,
0xea
,
0x22
,
0x87
,
0x65
,
0xc9
,
0xb2
,
0x4c
,
// // BYTE[08] = Maximum_Raw_Data = Max raw data value in current frame, max=127
0xe4
,
0x1b
,
0x46
,
0xba
,
0x54
,
0xbd
,
0x7c
,
0xca
,
0xd5
,
0x8f
,
0x5b
,
0xa5
,
0x01
,
0x04
,
0xd8
,
// // BYTE[09] = Minimum_Raw_Data = Min raw data value in current frame, max=127
0x0a
,
0x16
,
0xbf
,
0xb9
,
0x50
,
0x2e
,
0x37
,
0x2f
,
0x64
,
0xf3
,
0x70
,
0x11
,
0x02
,
0x05
,
0x31
,
// // BYTE[10] = Shutter_Upper = Shutter LSB
0x9b
,
0xa0
,
0xb2
,
0x01
,
0x5e
,
0x4f
,
0x19
,
0xc9
,
0xd4
,
0xea
,
0xa1
,
0x79
,
0x54
,
0x53
,
0xa7
,
// // BYTE[11] = Shutter_Lower = Shutter MSB, Shutter = shutter is adjusted to keep the average raw data values within normal operating ranges
0xde
,
0x2f
,
0x49
,
0xd3
,
0xd1
,
0x63
,
0xb5
,
0x03
,
0x15
,
0x4e
,
0xbf
,
0x04
,
0xb3
,
0x26
,
0x8b
,
// // */
0x20
,
0xb2
,
0x45
,
0xcf
,
0xcd
,
0x5b
,
0x82
,
0x32
,
0x88
,
0x61
,
0xa7
,
0xa8
,
0xb2
,
0xa0
,
0x72
,
// // int motion = (burstBuffer[0] & 0x80) > 0;
0x96
,
0xc0
,
0xdb
,
0x2b
,
0xe2
,
0x5f
,
0xba
,
0xe3
,
0xf5
,
0x8a
,
0xde
,
0xf1
,
0x18
,
0x01
,
0x16
,
// let motion = buf[0] & 0x80;
0x40
,
0xd9
,
0x86
,
0x12
,
0x09
,
0x18
,
0x1b
,
0x05
,
0x0c
,
0xb1
,
0xb5
,
0x47
,
0xe2
,
0x43
,
0xab
,
// let surface = buf[0] & 0x08;
0xfe
,
0x92
,
0x63
,
0x7e
,
0x95
,
0x2b
,
0xf0
,
0xaf
,
0xe1
,
0xf1
,
0xc3
,
0x4a
,
0xff
,
0x2b
,
0x09
,
// // 0 if on surface / 1 if off surface
0xbb
,
0x4a
,
0x0e
,
0x9a
,
0xc4
,
0xd8
,
0x64
,
0x7d
,
0x83
,
0xa0
,
0x4f
,
0x44
,
0xdb
,
0xc4
,
0xa8
,
0x58
,
0xef
,
0xfc
,
0x9e
,
0x77
,
0xf9
,
0xa6
,
0x8f
,
0x58
,
0x8b
,
0x12
,
0xf4
,
0xe9
,
0x81
,
0x12
,
// let x = buf[2] as u16 + (buf[3] as u16) << 8;
0x47
,
0x51
,
0x41
,
0x83
,
0xef
,
0xf6
,
0x73
,
0xbc
,
0x8e
,
0x0f
,
0x4c
,
0x8f
,
0x4e
,
0x69
,
0x90
,
// let y = buf[4] as u16 + (buf[5] as u16) << 8;
0x77
,
0x29
,
0x5d
,
0x92
,
0xb0
,
0x6d
,
0x06
,
0x67
,
0x29
,
0x60
,
0xbd
,
0x4b
,
0x17
,
0xc8
,
0x89
,
0x69
,
0x28
,
0x29
,
0xd6
,
0x78
,
0xcb
,
0x11
,
0x4c
,
0xba
,
0x8b
,
0x68
,
0xae
,
0x7e
,
0x9f
,
0xef
,
// let squal = buf[6];
0x95
,
0xda
,
0xe2
,
0x9e
,
0x7f
,
0xe9
,
0x55
,
0xe5
,
0xe1
,
0xe2
,
0xb7
,
0xe6
,
0x5f
,
0xbb
,
0x2c
,
0xa2
,
0xe6
,
0xee
,
0xc7
,
0x0a
,
0x60
,
0xa9
,
0xd1
,
0x80
,
0xdf
,
0x7f
,
0xd6
,
0x97
,
0xab
,
0x1d
,
// iprintln!(
0x22
,
0x25
,
0xfc
,
0x79
,
0x23
,
0xe0
,
0xae
,
0xc5
,
0xef
,
0x16
,
0xa4
,
0xa1
,
0x0f
,
0x92
,
0xa9
,
// &mut itm.stim[0],
0xc7
,
0xe3
,
0x3a
,
0x55
,
0xdf
,
0x62
,
0x49
,
0xd9
,
0xf5
,
0x84
,
0x49
,
0xc5
,
0x90
,
0x34
,
0xd3
,
// "motion {}, surface {}, (x, y) {:?}, squal {}",
0xe1
,
0xac
,
0x99
,
0x21
,
0xb1
,
0x02
,
0x76
,
0x4a
,
0xfa
,
0xd4
,
0xbb
,
0xa4
,
0x9c
,
0xa2
,
0xe2
,
// motion,
0xcb
,
0x3d
,
0x3b
,
0x14
,
0x75
,
0x60
,
0xd1
,
0x02
,
0xb4
,
0xa3
,
0xb4
,
0x72
,
0x06
,
0xf9
,
0x19
,
// surface,
0x9c
,
0xe2
,
0xe4
,
0xa7
,
0x0f
,
0x25
,
0x88
,
0xc6
,
0x86
,
0xd6
,
0x8c
,
0x74
,
0x4e
,
0x6e
,
0xfc
,
// (x, y),
0xa8
,
0x48
,
0x9e
,
0xa7
,
0x9d
,
0x1a
,
0x4b
,
0x37
,
0x09
,
0xc8
,
0xb0
,
0x10
,
0xbe
,
0x6f
,
0xfe
,
// squal
0xa3
,
0xc4
,
0x7a
,
0xb5
,
0x3d
,
0xe8
,
0x30
,
0xf1
,
0x0d
,
0xa0
,
0xb2
,
0x44
,
0xfc
,
0x9b
,
0x8c
,
// );
0xf8
,
0x61
,
0xed
,
0x81
,
0xd1
,
0x62
,
0x11
,
0xb4
,
0xe1
,
0xd5
,
0x39
,
0x52
,
0x89
,
0xd3
,
0xa8
,
0x49
,
0x31
,
0xdf
,
0xb6
,
0xf9
,
0x91
,
0xf4
,
0x1c
,
0x9d
,
0x09
,
0x95
,
0x40
,
0x56
,
0xe7
,
0xe3
,
// Ok(())
0xcd
,
0x5c
,
0x92
,
0xc1
,
0x1d
,
0x6b
,
0xe9
,
0x78
,
0x6f
,
0x8e
,
0x94
,
0x42
,
0x66
,
0xa2
,
0xaa
,
// }
0xd3
,
0xc8
,
0x2e
,
0xe3
,
0xf6
,
0x07
,
0x72
,
0x0b
,
0x6b
,
0x1e
,
0x7b
,
0xb9
,
0x7c
,
0xe0
,
0xa0
,
0xbc
,
0xd9
,
0x25
,
0xdf
,
0x87
,
0xa8
,
0x5f
,
0x9c
,
0xcc
,
0xf0
,
0xdb
,
0x42
,
0x8e
,
0x07
,
0x31
,
// // Upload the firmware
0x13
,
0x01
,
0x66
,
0x32
,
0xd1
,
0xb8
,
0xd6
,
0xe3
,
0x5e
,
0x12
,
0x76
,
0x61
,
0xd3
,
0x38
,
0x89
,
// pub fn upload_firmware(&mut self, itm: &mut stm32::ITM) -> Result<(), E> {
0xe6
,
0x17
,
0x6f
,
0xa5
,
0xf2
,
0x71
,
0x0e
,
0xa5
,
0xe2
,
0x88
,
0x30
,
0xbb
,
0xbe
,
0x8a
,
0xea
,
// let stim = &mut itm.stim[0];
0xc7
,
0x62
,
0xc4
,
0xcf
,
0xb8
,
0xcd
,
0x33
,
0x8d
,
0x3d
,
0x3e
,
0xb5
,
0x60
,
0x3a
,
0x03
,
0x92
,
// // send the firmware to the chip, cf p.18 of the datasheet
0xe4
,
0x6d
,
0x1b
,
0xe0
,
0xb4
,
0x84
,
0x08
,
0x55
,
0x88
,
0xa7
,
0x3a
,
0xb9
,
0x3d
,
0x43
,
0xc3
,
// // Serial.println("Uploading firmware...");
0xc0
,
0xfa
,
0x07
,
0x6a
,
0xca
,
0x94
,
0xad
,
0x99
,
0x55
,
0xf1
,
0xf1
,
0xc0
,
0x23
,
0x87
,
0x1d
,
// iprintln!(stim, "Uploading firmware...");
0x3d
,
0x1c
,
0xd1
,
0x66
,
0xa0
,
0x57
,
0x10
,
0x52
,
0xa2
,
0x7f
,
0xbe
,
0xf9
,
0x88
,
0xb6
,
0x02
,
0xbf
,
0x08
,
0x23
,
0xa9
,
0x0c
,
0x63
,
0x17
,
0x2a
,
0xae
,
0xf5
,
0xf7
,
0xb7
,
0x21
,
0x83
,
0x92
,
// //Write 0 to Rest_En bit of Config2 register to disable Rest mode.
0x31
,
0x23
,
0x0d
,
0x20
,
0xc3
,
0xc2
,
0x05
,
0x21
,
0x62
,
0x8e
,
0x45
,
0xe8
,
0x14
,
0xc1
,
0xda
,
// // adns_write_reg(Config2, 0x20);
0x75
,
0xb8
,
0xf8
,
0x92
,
0x01
,
0xd0
,
0x5d
,
0x18
,
0x9f
,
0x99
,
0x11
,
0x19
,
0xf5
,
0x35
,
0xe8
,
// // is this correct?
0x7f
,
0x20
,
0x88
,
0x8c
,
0x05
,
0x75
,
0xf5
,
0xd7
,
0x40
,
0x17
,
0xbb
,
0x1e
,
0x36
,
0x52
,
0xd9
,
// self.write_register(Register::Config2, 0x00)?;
0xa4
,
0x9c
,
0xc2
,
0x9d
,
0x42
,
0x81
,
0xd8
,
0xc7
,
0x8a
,
0xe7
,
0x4c
,
0x81
,
0xe0
,
0xb7
,
0x57
,
0xed
,
0x48
,
0x8b
,
0xf0
,
0x97
,
0x15
,
0x61
,
0xd9
,
0x2c
,
0x7c
,
0x45
,
0xaf
,
0xc2
,
0xcd
,
0xfc
,
// // write 0x1d in SROM_enable reg for initializing
0xaa
,
0x13
,
0xad
,
0x59
,
0xcc
,
0xb2
,
0xb2
,
0x6e
,
0xdd
,
0x63
,
0x9c
,
0x32
,
0x0f
,
0xec
,
0x83
,
// // adns_write_reg(SROM_Enable, 0x1d);
0xbe
,
0x78
,
0xac
,
0x91
,
0x44
,
0x1a
,
0x1f
,
0xea
,
0xfd
,
0x5d
,
0x8e
,
0xb4
,
0xc0
,
0x84
,
0xd4
,
// self.write_register(Register::SROMEnable, 0x1d)?;
0xac
,
0xb4
,
0x87
,
0x5f
,
0xac
,
0xef
,
0xdf
,
0xcd
,
0x12
,
0x56
,
0xc8
,
0xcd
,
0xfe
,
0xc5
,
0xda
,
0xd3
,
0xc1
,
0x69
,
0xf3
,
0x61
,
0x05
,
0xea
,
0x25
,
0xe2
,
0x12
,
0x05
,
0x8f
,
0x39
,
0x08
,
0x08
,
// // wait for more than one frame period
0x7c
,
0x37
,
0xb6
,
0x7e
,
0x5b
,
0xd8
,
0xb1
,
0x0e
,
0xf2
,
0xdb
,
0x4b
,
0xf1
,
0xad
,
0x90
,
0x01
,
// // delay(10);
0x57
,
0xcd
,
0xa0
,
0xb4
,
0x52
,
0xe8
,
0xf3
,
0xd7
,
0x8a
,
0xbd
,
0x4f
,
0x9f
,
0x21
,
0x40
,
0x72
,
// // assume that the frame rate is as low as 100fps...
0xa4
,
0xfc
,
0x0b
,
0x01
,
0x2b
,
0x2f
,
0xb6
,
0x4c
,
0x95
,
0x2d
,
0x35
,
0x33
,
0x41
,
0x6b
,
0xa0
,
// // even if it should never be that low
0x93
,
0xe7
,
0x2c
,
0xf2
,
0xd3
,
0x72
,
0x8b
,
0xf4
,
0x4f
,
0x15
,
0x3c
,
0xaf
,
0xd6
,
0x12
,
0xde
,
// self.delay.delay_ms(10);
0x3f
,
0x83
,
0x3f
,
0xff
,
0xf8
,
0x7f
,
0xf6
,
0xcc
,
0xa6
,
0x7f
,
0xc9
,
0x9a
,
0x6e
,
0x1f
,
0xc1
,
0x0c
,
0xfb
,
0xee
,
0x9c
,
0xe7
,
0xaf
,
0xc9
,
0x26
,
0x54
,
0xef
,
0xb0
,
0x39
,
0xef
,
0xb2
,
0xe9
,
// // write 0x18 to SROM_enable to start SROM download
0x23
,
0xc4
,
0xef
,
0xd1
,
0xa1
,
0xa4
,
0x25
,
0x24
,
0x6f
,
0x8d
,
0x6a
,
0xe5
,
0x8a
,
0x32
,
0x3a
,
// // adns_write_reg(SROM_Enable, 0x18);
0xaf
,
0xfc
,
0xda
,
0xce
,
0x18
,
0x25
,
0x42
,
0x07
,
0x4d
,
0x45
,
0x8b
,
0xdf
,
0x85
,
0xcf
,
0x55
,
// self.write_register(Register::SROMEnable, 0x18)?;
0xb2
,
0x24
,
0xfe
,
0x9c
,
0x69
,
0x74
,
0xa7
,
0x6e
,
0xa0
,
0xce
,
0xc0
,
0x39
,
0xf4
,
0x86
,
0xc6
,
0x8d
,
0xae
,
0xb9
,
0x48
,
0x64
,
0x13
,
0x0b
,
0x40
,
0x81
,
0xa2
,
0xc9
,
0xa8
,
0x85
,
0x51
,
0xee
,
// iprintln!(stim, "Begin transfer...");
0x9f
,
0xcf
,
0xa2
,
0x8c
,
0x19
,
0x52
,
0x48
,
0xe2
,
0xc1
,
0xa8
,
0x58
,
0xb4
,
0x10
,
0x24
,
0x06
,
0x58
,
0x51
,
0xfc
,
0xb9
,
0x12
,
0xec
,
0xfd
,
0x73
,
0xb4
,
0x6d
,
0x84
,
0xfa
,
0x06
,
0x8b
,
0x05
,
// // write the SROM file (=firmware data)
0x0b
,
0x2d
,
0xd6
,
0xd6
,
0x1f
,
0x29
,
0x82
,
0x9f
,
0x19
,
0x12
,
0x1e
,
0xb2
,
0x04
,
0x8f
,
0x7f
,
// // adns_com_begin();
0x4d
,
0xbd
,
0x30
,
0x2e
,
0xe3
,
0xe0
,
0x88
,
0x29
,
0xc5
,
0x93
,
0xd6
,
0x6c
,
0x1f
,
0x29
,
0x45
,
// self.com_begin();
0x91
,
0xa7
,
0x58
,
0xcd
,
0x05
,
0x17
,
0xd6
,
0x6d
,
0xb3
,
0xca
,
0x66
,
0xcc
,
0x3c
,
0x4a
,
0x74
,
0xfd
,
0x08
,
0x10
,
0xa6
,
0x99
,
0x92
,
0x10
,
0xd2
,
0x85
,
0xab
,
0x6e
,
0x1d
,
0x0e
,
0x8b
,
0x26
,
// // write burst destination address
0x46
,
0xd1
,
0x6c
,
0x84
,
0xc0
,
0x26
,
0x43
,
0x59
,
0x68
,
0xf0
,
0x13
,
0x1d
,
0xfb
,
0xe3
,
0xd1
,
// // SPI.transfer(SROM_Load_Burst | 0x80); // write burst destination address
0xd2
,
0xb4
,
0x71
,
0x9e
,
0xf2
,
0x59
,
0x6a
,
0x33
,
0x29
,
0x79
,
0xd2
,
0xd7
,
0x26
,
0xf1
,
0xae
,
// // delayMicroseconds(15);
0x78
,
0x9e
,
0x1f
,
0x0f
,
0x3f
,
0xe3
,
0xe8
,
0xd0
,
0x27
,
0x78
,
0x77
,
0xf6
,
0xac
,
0x9c
,
0x56
,
0x39
,
0x73
,
0x8a
,
0x6b
,
0x2f
,
0x34
,
0x78
,
0xb1
,
0x11
,
0xdb
,
0xa4
,
0x5c
,
0x80
,
0x01
,
0x71
,
// self.spi
0x6a
,
0xc2
,
0xd1
,
0x2e
,
0x5e
,
0x76
,
0x28
,
0x70
,
0x93
,
0xae
,
0x3e
,
0x78
,
0xb0
,
0x1f
,
0x0f
,
// .transfer(&mut [Register::SROMLoadBurst.addr() | 0x80])?;
0xda
,
0xbf
,
0xfb
,
0x8a
,
0x67
,
0x65
,
0x4f
,
0x91
,
0xed
,
0x49
,
0x75
,
0x78
,
0x62
,
0xa2
,
0x93
,
0xb5
,
0x70
,
0x7f
,
0x4d
,
0x08
,
0x4e
,
0x79
,
0x61
,
0xa8
,
0x5f
,
0x7f
,
0xb4
,
0x65
,
0x9f
,
0x91
,
// self.delay.delay_us(15);
0x54
,
0x3a
,
0xe8
,
0x50
,
0x33
,
0xd3
,
0xd5
,
0x8a
,
0x7c
,
0xf3
,
0x9e
,
0x8b
,
0x77
,
0x7b
,
0xc6
,
0xc6
,
0x0c
,
0x45
,
0x95
,
0x1f
,
0xb0
,
0xd0
,
0x0b
,
0x27
,
0x4a
,
0xfd
,
0xc7
,
0xf7
,
0x0d
,
0x5a
,
// // send all bytes of the firmware
0x43
,
0xc9
,
0x7d
,
0x35
,
0xb0
,
0x7d
,
0xc4
,
0x9c
,
0x57
,
0x1e
,
0x76
,
0x0d
,
0xf1
,
0x95
,
0x30
,
// // unsigned char c;
0x71
,
0xcc
,
0xb3
,
0x66
,
0x3b
,
0x63
,
0xa8
,
0x6c
,
0xa3
,
0x43
,
0xa0
,
0x24
,
0xcc
,
0xb7
,
0x53
,
// // for(int i = 0; i < firmware_length; i++){
0xfe
,
0xfe
,
0xbc
,
0x6e
,
0x60
,
0x89
,
0xaf
,
0x16
,
0x21
,
0xc8
,
0x91
,
0x6a
,
0x89
,
0xce
,
0x80
,
// // c = (unsigned char)pgm_read_byte(firmware_data + i);
0x2c
,
0xf1
,
0x59
,
0xce
,
0xc3
,
0x60
,
0x61
,
0x3b
,
0x0b
,
0x19
,
0xfe
,
0x99
,
0xac
,
0x65
,
0x90
,
// // SPI.transfer(c);
0x15
,
0x12
,
0x05
,
0xac
,
0x7e
,
0xff
,
0x98
,
0x7b
,
0x66
,
0x64
,
0x0e
,
0x4b
,
0x5b
,
0xaa
,
0x8d
,
// // delayMicroseconds(15);
0x3b
,
0xd2
,
0x56
,
0xcf
,
0x99
,
0x39
,
0xee
,
0x22
,
0x81
,
0xd0
,
0x60
,
0x06
,
0x66
,
0x20
,
0x81
,
// // }
0x48
,
0x3c
,
0x6f
,
0x3a
,
0x77
,
0xba
,
0xcb
,
0x52
,
0xac
,
0x79
,
0x56
,
0xaf
,
0xe9
,
0x16
,
0x17
,
0x0a
,
0xa3
,
0x82
,
0x08
,
0xd5
,
0x3c
,
0x97
,
0xcb
,
0x09
,
0xff
,
0x7f
,
0xf9
,
0x4f
,
0x60
,
0x05
,
// for i in FIRMWARE.iter() {
0xb9
,
0x53
,
0x26
,
0xaa
,
0xb8
,
0x50
,
0xaa
,
0x19
,
0x25
,
0xae
,
0x5f
,
0xea
,
0x8a
,
0xd0
,
0x89
,
// let mut buff = [*i];
0x12
,
0x80
,
0x43
,
0x50
,
0x24
,
0x12
,
0x21
,
0x14
,
0xcd
,
0x77
,
0xeb
,
0x21
,
0xcc
,
0x5c
,
0x09
,
// // iprintln!(stim, "0x{:x}", buff[0]);
0x64
,
0xf3
,
0xc7
,
0xcb
,
0xc5
,
0x4b
,
0xc3
,
0xe7
,
0xed
,
0xe7
,
0x86
,
0x2c
,
0x1d
,
0x8e
,
0x19
,
// self.spi.transfer(&mut buff)?;
0x52
,
0x9b
,
0x2a
,
0x0c
,
0x18
,
0x72
,
0x0b
,
0x1e
,
0x1b
,
0xb0
,
0x0f
,
0x42
,
0x99
,
0x04
,
0xae
,
// self.delay.delay_us(15); // 15
0xd5
,
0xb7
,
0x89
,
0x1a
,
0xb9
,
0x4f
,
0xd6
,
0xaf
,
0xf3
,
0xc9
,
0x93
,
0x6f
,
0xb0
,
0x60
,
0x83
,
// }
0x6e
,
0x6b
,
0xd1
,
0x5f
,
0x3f
,
0x1a
,
0x83
,
0x1e
,
0x24
,
0x00
,
0x87
,
0xb5
,
0x3e
,
0xdb
,
0xf9
,
0x4d
,
0xa7
,
0x16
,
0x2e
,
0x19
,
0x5b
,
0x8f
,
0x1b
,
0x0d
,
0x47
,
0x72
,
0x42
,
0xe9
,
0x0a
,
0x11
,
// // // Per: added this, seems adequate
0x08
,
0x2d
,
0x88
,
0x1c
,
0xbc
,
0xc7
,
0xb4
,
0xbe
,
0x29
,
0x4d
,
0x03
,
0x5e
,
0xec
,
0xdf
,
0xf3
,
// self.delay.delay_us(105);
0x3d
,
0x2f
,
0xe8
,
0x1d
,
0x9a
,
0xd2
,
0xd1
,
0xab
,
0x41
,
0x3d
,
0x87
,
0x11
,
0x45
,
0xb0
,
0x0d
,
0x46
,
0xf5
,
0xe8
,
0x95
,
0x62
,
0x1c
,
0x68
,
0xf7
,
0xa6
,
0x5b
,
0x39
,
0x4e
,
0xbf
,
0x47
,
0xba
,
// self.com_end();
0x5d
,
0x7f
,
0xb7
,
0x6a
,
0xf4
,
0xba
,
0x1d
,
0x69
,
0xf6
,
0xa4
,
0xe7
,
0xe4
,
0x6b
,
0x3b
,
0x0d
,
0x23
,
0x16
,
0x4a
,
0xb2
,
0x68
,
0xf0
,
0xb2
,
0x0d
,
0x09
,
0x17
,
0x6a
,
0x63
,
0x8c
,
0x83
,
0xd3
,
// //Read the SROM_ID register to verify the ID before any other register reads or writes.
0xbd
,
0x05
,
0xc9
,
0xf6
,
0xf0
,
0xa1
,
0x31
,
0x0b
,
0x2c
,
0xac
,
0x83
,
0xac
,
0x80
,
0x34
,
0x32
,
// // adns_read_reg(SROM_ID);
0xb4
,
0xec
,
0xd0
,
0xbc
,
0x54
,
0x82
,
0x9a
,
0xc8
,
0xf6
,
0xa0
,
0x7d
,
0xc6
,
0x79
,
0x73
,
0xf4
,
0x20
,
0x99
,
0xf3
,
0xb4
,
0x01
,
0xde
,
0x91
,
0x27
,
0xf2
,
0xc0
,
0xdc
,
0x81
,
0x00
,
0x4e
,
0x7e
,
// let srom_id = self.read_register(Register::SROMId)?;
0x07
,
0x99
,
0xc8
,
0x3a
,
0x51
,
0xbc
,
0x38
,
0xd6
,
0x8a
,
0xa2
,
0xde
,
0x3b
,
0x6a
,
0x8c
,
0x1a
,
// iprintln!(stim, "srom_id {}, 0x{:x}", srom_id, srom_id);
0x7c
,
0x81
,
0x0f
,
0x3a
,
0x1f
,
0xe4
,
0x05
,
0x7b
,
0x20
,
0x35
,
0x6b
,
0xa5
,
0x6a
,
0xa7
,
0xe7
,
0xbc
,
0x9c
,
0x20
,
0xec
,
0x00
,
0x15
,
0xe2
,
0x51
,
0xaf
,
0x77
,
0xeb
,
0x29
,
0x3c
,
0x7d
,
0x2e
,
// // //Write 0x00 to Config2 register for wired mouse or 0x20 for wireless mouse design.
0x00
,
0x5c
,
0x81
,
0x21
,
0xfa
,
0x35
,
0x6f
,
0x40
,
0xef
,
0xfb
,
0xd1
,
0x3f
,
0xcc
,
0x9d
,
0x55
,
// // // adns_write_reg(Config2, 0x00);
0x53
,
0xfb
,
0x5a
,
0xa5
,
0x56
,
0x89
,
0x0b
,
0x52
,
0xeb
,
0x57
,
0x73
,
0x4f
,
0x1b
,
0x67
,
0x24
,
// self.write_register(Register::Config2, 0x20)?;
0xcb
,
0xb8
,
0x6a
,
0x10
,
0x69
,
0xd6
,
0xfb
,
0x52
,
0x40
,
0xff
,
0x20
,
0xa5
,
0xf3
,
0x72
,
0xe1
,
0x3d
,
0xa4
,
0x8c
,
0x81
,
0x66
,
0x16
,
0x0d
,
0x5d
,
0xad
,
0xa8
,
0x50
,
0x25
,
0x78
,
0x31
,
0x77
,
// // // set initial CPI resolution
0x0c
,
0x57
,
0xe4
,
0xe9
,
0x15
,
0x2d
,
0xdb
,
0x07
,
0x87
,
0xc8
,
0xb0
,
0x43
,
0xde
,
0xfc
,
0xfe
,
// // // adns_write_reg(Config1, 0x15);
0xa9
,
0xeb
,
0xf5
,
0xb0
,
0xd3
,
0x7b
,
0xe9
,
0x1f
,
0x6e
,
0xca
,
0xe4
,
0x03
,
0x95
,
0xc5
,
0xd1
,
0x59
,
0x72
,
0x63
,
0xf0
,
0x86
,
0x54
,
0xe8
,
0x16
,
0x62
,
0x0b
,
0x35
,
0x29
,
0xc2
,
0x68
,
0xd0
,
// // self.write_register(Register::ResolutionL, 0x15)?;
0xd6
,
0x3e
,
0x90
,
0x60
,
0x57
,
0x1d
,
0xc9
,
0xed
,
0x3f
,
0xed
,
0xb0
,
0x2f
,
0x7e
,
0x97
,
0x02
,
// self.write_register(Register::ResolutionL, 0x5)?;
0x51
,
0xec
,
0xee
,
0x6f
,
0x82
,
0x74
,
0x76
,
0x7f
,
0xfb
,
0xd6
,
0xc4
,
0xc3
,
0xdd
,
0xe8
,
0xb1
,
// // self.write_register(Register::ResolutionH, 0x15)?;
0x60
,
0xfc
,
0xc6
,
0xb9
,
0x0d
,
0x6a
,
0x33
,
0x78
,
0xc6
,
0xc1
,
0xbf
,
0x86
,
0x2c
,
0x50
,
0xcc
,
// self.write_register(Register::ResolutionH, 0x00)?;
0x9a
,
0x70
,
0x8e
,
0x7b
,
0xec
,
0xab
,
0x95
,
0xac
,
0x53
,
0xa0
,
0x4b
,
0x07
,
0x88
,
0xaf
,
0x42
,
0xed
,
0x19
,
0x8d
,
0xf6
,
0x32
,
0x17
,
0x48
,
0x47
,
0x1d
,
0x41
,
0x6f
,
0xfe
,
0x2e
,
0xa7
,
0x8f
,
// // adns_com_end(); // why the CS is already high
0x4b
,
0xa0
,
0x51
,
0xf3
,
0xbf
,
0x02
,
0x0a
,
0x48
,
0x58
,
0xf7
,
0xa1
,
0x6d
,
0xea
,
0xa5
,
0x13
,
// self.com_end();
0x5a
,
0x5b
,
0xea
,
0x0c
,
0x9e
,
0x52
,
0x4f
,
0x9e
,
0xb9
,
0x71
,
0x7f
,
0x23
,
0x83
,
0xda
,
0x1b
,
// Ok(())
0x86
,
0x9a
,
0x41
,
0x29
,
0xda
,
0x70
,
0xe7
,
0x64
,
0xa1
,
0x7b
,
0xd5
,
0x0a
,
0x22
,
0x0d
,
0x5c
,
// }
0x40
,
0xc4
,
0x81
,
0x07
,
0x25
,
0x35
,
0x4a
,
0x1c
,
0x10
,
0xdb
,
0x45
,
0x0a
,
0xff
,
0x36
,
0xd4
,
// }
0xe0
,
0xeb
,
0x5f
,
0x68
,
0xd6
,
0x67
,
0xc6
,
0xd0
,
0x8b
,
0x76
,
0x1a
,
0x7d
,
0x59
,
0x42
,
0xa1
,
0xcb
,
0x96
,
0x4d
,
0x84
,
0x09
,
0x9a
,
0x3d
,
0xe0
,
0x52
,
0x85
,
0x6e
,
0x48
,
0x90
,
0x85
,
0x2a
,
// // const unsigned char firmware_data[] PROGMEM
0x63
,
0xb2
,
0x69
,
0xd2
,
0x00
,
0x43
,
0x31
,
0x37
,
0xb3
,
0x52
,
0xaf
,
0x62
,
0xfa
,
0xc1
,
0xe0
,
// const FIRMWARE: [u8; 4094] = [
0x03
,
0xfb
,
0x62
,
0xaa
,
0x88
,
0xc9
,
0xb2
,
0x2c
,
0xd5
,
0xa8
,
0xf5
,
0xa5
,
0x4c
,
0x12
,
0x59
,
// 0x01, 0xe8, 0xba, 0x26, 0x0b, 0xb2, 0xbe, 0xfe, 0x7e, 0x5f, 0x3c, 0xdb, 0x15, 0xa8, 0xb3,
0x4e
,
0x06
,
0x5e
,
0x9b
,
0x15
,
0x66
,
0x11
,
0xb2
,
0x27
,
0x92
,
0xdc
,
0x98
,
0x59
,
0xde
,
0xdf
,
// 0xe4, 0x2b, 0xb5, 0xe8, 0x53, 0x07, 0x6d, 0x3b, 0xd1, 0x20, 0xc2, 0x06, 0x6f, 0x3d, 0xd9,
0xfa
,
0x9a
,
0x32
,
0x2e
,
0xc0
,
0x5d
,
0x3c
,
0x33
,
0x41
,
0x6d
,
0xaf
,
0xb2
,
0x25
,
0x23
,
0x14
,
// 0x11, 0xa0, 0xc2, 0xe7, 0x2d, 0xb9, 0xd1, 0x20, 0xa3, 0xa5, 0xc8, 0xf3, 0x64, 0x4a, 0xf7,
0xa5
,
0x7b
,
0xc7
,
0x9b
,
0x68
,
0xf3
,
0xda
,
0xeb
,
0xe3
,
0xa9
,
0xe2
,
0x6f
,
0x0e
,
0x1d
,
0x1c
,
// 0x4d, 0x18, 0x93, 0xa4, 0xca, 0xf7, 0x6c, 0x5a, 0x36, 0xee, 0x5e, 0x3e, 0xfe, 0x7e, 0x7e,
0xba
,
0x55
,
0xb6
,
0x34
,
0x6a
,
0x93
,
0x1f
,
0x1f
,
0xb8
,
0x34
,
0xc8
,
0x84
,
0x08
,
0xb1
,
0x6b
,
// 0x5f, 0x1d, 0x99, 0xb0, 0xc3, 0xe5, 0x29, 0xd3, 0x03, 0x65, 0x48, 0x12, 0x87, 0x6d, 0x58,
0x6a
,
0x28
,
0x74
,
0x74
,
0xe5
,
0xeb
,
0x75
,
0xe9
,
0x7c
,
0xd8
,
0xba
,
0xd8
,
0x42
,
0xa5
,
0xee
,
// 0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xf2, 0x4f, 0xfd, 0x59, 0x11, 0x81, 0x61, 0x21, 0xc0, 0x02,
0x1f
,
0x80
,
0xd9
,
0x96
,
0xb2
,
0x2e
,
0xe7
,
0xbf
,
0xba
,
0xeb
,
0xd1
,
0x69
,
0xbb
,
0x8f
,
0xfd
,
// 0x86, 0x8e, 0x7f, 0x5d, 0x38, 0xf2, 0x47, 0x0c, 0x7b, 0x55, 0x28, 0xb3, 0xe4, 0x4a, 0x16,
0x5a
,
0x63
,
0x8f
,
0x39
,
0x7f
,
0xdf
,
0x1d
,
0x37
,
0xd2
,
0x18
,
0x35
,
0x9d
,
0xb6
,
0xcc
,
0xe4
,
// 0xab, 0xbf, 0xdd, 0x38, 0xf2, 0x66, 0x4e, 0xff, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xa5, 0xc8,
0x27
,
0x81
,
0x89
,
0x38
,
0x38
,
0x68
,
0x33
,
0xe7
,
0x78
,
0xd8
,
0x76
,
0xf5
,
0xee
,
0xd0
,
0x4a
,
// 0x12, 0xa6, 0xaf, 0xdc, 0x3a, 0xd1, 0x41, 0x60, 0x75, 0x58, 0x24, 0x92, 0xd4, 0x72, 0x6c,
0x07
,
0x69
,
0x19
,
0x7a
,
0xad
,
0x18
,
0xb1
,
0x94
,
0x61
,
0x45
,
0x53
,
0xa2
,
0x48
,
0xda
,
0x96
,
// 0xe0, 0x2f, 0xfd, 0x23, 0x8d, 0x1c, 0x5b, 0xb2, 0x97, 0x36, 0x3d, 0x0b, 0xa2, 0x49, 0xb1,
0x4a
,
0xf9
,
0xee
,
0x94
,
0x2a
,
0x1f
,
0x6e
,
0x18
,
0x3c
,
0x92
,
0x46
,
0xd1
,
0x1a
,
0x28
,
0x18
,
// 0x58, 0xf2, 0x1f, 0xc0, 0xcb, 0xf8, 0x41, 0x4f, 0xcd, 0x1e, 0x6b, 0x39, 0xa7, 0x2b, 0xe9,
0x32
,
0x1f
,
0x3a
,
0x45
,
0xbe
,
0x04
,
0x35
,
0x92
,
0xe5
,
0xa3
,
0xcb
,
0xb5
,
0x2e
,
0x32
,
0x43
,
// 0x30, 0x16, 0x83, 0xd2, 0x0e, 0x47, 0x8f, 0xe3, 0xb1, 0xdf, 0xa2, 0x15, 0xdb, 0x5d, 0x30,
0xac
,
0x65
,
0x17
,
0x89
,
0x99
,
0x15
,
0x03
,
0x9e
,
0xb1
,
0x23
,
0x2f
,
0xed
,
0x76
,
0x4d
,
0xd8
,
// 0xc5, 0x1a, 0xab, 0x31, 0x99, 0xf3, 0xfa, 0xb2, 0x86, 0x69, 0xad, 0x7a, 0xe8, 0xa7, 0x18,
0xac
,
0x21
,
0x40
,
0xc4
,
0x99
,
0x4e
,
0x65
,
0x71
,
0x2c
,
0xb3
,
0x45
,
0xab
,
0xfb
,
0xe7
,
0x72
,
// 0x6a, 0xcc, 0xc8, 0x65, 0x23, 0x87, 0xa8, 0x5f, 0xf5, 0x21, 0x59, 0x75, 0x09, 0x71, 0x45,
0x39
,
0x56
,
0x30
,
0x6d
,
0xfb
,
0x74
,
0xeb
,
0x99
,
0xf3
,
0xcd
,
0x57
,
0x5c
,
0x78
,
0x75
,
0xe9
,
// 0x55, 0x25, 0x4b, 0xda, 0xa1, 0xc3, 0xf7, 0x41, 0xab, 0x59, 0xd9, 0x74, 0x12, 0x55, 0x5f,
0x8d
,
0xc3
,
0xa2
,
0xfb
,
0x5d
,
0xe0
,
0x90
,
0xc5
,
0x55
,
0xad
,
0x91
,
0x53
,
0x4e
,
0x9e
,
0xbd
,
// 0xbc, 0xaf, 0xd9, 0xfd, 0xb0, 0x1e, 0xa3, 0x0f, 0xff, 0xde, 0x11, 0x16, 0x6a, 0xae, 0x0e,
0x8c
,
0x49
,
0xa4
,
0xa4
,
0x69
,
0x10
,
0x0c
,
0xc5
,
0x76
,
0xe9
,
0x25
,
0x86
,
0x8d
,
0x66
,
0x23
,
// 0xe1, 0x5d, 0x3c, 0x10, 0x43, 0x9a, 0xa1, 0x0b, 0x24, 0x8f, 0x0d, 0x7f, 0x0b, 0x5e, 0x4c,
0xa8
,
0xdb
,
0x5c
,
0xe8
,
0xd9
,
0x30
,
0xe1
,
0x15
,
0x7b
,
0xc0
,
0x99
,
0x0f
,
0x03
,
0xec
,
0xaa
,
// 0x42, 0xa4, 0x84, 0x2c, 0x40, 0xd0, 0x55, 0x39, 0xe6, 0x4b, 0xf8, 0x9b, 0x2f, 0xdc, 0x28,
0x12
,
0xef
,
0xce
,
0xd4
,
0xea
,
0x55
,
0x5c
,
0x08
,
0x86
,
0xf4
,
0xf4
,
0xb0
,
0x83
,
0x42
,
0x95
,
// 0xff, 0xfa, 0xb5, 0x85, 0x19, 0xe5, 0x28, 0xa1, 0x77, 0xaa, 0x73, 0xf3, 0x03, 0xc7, 0x62,
0x37
,
0xb6
,
0x38
,
0xe0
,
0x2b
,
0x54
,
0x89
,
0xbd
,
0x4e
,
0x20
,
0x9d
,
0x3f
,
0xc3
,
0x4b
,
0xb7
,
// 0xa6, 0x91, 0x18, 0xc9, 0xb0, 0xcd, 0x05, 0xdc, 0xca, 0x81, 0x26, 0x1a, 0x47, 0x40, 0xda,
0xec
,
0xfa
,
0x5a
,
0x14
,
0x03
,
0xcb
,
0x64
,
0xc8
,
0x34
,
0x4a
,
0x4b
,
0x6e
,
0xf8
,
0x6e
,
0x56
,
// 0x36, 0x7d, 0x6a, 0x53, 0xc8, 0x5a, 0x77, 0x5d, 0x19, 0xa4, 0x1b, 0x23, 0x83, 0xd0, 0xb2,
0xf6
,
0xdd
,
0x5f
,
0xa1
,
0x24
,
0xe2
,
0xd4
,
0xd0
,
0x82
,
0x64
,
0x1f
,
0x8e
,
0x9b
,
0xfa
,
0xb4
,
// 0xaa, 0x0e, 0xbf, 0x77, 0x4e, 0x3a, 0x3b, 0x59, 0x00, 0x31, 0x0d, 0x02, 0x1b, 0x88, 0x7a,
0xcb
,
0xdb
,
0x0a
,
0xe8
,
0x15
,
0xfc
,
0x15
,
0xab
,
0x4b
,
0x18
,
0xbf
,
0xd4
,
0x42
,
0x14
,
0x48
,
// 0xd4, 0xbd, 0x9d, 0xcc, 0x58, 0x04, 0x69, 0xf6, 0x3b, 0xca, 0x42, 0xe2, 0xfd, 0xc3, 0x3d,
0x82
,
0x85
,
0xdd
,
0xeb
,
0x49
,
0x1b
,
0x0b
,
0x0b
,
0x05
,
0xe9
,
0xb4
,
0xa1
,
0x33
,
0x0a
,
0x5d
,
// 0x39, 0xc5, 0xd0, 0x71, 0xe4, 0xc8, 0xb7, 0x3e, 0x3f, 0xc8, 0xe9, 0xca, 0xc9, 0x3f, 0x04,
0x0e
,
0x6c
,
0x4b
,
0xc0
,
0xd6
,
0x6c
,
0x7c
,
0xfb
,
0x69
,
0x0b
,
0x53
,
0x19
,
0xe4
,
0xf3
,
0x35
,
// 0x4e, 0x1b, 0x79, 0xca, 0xa5, 0x61, 0xc2, 0xed, 0x1d, 0xa6, 0xda, 0x5a, 0xe9, 0x7f, 0x65,
0xfc
,
0xbe
,
0xa1
,
0x34
,
0x02
,
0x09
,
0x4f
,
0x74
,
0x86
,
0x92
,
0xcd
,
0x5d
,
0x1a
,
0xc1
,
0x27
,
// 0x8c, 0xbe, 0x12, 0x6e, 0xa4, 0x5b, 0x33, 0x2f, 0x84, 0x28, 0x9c, 0x1c, 0x88, 0x2d, 0xff,
0x0c
,
0xf2
,
0xc5
,
0xcf
,
0xdd
,
0x23
,
0x93
,
0x02
,
0xbd
,
0x41
,
0x5e
,
0x42
,
0xf0
,
0xa0
,
0x9d
,
// 0x07, 0xbf, 0xa6, 0xd7, 0x5a, 0x88, 0x86, 0xb0, 0x3f, 0xf6, 0x31, 0x5b, 0x11, 0x6d, 0xf5,
0x0c
,
0x72
,
0xc8
,
0xec
,
0x32
,
0x0a
,
0x8a
,
0xfd
,
0x3d
,
0x5a
,
0x41
,
0x27
,
0x0c
,
0x88
,
0x59
,
// 0x58, 0xeb, 0x58, 0x02, 0x9e, 0xb5, 0x9a, 0xb1, 0xff, 0x25, 0x9d, 0x8b, 0x4f, 0xb6, 0x0a,
0xad
,
0x94
,
0x2e
,
0xef
,
0x5d
,
0x8f
,
0xc7
,
0xdf
,
0x66
,
0xe4
,
0xdd
,
0x56
,
0x6c
,
0x7b
,
0xca
,
// 0xf9, 0xea, 0x3e, 0x3f, 0x21, 0x09, 0x65, 0x21, 0x22, 0xfe, 0x3d, 0x4e, 0x11, 0x5b, 0x9e,
0x55
,
0x81
,
0xae
,
0xae
,
0x5c
,
0x1b
,
0x1a
,
0xab
,
0xae
,
0x99
,
0x8d
,
0xcc
,
0x42
,
0x97
,
0x59
,
// 0x5a, 0x59, 0x8b, 0xdd, 0xd8, 0xce, 0xd6, 0xd9, 0x59, 0xd2, 0x1e, 0xfd, 0xef, 0x0d, 0x1b,
0xf4
,
0x14
,
0x3f
,
0x75
,
0xc6
,
0xd1
,
0x88
,
0xba
,
0xaa
,
0x84
,
0x4a
,
0xd0
,
0x34
,
0x08
,
0x3b
,
// 0xd9, 0x61, 0x7f, 0xd7, 0x2d, 0xad, 0x62, 0x09, 0xe5, 0x22, 0x63, 0xea, 0xc7, 0x31, 0xd9,
0x7d
,
0xdb
,
0x15
,
0x06
,
0xb0
,
0x5c
,
0xbd
,
0x40
,
0xf5
,
0xa8
,
0xec
,
0xae
,
0x36
,
0x40
,
0xdd
,
// 0xa1, 0x38, 0x80, 0x5c, 0xa7, 0x32, 0x82, 0xec, 0x1b, 0xa2, 0x49, 0x5a, 0x06, 0xd2, 0x7c,
0x90
,
0x1c
,
0x3e
,
0x0d
,
0x7e
,
0x73
,
0xc7
,
0xc2
,
0xc5
,
0x6a
,
0xff
,
0x52
,
0x05
,
0x7f
,
0xbe
,
// 0xc9, 0x96, 0x57, 0xbb, 0x17, 0x75, 0xfc, 0x7a, 0x8f, 0x0d, 0x77, 0xb5, 0x7a, 0x8e, 0x3e,
0xd0
,
0x92
,
0xfd
,
0xb3
,
0x6f
,
0xff
,
0x5d
,
0xb7
,
0x97
,
0x64
,
0x73
,
0x7b
,
0xca
,
0xd1
,
0x98
,
// 0xf4, 0xba, 0x2f, 0x69, 0x13, 0x26, 0xd6, 0xd9, 0x21, 0x60, 0x2f, 0x21, 0x3e, 0x87, 0xee,
0x24
,
0x6b
,
0x0b
,
0x01
,
0x68
,
0xdd
,
0x27
,
0x85
,
0x85
,
0xb5
,
0x83
,
0xc1
,
0xe0
,
0x50
,
0x64
,
// 0xfd, 0x87, 0x16, 0x0d, 0xc8, 0x08, 0x00, 0x25, 0x71, 0xac, 0x2c, 0x03, 0x2a, 0x37, 0x2d,
0xc7
,
0xaf
,
0xf1
,
0xc6
,
0x4d
,
0xb1
,
0xef
,
0xc9
,
0xb4
,
0x0a
,
0x6d
,
0x65
,
0xf3
,
0x47
,
0xcc
,
// 0xb3, 0x34, 0x09, 0x91, 0xe3, 0x06, 0x2c, 0x38, 0x37, 0x95, 0x3b, 0x17, 0x7a, 0xaf, 0xac,
0xa3
,
0x02
,
0x21
,
0x0c
,
0xbe
,
0x22
,
0x29
,
0x05
,
0xcf
,
0x5f
,
0xe8
,
0x94
,
0x6c
,
0xe5
,
0xdc
,
// 0x99, 0x55, 0xab, 0x41, 0x39, 0x5f, 0x8e, 0xa6, 0x43, 0x80, 0x03, 0x88, 0x6f, 0x7d, 0xbd,
0xc4
,
0xdf
,
0xbe
,
0x3e
,
0xa8
,
0xb4
,
0x18
,
0xb0
,
0x99
,
0xb8
,
0x6f
,
0xff
,
0x5d
,
0xb9
,
0xfd
,
// 0x5a, 0xb4, 0x2b, 0x32, 0x23, 0x5a, 0xa9, 0x31, 0x32, 0x39, 0x4c, 0x5b, 0xf4, 0x6b, 0xaf,
0x3b
,
0x5d
,
0x16
,
0xbf
,
0x3e
,
0xd8
,
0xb3
,
0xd8
,
0x08
,
0x34
,
0xf6
,
0x47
,
0x35
,
0x5b
,
0x72
,
// 0x66, 0x6f, 0x3c, 0x8e, 0x2d, 0x82, 0x97, 0x9f, 0x4a, 0x01, 0xdc, 0x99, 0x98, 0x00, 0xec,
0x1a
,
0x33
,
0xad
,
0x52
,
0x5d
,
0xb8
,
0xd0
,
0x77
,
0xc6
,
0xab
,
0xba
,
0x55
,
0x09
,
0x5f
,
0x02
,
// 0x38, 0x7a, 0x79, 0x70, 0xa6, 0x85, 0xd6, 0x21, 0x63, 0x0d, 0x45, 0x9a, 0x2e, 0x5e, 0xa7,
0xf8
,
0xd4
,
0x5f
,
0x53
,
0x06
,
0x91
,
0xcd
,
0x74
,
0x42
,
0xae
,
0x54
,
0x91
,
0x81
,
0x62
,
0x13
,
// 0xb1, 0xea, 0x66, 0x6a, 0xbc, 0x62, 0x2d, 0x7b, 0x7d, 0x85, 0xea, 0x95, 0x2f, 0xc0, 0xe8,
0x6f
,
0xd8
,
0xa9
,
0x77
,
0xc3
,
0x6c
,
0xcb
,
0xf1
,
0x29
,
0x5a
,
0xcc
,
0xda
,
0x35
,
0xbd
,
0x52
,
// 0x6f, 0x35, 0xa0, 0x3a, 0x02, 0x25, 0xbc, 0xb2, 0x5f, 0x5c, 0x43, 0x96, 0xcc, 0x26, 0xd2,
0x23
,
0xbe
,
0x59
,
0xeb
,
0x12
,
0x6d
,
0xb7
,
0x53
,
0xee
,
0xfc
,
0xb4
,
0x1b
,
0x13
,
0x5e
,
0xba
,
// 0x16, 0xb4, 0x96, 0x73, 0xd7, 0x13, 0xc7, 0xae, 0x53, 0x15, 0x31, 0x89, 0x68, 0x66, 0x6d,
0x16
,
0x7c
,
0xc5
,
0xf3
,
0xe3
,
0x6d
,
0x07
,
0x78
,
0xf5
,
0x2b
,
0x21
,
0x05
,
0x88
,
0x4c
,
0xc0
,
// 0x2c, 0x92, 0x1f, 0xcc, 0x5b, 0xa7, 0x8f, 0x5d, 0xbb, 0xc9, 0xdb, 0xe8, 0x3b, 0x9d, 0x61,
0xa1
,
0xe3
,
0x36
,
0x10
,
0xf8
,
0x1b
,
0xd8
,
0x17
,
0xfb
,
0x6a
,
0x4e
,
0xd8
,
0xb3
,
0x47
,
0x2d
,
// 0x74, 0x8b, 0x05, 0xa1, 0x58, 0x52, 0x68, 0xee, 0x3d, 0x39, 0x79, 0xa0, 0x9b, 0xdd, 0xe1,
0x99
,
0xbd
,
0xbb
,
0x5d
,
0x37
,
0x7d
,
0xba
,
0xf1
,
0xe1
,
0x7c
,
0xc0
,
0xc5
,
0x54
,
0x62
,
0x7f
,
// 0x55, 0xc9, 0x60, 0xeb, 0xad, 0xb8, 0x5b, 0xc2, 0x5a, 0xb5, 0x2c, 0x18, 0x55, 0xa9, 0x50,
0xcf
,
0x5a
,
0x4a
,
0x93
,
0xcc
,
0xf1
,
0x1b
,
0x34
,
0xc8
,
0xa6
,
0x05
,
0x4c
,
0x55
,
0x8b
,
0x54
,
// 0xc3, 0xf6, 0x72, 0x5f, 0xcc, 0xe2, 0xf4, 0x55, 0xb5, 0xd6, 0xb5, 0x4a, 0x99, 0xa5, 0x28,
0x84
,
0xd5
,
0x77
,
0xeb
,
0xc0
,
0x6d
,
0x3a
,
0x29
,
0xbd
,
0x75
,
0x61
,
0x09
,
0x9a
,
0x2c
,
0xbb
,
// 0x74, 0x97, 0x18, 0xe8, 0xc0, 0x84, 0x89, 0x50, 0x03, 0x86, 0x4d, 0x1a, 0xb7, 0x09, 0x90,
0xf7
,
0x18
,
0x79
,
0x34
,
0x90
,
0x24
,
0xa5
,
0x81
,
0x70
,
0x87
,
0xc5
,
0x02
,
0x7c
,
0xba
,
0xd4
,
// 0xa2, 0x01, 0x04, 0xbb, 0x73, 0x62, 0xcb, 0x97, 0x22, 0x70, 0x5d, 0x52, 0x41, 0x8e, 0xd9,
0x5e
,
0x14
,
0x8e
,
0xe4
,
0xed
,
0xa2
,
0x61
,
0x6a
,
0xb9
,
0x6e
,
0xb5
,
0x4a
,
0xb9
,
0x01
,
0x46
,
// 0x90, 0x15, 0xaa, 0xab, 0x0a, 0x31, 0x65, 0xb4, 0xda, 0xd0, 0xee, 0x24, 0xc9, 0x41, 0x91,
0xf4
,
0xcf
,
0xbc
,
0x09
,
0x2f
,
0x27
,
0x4b
,
0xbd
,
0x86
,
0x7a
,
0x10
,
0xe1
,
0xd4
,
0xc8
,
0xd9
,
// 0x1e, 0xbc, 0x46, 0x70, 0x40, 0x9d, 0xda, 0x0e, 0x2a, 0xe4, 0xb2, 0x4c, 0x9f, 0xf2, 0xfc,
0x20
,
0x8d
,
0x8a
,
0x63
,
0x00
,
0x63
,
0x44
,
0xeb
,
0x54
,
0x0b
,
0x75
,
0x49
,
0x10
,
0xa2
,
0xa7
,
// 0xf3, 0x84, 0x17, 0x44, 0x1e, 0xd7, 0xca, 0x23, 0x1f, 0x3f, 0x5a, 0x22, 0x3d, 0xaf, 0x9b,
0xad
,
0xb9
,
0xd1
,
0x01
,
0x80
,
0x63
,
0x25
,
0xc8
,
0x12
,
0xa6
,
0xce
,
0x1e
,
0xbe
,
0xfe
,
0x7e
,
// 0x2d, 0xfc, 0x41, 0xad, 0x26, 0xb4, 0x45, 0x67, 0x0b, 0x80, 0x0e, 0xf9, 0x61, 0x37, 0xec,
0x5f
,
0x3c
,
0xdb
,
0x34
,
0xea
,
0x37
,
0xec
,
0x3b
,
0xd5
,
0x28
,
0xd2
,
0x07
,
0x8c
,
0x9a
,
0xb6
,
// 0x3b, 0xf4, 0x4b, 0x14, 0xdf, 0x5a, 0x0c, 0x3a, 0x50, 0x0b, 0x14, 0x0c, 0x72, 0xae, 0xc6,
0xee
,
0x5e
,
0x3e
,
0xdf
,
0x1d
,
0x99
,
0xb0
,
0xe2
,
0x46
,
0xef
,
0x5c
,
0x1b
,
0xb4
,
0xea
,
0x56
,
// 0xc5, 0xec, 0x35, 0x53, 0x2d, 0x59, 0xed, 0x91, 0x74, 0xe2, 0xc4, 0xc8, 0xf2, 0x25, 0x6b,
0x2e
,
0xde
,
0x1f
,
0x9d
,
0xb8
,
0xd3
,
0x24
,
0xab
,
0xd4
,
0x2a
,
0xd6
,
0x2e
,
0xde
,
0x1f
,
0x9d
,
// 0x97, 0x6f, 0xc9, 0x76, 0xce, 0xa9, 0xb1, 0x99, 0x8f, 0x5a, 0x92, 0x3b, 0xc4, 0x8d, 0x54,
0xb8
,
0xf2
,
0x66
,
0x2f
,
0xbd
,
0xf8
,
0x72
,
0x66
,
0x4e
,
0x1e
,
0x9f
,
0x9d
,
0xb8
,
0xf2
,
0x47
,
// 0x50, 0x40, 0x72, 0xd6, 0x90, 0x83, 0xfc, 0xe5, 0x49, 0x8b, 0x17, 0xf5, 0xfd, 0x6b, 0x8d,
0x0c
,
0x9a
,
0xb6
,
0xee
,
0x3f
,
0xfc
,
0x7a
,
0x57
,
0x0d
,
0x79
,
0x70
,
0x62
,
0x27
,
0xad
,
0xb9
,
// 0x32, 0x02, 0xe9, 0x0a, 0xfe, 0xbf, 0x00, 0x6b, 0xa3, 0xad, 0x5f, 0x09, 0x4b, 0x97, 0x2b,
0xd1
,
0x01
,
0x61
,
0x40
,
0x02
,
0x67
,
0x2d
,
0xd8
,
0x32
,
0xe6
,
0x2f
,
0xdc
,
0x3a
,
0xd7
,
0x2c
,
// 0x00, 0x58, 0x65, 0x2e, 0x07, 0x49, 0x0a, 0x3b, 0x6b, 0x2e, 0x50, 0x6c, 0x1d, 0xac, 0xb7,
0xbb
,
0xf4
,
0x4b
,
0xf5
,
0x49
,
0xf1
,
0x60
,
0x23
,
0xc4
,
0x0a
,
0x77
,
0x4d
,
0xf9
,
0x51
,
0x01
,
// 0x6a, 0x26, 0xd8, 0x13, 0xa4, 0xca, 0x16, 0xae, 0xab, 0x93, 0xb9, 0x1c, 0x1c, 0xb4, 0x47,
0x80
,
0x63
,
0x25
,
0xa9
,
0xb1
,
0xe0
,
0x42
,
0xe7
,
0x4c
,
0x1a
,
0x97
,
0xac
,
0xbb
,
0xf4
,
0x6a
,
// 0x6a, 0x38, 0x36, 0x17, 0x27, 0xc9, 0x7f, 0xc7, 0x64, 0xcb, 0x89, 0x58, 0xc5, 0x61, 0xc2,
0x37
,
0xcd
,
0x18
,
0xb2
,
0xe6
,
0x2f
,
0xdc
,
0x1b
,
0x95
,
0xa8
,
0xd2
,
0x07
,
0x6d
,
0x58
,
0x32
,
// 0xc6, 0xea, 0x15, 0x0b, 0x34, 0x0c, 0x5d, 0x61, 0x76, 0x6e, 0x2b, 0x62, 0x40, 0x92, 0xa3,
0xe6
,
0x4e
,
0x1e
,
0x9f
,
0xbc
,
0xfa
,
0x57
,
0x0d
,
0x79
,
0x51
,
0x20
,
0xc2
,
0x06
,
0x6f
,
0x5c
,
// 0x6c, 0xef, 0xf4, 0xe4, 0xc3, 0xa1, 0xa8, 0xf5, 0x94, 0x79, 0x0d, 0xd1, 0x3d, 0xcb, 0x3d,
0x1b
,
0x95
,
0xa8
,
0xb3
,
0xc5
,
0xe9
,
0x31
,
0xe0
,
0x23
,
0xc4
,
0x0a
,
0x77
,
0x4d
,
0x18
,
0x93
,
// 0x40, 0xb6, 0xd0, 0xf0, 0x10, 0x54, 0xd8, 0x47, 0x25, 0x51, 0xc5, 0x41, 0x79, 0x00, 0xe5,
0x85
,
0x69
,
0x31
,
0xc1
,
0xe1
,
0x21
,
0xc0
,
0xe3
,
0x44
,
0x0a
,
0x77
,
0x6c
,
0x5a
,
0x17
,
0x8d
,
// 0xa0, 0x72, 0xde, 0xbb, 0x3b, 0x62, 0x17, 0xf6, 0xbc, 0x5d, 0x00, 0x76, 0x2e, 0xa7, 0x3b,
0x98
,
0x93
,
0xa4
,
0xab
,
0xd4
,
0x2a
,
0xb7
,
0xec
,
0x5a
,
0x17
,
0xac
,
0xbb
,
0xf4
,
0x4b
,
0x14
,
// 0xb6, 0xf1, 0x98, 0x72, 0x59, 0x2a, 0x73, 0xb0, 0x21, 0xd6, 0x49, 0xe0, 0xc0, 0xd5, 0xeb,
0xaa
,
0xb7
,
0xec
,
0x3b
,
0xd5
,
0x28
,
0xb3
,
0xc5
,
0xe9
,
0x31
,
0xc1
,
0x00
,
0x82
,
0x67
,
0x4c
,
// 0x02, 0x7d, 0x4b, 0x41, 0x28, 0x70, 0x2d, 0xec, 0x2b, 0x71, 0x1f, 0x0b, 0xb9, 0x71, 0x63,
0xfb
,
0x55
,
0x28
,
0xd2
,
0x26
,
0xaf
,
0xbd
,
0xd9
,
0x11
,
0x81
,
0x61
,
0x21
,
0xa1
,
0xa1
,
0xc0
,
// 0x06, 0xe6, 0xbc, 0x60, 0xbb, 0xf4, 0x9a, 0x62, 0x43, 0x09, 0x18, 0x4e, 0x93, 0x06, 0x4d,
0x02
,
0x86
,
0x6f
,
0x5c
,
0x1b
,
0xb4
,
0xcb
,
0x14
,
0x8b
,
0x94
,
0xaa
,
0xd6
,
0x2e
,
0xbf
,
0xdd
,
// 0x76, 0xfa, 0x7f, 0xbd, 0x02, 0xe4, 0x50, 0x91, 0x12, 0xe5, 0x86, 0xff, 0x64, 0x1e, 0xaf,
0x19
,
0xb0
,
0xe2
,
0x46
,
0x0e
,
0x7f
,
0x7c
,
0x5b
,
0x15
,
0x89
,
0x90
,
0x83
,
0x84
,
0x6b
,
0x54
,
// 0x7e, 0xb3, 0xb2, 0xde, 0x89, 0xc1, 0xa2, 0x6f, 0x40, 0x7b, 0x41, 0x51, 0x63, 0xea, 0x25,
0x0b
,
0x75
,
0x68
,
0x52
,
0x07
,
0x6d
,
0x58
,
0x32
,
0xc7
,
0xed
,
0x58
,
0x32
,
0xc7
,
0xed
,
0x58
,
// 0xd1, 0x97, 0x57, 0x92, 0xa8, 0x45, 0xa1, 0xa5, 0x45, 0x21, 0x43, 0x7f, 0x83, 0x15, 0x29,
0x32
,
0xe6
,
0x4e
,
0xff
,
0x7c
,
0x7a
,
0x76
,
0x6e
,
0x3f
,
0xdd
,
0x38
,
0xd3
,
0x05
,
0x88
,
0x92
,
// 0xd0, 0x30, 0x53, 0x32, 0xb4, 0x5a, 0x17, 0x96, 0xbc, 0xc2, 0x68, 0xa9, 0xb7, 0xaf, 0xac,
0xa6
,
0xaf
,
0xdc
,
0x1b
,
0xb4
,
0xcb
,
0xf5
,
0x68
,
0x52
,
0x07
,
0x8c
,
0x7b
,
0x55
,
0x09
,
0x90
,
// 0xdf, 0xf1, 0xe3, 0x89, 0xba, 0x24, 0x79, 0x54, 0xc6, 0x14, 0x07, 0x1c, 0x1e, 0x0d, 0x3a,
0x83
,
0x84
,
0x6b
,
0x54
,
0x2a
,
0xb7
,
0xec
,
0x3b
,
0xd5
,
0x09
,
0x90
,
0xa2
,
0xc6
,
0x0e
,
0x7f
,
// 0x6b, 0xe5, 0x3d, 0x4e, 0x10, 0x60, 0x96, 0xec, 0x6c, 0xda, 0x47, 0xae, 0x03, 0x25, 0x39,
0x7c
,
0x7a
,
0x57
,
0x0d
,
0x98
,
0xb2
,
0xc7
,
0xed
,
0x58
,
0x32
,
0xc7
,
0x0c
,
0x7b
,
0x74
,
0x4b
,
// 0x1d, 0x74, 0xc8, 0xac, 0x6a, 0xf2, 0x6b, 0x05, 0x2a, 0x9a, 0xe7, 0xe8, 0x92, 0xd6, 0xc2,
0x14
,
0x8b
,
0x94
,
0xaa
,
0xb7
,
0xcd
,
0x18
,
0x93
,
0xa4
,
0xca
,
0x16
,
0xae
,
0xbf
,
0xdd
,
0x19
,
// 0x6d, 0xfa, 0xe8, 0xa7, 0x9d, 0x5f, 0x48, 0xc9, 0x75, 0xf1, 0x66, 0x6a, 0xdb, 0x5d, 0x9a,
0xb0
,
0xe2
,
0x46
,
0x0e
,
0x7f
,
0x5d
,
0x19
,
0x91
,
0x81
,
0x80
,
0x63
,
0x44
,
0xeb
,
0x35
,
0xc9
,
// 0xcd, 0x27, 0xdd, 0xb9, 0x24, 0x04, 0x9c, 0x18, 0xc2, 0x6d, 0x0c, 0x91, 0x34, 0x48, 0x42,
0x10
,
0x83
,
0x65
,
0x48
,
0x12
,
0xa6
,
0xce
,
0x1e
,
0x9f
,
0xbc
,
0xdb
,
0x15
,
0x89
,
0x71
,
0x60
,
// 0x6f, 0xe9, 0x59, 0x70, 0xc4, 0x7e, 0x81, 0x0e, 0x32, 0x0a, 0x93, 0x48, 0xb0, 0xc0, 0x15,
0x23
,
0xc4
,
0xeb
,
0x54
,
0x2a
,
0xb7
,
0xec
,
0x5a
,
0x36
,
0xcf
,
0x81
,
0x10
,
0xac
,
0x74
,
// 0x9e, 0x05, 0xac, 0x36, 0x16, 0xcb, 0x59, 0x65, 0xa0, 0x83, 0xdf, 0x3e, 0xda, 0xfb, 0x1d,
];
// 0x1a, 0xdb, 0x65, 0xec, 0x9a, 0xc6, 0xc3, 0x8e, 0x3c, 0x45, 0xfd, 0xc8, 0xf5, 0x1c, 0x6a,
}
// 0x67, 0x0d, 0x8f, 0x99, 0x7d, 0x30, 0x21, 0x8c, 0xea, 0x22, 0x87, 0x65, 0xc9, 0xb2, 0x4c,
// 0xe4, 0x1b, 0x46, 0xba, 0x54, 0xbd, 0x7c, 0xca, 0xd5, 0x8f, 0x5b, 0xa5, 0x01, 0x04, 0xd8,
// 0x0a, 0x16, 0xbf, 0xb9, 0x50, 0x2e, 0x37, 0x2f, 0x64, 0xf3, 0x70, 0x11, 0x02, 0x05, 0x31,
// 0x9b, 0xa0, 0xb2, 0x01, 0x5e, 0x4f, 0x19, 0xc9, 0xd4, 0xea, 0xa1, 0x79, 0x54, 0x53, 0xa7,
// 0xde, 0x2f, 0x49, 0xd3, 0xd1, 0x63, 0xb5, 0x03, 0x15, 0x4e, 0xbf, 0x04, 0xb3, 0x26, 0x8b,
// 0x20, 0xb2, 0x45, 0xcf, 0xcd, 0x5b, 0x82, 0x32, 0x88, 0x61, 0xa7, 0xa8, 0xb2, 0xa0, 0x72,
// 0x96, 0xc0, 0xdb, 0x2b, 0xe2, 0x5f, 0xba, 0xe3, 0xf5, 0x8a, 0xde, 0xf1, 0x18, 0x01, 0x16,
// 0x40, 0xd9, 0x86, 0x12, 0x09, 0x18, 0x1b, 0x05, 0x0c, 0xb1, 0xb5, 0x47, 0xe2, 0x43, 0xab,
// 0xfe, 0x92, 0x63, 0x7e, 0x95, 0x2b, 0xf0, 0xaf, 0xe1, 0xf1, 0xc3, 0x4a, 0xff, 0x2b, 0x09,
// 0xbb, 0x4a, 0x0e, 0x9a, 0xc4, 0xd8, 0x64, 0x7d, 0x83, 0xa0, 0x4f, 0x44, 0xdb, 0xc4, 0xa8,
// 0x58, 0xef, 0xfc, 0x9e, 0x77, 0xf9, 0xa6, 0x8f, 0x58, 0x8b, 0x12, 0xf4, 0xe9, 0x81, 0x12,
// 0x47, 0x51, 0x41, 0x83, 0xef, 0xf6, 0x73, 0xbc, 0x8e, 0x0f, 0x4c, 0x8f, 0x4e, 0x69, 0x90,
// 0x77, 0x29, 0x5d, 0x92, 0xb0, 0x6d, 0x06, 0x67, 0x29, 0x60, 0xbd, 0x4b, 0x17, 0xc8, 0x89,
// 0x69, 0x28, 0x29, 0xd6, 0x78, 0xcb, 0x11, 0x4c, 0xba, 0x8b, 0x68, 0xae, 0x7e, 0x9f, 0xef,
// 0x95, 0xda, 0xe2, 0x9e, 0x7f, 0xe9, 0x55, 0xe5, 0xe1, 0xe2, 0xb7, 0xe6, 0x5f, 0xbb, 0x2c,
// 0xa2, 0xe6, 0xee, 0xc7, 0x0a, 0x60, 0xa9, 0xd1, 0x80, 0xdf, 0x7f, 0xd6, 0x97, 0xab, 0x1d,
// 0x22, 0x25, 0xfc, 0x79, 0x23, 0xe0, 0xae, 0xc5, 0xef, 0x16, 0xa4, 0xa1, 0x0f, 0x92, 0xa9,
// 0xc7, 0xe3, 0x3a, 0x55, 0xdf, 0x62, 0x49, 0xd9, 0xf5, 0x84, 0x49, 0xc5, 0x90, 0x34, 0xd3,
// 0xe1, 0xac, 0x99, 0x21, 0xb1, 0x02, 0x76, 0x4a, 0xfa, 0xd4, 0xbb, 0xa4, 0x9c, 0xa2, 0xe2,
// 0xcb, 0x3d, 0x3b, 0x14, 0x75, 0x60, 0xd1, 0x02, 0xb4, 0xa3, 0xb4, 0x72, 0x06, 0xf9, 0x19,
// 0x9c, 0xe2, 0xe4, 0xa7, 0x0f, 0x25, 0x88, 0xc6, 0x86, 0xd6, 0x8c, 0x74, 0x4e, 0x6e, 0xfc,
// 0xa8, 0x48, 0x9e, 0xa7, 0x9d, 0x1a, 0x4b, 0x37, 0x09, 0xc8, 0xb0, 0x10, 0xbe, 0x6f, 0xfe,
// 0xa3, 0xc4, 0x7a, 0xb5, 0x3d, 0xe8, 0x30, 0xf1, 0x0d, 0xa0, 0xb2, 0x44, 0xfc, 0x9b, 0x8c,
// 0xf8, 0x61, 0xed, 0x81, 0xd1, 0x62, 0x11, 0xb4, 0xe1, 0xd5, 0x39, 0x52, 0x89, 0xd3, 0xa8,
// 0x49, 0x31, 0xdf, 0xb6, 0xf9, 0x91, 0xf4, 0x1c, 0x9d, 0x09, 0x95, 0x40, 0x56, 0xe7, 0xe3,
// 0xcd, 0x5c, 0x92, 0xc1, 0x1d, 0x6b, 0xe9, 0x78, 0x6f, 0x8e, 0x94, 0x42, 0x66, 0xa2, 0xaa,
// 0xd3, 0xc8, 0x2e, 0xe3, 0xf6, 0x07, 0x72, 0x0b, 0x6b, 0x1e, 0x7b, 0xb9, 0x7c, 0xe0, 0xa0,
// 0xbc, 0xd9, 0x25, 0xdf, 0x87, 0xa8, 0x5f, 0x9c, 0xcc, 0xf0, 0xdb, 0x42, 0x8e, 0x07, 0x31,
// 0x13, 0x01, 0x66, 0x32, 0xd1, 0xb8, 0xd6, 0xe3, 0x5e, 0x12, 0x76, 0x61, 0xd3, 0x38, 0x89,
// 0xe6, 0x17, 0x6f, 0xa5, 0xf2, 0x71, 0x0e, 0xa5, 0xe2, 0x88, 0x30, 0xbb, 0xbe, 0x8a, 0xea,
// 0xc7, 0x62, 0xc4, 0xcf, 0xb8, 0xcd, 0x33, 0x8d, 0x3d, 0x3e, 0xb5, 0x60, 0x3a, 0x03, 0x92,
// 0xe4, 0x6d, 0x1b, 0xe0, 0xb4, 0x84, 0x08, 0x55, 0x88, 0xa7, 0x3a, 0xb9, 0x3d, 0x43, 0xc3,
// 0xc0, 0xfa, 0x07, 0x6a, 0xca, 0x94, 0xad, 0x99, 0x55, 0xf1, 0xf1, 0xc0, 0x23, 0x87, 0x1d,
// 0x3d, 0x1c, 0xd1, 0x66, 0xa0, 0x57, 0x10, 0x52, 0xa2, 0x7f, 0xbe, 0xf9, 0x88, 0xb6, 0x02,
// 0xbf, 0x08, 0x23, 0xa9, 0x0c, 0x63, 0x17, 0x2a, 0xae, 0xf5, 0xf7, 0xb7, 0x21, 0x83, 0x92,
// 0x31, 0x23, 0x0d, 0x20, 0xc3, 0xc2, 0x05, 0x21, 0x62, 0x8e, 0x45, 0xe8, 0x14, 0xc1, 0xda,
// 0x75, 0xb8, 0xf8, 0x92, 0x01, 0xd0, 0x5d, 0x18, 0x9f, 0x99, 0x11, 0x19, 0xf5, 0x35, 0xe8,
// 0x7f, 0x20, 0x88, 0x8c, 0x05, 0x75, 0xf5, 0xd7, 0x40, 0x17, 0xbb, 0x1e, 0x36, 0x52, 0xd9,
// 0xa4, 0x9c, 0xc2, 0x9d, 0x42, 0x81, 0xd8, 0xc7, 0x8a, 0xe7, 0x4c, 0x81, 0xe0, 0xb7, 0x57,
// 0xed, 0x48, 0x8b, 0xf0, 0x97, 0x15, 0x61, 0xd9, 0x2c, 0x7c, 0x45, 0xaf, 0xc2, 0xcd, 0xfc,
// 0xaa, 0x13, 0xad, 0x59, 0xcc, 0xb2, 0xb2, 0x6e, 0xdd, 0x63, 0x9c, 0x32, 0x0f, 0xec, 0x83,
// 0xbe, 0x78, 0xac, 0x91, 0x44, 0x1a, 0x1f, 0xea, 0xfd, 0x5d, 0x8e, 0xb4, 0xc0, 0x84, 0xd4,
// 0xac, 0xb4, 0x87, 0x5f, 0xac, 0xef, 0xdf, 0xcd, 0x12, 0x56, 0xc8, 0xcd, 0xfe, 0xc5, 0xda,
// 0xd3, 0xc1, 0x69, 0xf3, 0x61, 0x05, 0xea, 0x25, 0xe2, 0x12, 0x05, 0x8f, 0x39, 0x08, 0x08,
// 0x7c, 0x37, 0xb6, 0x7e, 0x5b, 0xd8, 0xb1, 0x0e, 0xf2, 0xdb, 0x4b, 0xf1, 0xad, 0x90, 0x01,
// 0x57, 0xcd, 0xa0, 0xb4, 0x52, 0xe8, 0xf3, 0xd7, 0x8a, 0xbd, 0x4f, 0x9f, 0x21, 0x40, 0x72,
// 0xa4, 0xfc, 0x0b, 0x01, 0x2b, 0x2f, 0xb6, 0x4c, 0x95, 0x2d, 0x35, 0x33, 0x41, 0x6b, 0xa0,
// 0x93, 0xe7, 0x2c, 0xf2, 0xd3, 0x72, 0x8b, 0xf4, 0x4f, 0x15, 0x3c, 0xaf, 0xd6, 0x12, 0xde,
// 0x3f, 0x83, 0x3f, 0xff, 0xf8, 0x7f, 0xf6, 0xcc, 0xa6, 0x7f, 0xc9, 0x9a, 0x6e, 0x1f, 0xc1,
// 0x0c, 0xfb, 0xee, 0x9c, 0xe7, 0xaf, 0xc9, 0x26, 0x54, 0xef, 0xb0, 0x39, 0xef, 0xb2, 0xe9,
// 0x23, 0xc4, 0xef, 0xd1, 0xa1, 0xa4, 0x25, 0x24, 0x6f, 0x8d, 0x6a, 0xe5, 0x8a, 0x32, 0x3a,
// 0xaf, 0xfc, 0xda, 0xce, 0x18, 0x25, 0x42, 0x07, 0x4d, 0x45, 0x8b, 0xdf, 0x85, 0xcf, 0x55,
// 0xb2, 0x24, 0xfe, 0x9c, 0x69, 0x74, 0xa7, 0x6e, 0xa0, 0xce, 0xc0, 0x39, 0xf4, 0x86, 0xc6,
// 0x8d, 0xae, 0xb9, 0x48, 0x64, 0x13, 0x0b, 0x40, 0x81, 0xa2, 0xc9, 0xa8, 0x85, 0x51, 0xee,
// 0x9f, 0xcf, 0xa2, 0x8c, 0x19, 0x52, 0x48, 0xe2, 0xc1, 0xa8, 0x58, 0xb4, 0x10, 0x24, 0x06,
// 0x58, 0x51, 0xfc, 0xb9, 0x12, 0xec, 0xfd, 0x73, 0xb4, 0x6d, 0x84, 0xfa, 0x06, 0x8b, 0x05,
// 0x0b, 0x2d, 0xd6, 0xd6, 0x1f, 0x29, 0x82, 0x9f, 0x19, 0x12, 0x1e, 0xb2, 0x04, 0x8f, 0x7f,
// 0x4d, 0xbd, 0x30, 0x2e, 0xe3, 0xe0, 0x88, 0x29, 0xc5, 0x93, 0xd6, 0x6c, 0x1f, 0x29, 0x45,
// 0x91, 0xa7, 0x58, 0xcd, 0x05, 0x17, 0xd6, 0x6d, 0xb3, 0xca, 0x66, 0xcc, 0x3c, 0x4a, 0x74,
// 0xfd, 0x08, 0x10, 0xa6, 0x99, 0x92, 0x10, 0xd2, 0x85, 0xab, 0x6e, 0x1d, 0x0e, 0x8b, 0x26,
// 0x46, 0xd1, 0x6c, 0x84, 0xc0, 0x26, 0x43, 0x59, 0x68, 0xf0, 0x13, 0x1d, 0xfb, 0xe3, 0xd1,
// 0xd2, 0xb4, 0x71, 0x9e, 0xf2, 0x59, 0x6a, 0x33, 0x29, 0x79, 0xd2, 0xd7, 0x26, 0xf1, 0xae,
// 0x78, 0x9e, 0x1f, 0x0f, 0x3f, 0xe3, 0xe8, 0xd0, 0x27, 0x78, 0x77, 0xf6, 0xac, 0x9c, 0x56,
// 0x39, 0x73, 0x8a, 0x6b, 0x2f, 0x34, 0x78, 0xb1, 0x11, 0xdb, 0xa4, 0x5c, 0x80, 0x01, 0x71,
// 0x6a, 0xc2, 0xd1, 0x2e, 0x5e, 0x76, 0x28, 0x70, 0x93, 0xae, 0x3e, 0x78, 0xb0, 0x1f, 0x0f,
// 0xda, 0xbf, 0xfb, 0x8a, 0x67, 0x65, 0x4f, 0x91, 0xed, 0x49, 0x75, 0x78, 0x62, 0xa2, 0x93,
// 0xb5, 0x70, 0x7f, 0x4d, 0x08, 0x4e, 0x79, 0x61, 0xa8, 0x5f, 0x7f, 0xb4, 0x65, 0x9f, 0x91,
// 0x54, 0x3a, 0xe8, 0x50, 0x33, 0xd3, 0xd5, 0x8a, 0x7c, 0xf3, 0x9e, 0x8b, 0x77, 0x7b, 0xc6,
// 0xc6, 0x0c, 0x45, 0x95, 0x1f, 0xb0, 0xd0, 0x0b, 0x27, 0x4a, 0xfd, 0xc7, 0xf7, 0x0d, 0x5a,
// 0x43, 0xc9, 0x7d, 0x35, 0xb0, 0x7d, 0xc4, 0x9c, 0x57, 0x1e, 0x76, 0x0d, 0xf1, 0x95, 0x30,
// 0x71, 0xcc, 0xb3, 0x66, 0x3b, 0x63, 0xa8, 0x6c, 0xa3, 0x43, 0xa0, 0x24, 0xcc, 0xb7, 0x53,
// 0xfe, 0xfe, 0xbc, 0x6e, 0x60, 0x89, 0xaf, 0x16, 0x21, 0xc8, 0x91, 0x6a, 0x89, 0xce, 0x80,
// 0x2c, 0xf1, 0x59, 0xce, 0xc3, 0x60, 0x61, 0x3b, 0x0b, 0x19, 0xfe, 0x99, 0xac, 0x65, 0x90,
// 0x15, 0x12, 0x05, 0xac, 0x7e, 0xff, 0x98, 0x7b, 0x66, 0x64, 0x0e, 0x4b, 0x5b, 0xaa, 0x8d,
// 0x3b, 0xd2, 0x56, 0xcf, 0x99, 0x39, 0xee, 0x22, 0x81, 0xd0, 0x60, 0x06, 0x66, 0x20, 0x81,
// 0x48, 0x3c, 0x6f, 0x3a, 0x77, 0xba, 0xcb, 0x52, 0xac, 0x79, 0x56, 0xaf, 0xe9, 0x16, 0x17,
// 0x0a, 0xa3, 0x82, 0x08, 0xd5, 0x3c, 0x97, 0xcb, 0x09, 0xff, 0x7f, 0xf9, 0x4f, 0x60, 0x05,
// 0xb9, 0x53, 0x26, 0xaa, 0xb8, 0x50, 0xaa, 0x19, 0x25, 0xae, 0x5f, 0xea, 0x8a, 0xd0, 0x89,
// 0x12, 0x80, 0x43, 0x50, 0x24, 0x12, 0x21, 0x14, 0xcd, 0x77, 0xeb, 0x21, 0xcc, 0x5c, 0x09,
// 0x64, 0xf3, 0xc7, 0xcb, 0xc5, 0x4b, 0xc3, 0xe7, 0xed, 0xe7, 0x86, 0x2c, 0x1d, 0x8e, 0x19,
// 0x52, 0x9b, 0x2a, 0x0c, 0x18, 0x72, 0x0b, 0x1e, 0x1b, 0xb0, 0x0f, 0x42, 0x99, 0x04, 0xae,
// 0xd5, 0xb7, 0x89, 0x1a, 0xb9, 0x4f, 0xd6, 0xaf, 0xf3, 0xc9, 0x93, 0x6f, 0xb0, 0x60, 0x83,
// 0x6e, 0x6b, 0xd1, 0x5f, 0x3f, 0x1a, 0x83, 0x1e, 0x24, 0x00, 0x87, 0xb5, 0x3e, 0xdb, 0xf9,
// 0x4d, 0xa7, 0x16, 0x2e, 0x19, 0x5b, 0x8f, 0x1b, 0x0d, 0x47, 0x72, 0x42, 0xe9, 0x0a, 0x11,
// 0x08, 0x2d, 0x88, 0x1c, 0xbc, 0xc7, 0xb4, 0xbe, 0x29, 0x4d, 0x03, 0x5e, 0xec, 0xdf, 0xf3,
// 0x3d, 0x2f, 0xe8, 0x1d, 0x9a, 0xd2, 0xd1, 0xab, 0x41, 0x3d, 0x87, 0x11, 0x45, 0xb0, 0x0d,
// 0x46, 0xf5, 0xe8, 0x95, 0x62, 0x1c, 0x68, 0xf7, 0xa6, 0x5b, 0x39, 0x4e, 0xbf, 0x47, 0xba,
// 0x5d, 0x7f, 0xb7, 0x6a, 0xf4, 0xba, 0x1d, 0x69, 0xf6, 0xa4, 0xe7, 0xe4, 0x6b, 0x3b, 0x0d,
// 0x23, 0x16, 0x4a, 0xb2, 0x68, 0xf0, 0xb2, 0x0d, 0x09, 0x17, 0x6a, 0x63, 0x8c, 0x83, 0xd3,
// 0xbd, 0x05, 0xc9, 0xf6, 0xf0, 0xa1, 0x31, 0x0b, 0x2c, 0xac, 0x83, 0xac, 0x80, 0x34, 0x32,
// 0xb4, 0xec, 0xd0, 0xbc, 0x54, 0x82, 0x9a, 0xc8, 0xf6, 0xa0, 0x7d, 0xc6, 0x79, 0x73, 0xf4,
// 0x20, 0x99, 0xf3, 0xb4, 0x01, 0xde, 0x91, 0x27, 0xf2, 0xc0, 0xdc, 0x81, 0x00, 0x4e, 0x7e,
// 0x07, 0x99, 0xc8, 0x3a, 0x51, 0xbc, 0x38, 0xd6, 0x8a, 0xa2, 0xde, 0x3b, 0x6a, 0x8c, 0x1a,
// 0x7c, 0x81, 0x0f, 0x3a, 0x1f, 0xe4, 0x05, 0x7b, 0x20, 0x35, 0x6b, 0xa5, 0x6a, 0xa7, 0xe7,
// 0xbc, 0x9c, 0x20, 0xec, 0x00, 0x15, 0xe2, 0x51, 0xaf, 0x77, 0xeb, 0x29, 0x3c, 0x7d, 0x2e,
// 0x00, 0x5c, 0x81, 0x21, 0xfa, 0x35, 0x6f, 0x40, 0xef, 0xfb, 0xd1, 0x3f, 0xcc, 0x9d, 0x55,
// 0x53, 0xfb, 0x5a, 0xa5, 0x56, 0x89, 0x0b, 0x52, 0xeb, 0x57, 0x73, 0x4f, 0x1b, 0x67, 0x24,
// 0xcb, 0xb8, 0x6a, 0x10, 0x69, 0xd6, 0xfb, 0x52, 0x40, 0xff, 0x20, 0xa5, 0xf3, 0x72, 0xe1,
// 0x3d, 0xa4, 0x8c, 0x81, 0x66, 0x16, 0x0d, 0x5d, 0xad, 0xa8, 0x50, 0x25, 0x78, 0x31, 0x77,
// 0x0c, 0x57, 0xe4, 0xe9, 0x15, 0x2d, 0xdb, 0x07, 0x87, 0xc8, 0xb0, 0x43, 0xde, 0xfc, 0xfe,
// 0xa9, 0xeb, 0xf5, 0xb0, 0xd3, 0x7b, 0xe9, 0x1f, 0x6e, 0xca, 0xe4, 0x03, 0x95, 0xc5, 0xd1,
// 0x59, 0x72, 0x63, 0xf0, 0x86, 0x54, 0xe8, 0x16, 0x62, 0x0b, 0x35, 0x29, 0xc2, 0x68, 0xd0,
// 0xd6, 0x3e, 0x90, 0x60, 0x57, 0x1d, 0xc9, 0xed, 0x3f, 0xed, 0xb0, 0x2f, 0x7e, 0x97, 0x02,
// 0x51, 0xec, 0xee, 0x6f, 0x82, 0x74, 0x76, 0x7f, 0xfb, 0xd6, 0xc4, 0xc3, 0xdd, 0xe8, 0xb1,
// 0x60, 0xfc, 0xc6, 0xb9, 0x0d, 0x6a, 0x33, 0x78, 0xc6, 0xc1, 0xbf, 0x86, 0x2c, 0x50, 0xcc,
// 0x9a, 0x70, 0x8e, 0x7b, 0xec, 0xab, 0x95, 0xac, 0x53, 0xa0, 0x4b, 0x07, 0x88, 0xaf, 0x42,
// 0xed, 0x19, 0x8d, 0xf6, 0x32, 0x17, 0x48, 0x47, 0x1d, 0x41, 0x6f, 0xfe, 0x2e, 0xa7, 0x8f,
// 0x4b, 0xa0, 0x51, 0xf3, 0xbf, 0x02, 0x0a, 0x48, 0x58, 0xf7, 0xa1, 0x6d, 0xea, 0xa5, 0x13,
// 0x5a, 0x5b, 0xea, 0x0c, 0x9e, 0x52, 0x4f, 0x9e, 0xb9, 0x71, 0x7f, 0x23, 0x83, 0xda, 0x1b,
// 0x86, 0x9a, 0x41, 0x29, 0xda, 0x70, 0xe7, 0x64, 0xa1, 0x7b, 0xd5, 0x0a, 0x22, 0x0d, 0x5c,
// 0x40, 0xc4, 0x81, 0x07, 0x25, 0x35, 0x4a, 0x1c, 0x10, 0xdb, 0x45, 0x0a, 0xff, 0x36, 0xd4,
// 0xe0, 0xeb, 0x5f, 0x68, 0xd6, 0x67, 0xc6, 0xd0, 0x8b, 0x76, 0x1a, 0x7d, 0x59, 0x42, 0xa1,
// 0xcb, 0x96, 0x4d, 0x84, 0x09, 0x9a, 0x3d, 0xe0, 0x52, 0x85, 0x6e, 0x48, 0x90, 0x85, 0x2a,
// 0x63, 0xb2, 0x69, 0xd2, 0x00, 0x43, 0x31, 0x37, 0xb3, 0x52, 0xaf, 0x62, 0xfa, 0xc1, 0xe0,
// 0x03, 0xfb, 0x62, 0xaa, 0x88, 0xc9, 0xb2, 0x2c, 0xd5, 0xa8, 0xf5, 0xa5, 0x4c, 0x12, 0x59,
// 0x4e, 0x06, 0x5e, 0x9b, 0x15, 0x66, 0x11, 0xb2, 0x27, 0x92, 0xdc, 0x98, 0x59, 0xde, 0xdf,
// 0xfa, 0x9a, 0x32, 0x2e, 0xc0, 0x5d, 0x3c, 0x33, 0x41, 0x6d, 0xaf, 0xb2, 0x25, 0x23, 0x14,
// 0xa5, 0x7b, 0xc7, 0x9b, 0x68, 0xf3, 0xda, 0xeb, 0xe3, 0xa9, 0xe2, 0x6f, 0x0e, 0x1d, 0x1c,
// 0xba, 0x55, 0xb6, 0x34, 0x6a, 0x93, 0x1f, 0x1f, 0xb8, 0x34, 0xc8, 0x84, 0x08, 0xb1, 0x6b,
// 0x6a, 0x28, 0x74, 0x74, 0xe5, 0xeb, 0x75, 0xe9, 0x7c, 0xd8, 0xba, 0xd8, 0x42, 0xa5, 0xee,
// 0x1f, 0x80, 0xd9, 0x96, 0xb2, 0x2e, 0xe7, 0xbf, 0xba, 0xeb, 0xd1, 0x69, 0xbb, 0x8f, 0xfd,
// 0x5a, 0x63, 0x8f, 0x39, 0x7f, 0xdf, 0x1d, 0x37, 0xd2, 0x18, 0x35, 0x9d, 0xb6, 0xcc, 0xe4,
// 0x27, 0x81, 0x89, 0x38, 0x38, 0x68, 0x33, 0xe7, 0x78, 0xd8, 0x76, 0xf5, 0xee, 0xd0, 0x4a,
// 0x07, 0x69, 0x19, 0x7a, 0xad, 0x18, 0xb1, 0x94, 0x61, 0x45, 0x53, 0xa2, 0x48, 0xda, 0x96,
// 0x4a, 0xf9, 0xee, 0x94, 0x2a, 0x1f, 0x6e, 0x18, 0x3c, 0x92, 0x46, 0xd1, 0x1a, 0x28, 0x18,
// 0x32, 0x1f, 0x3a, 0x45, 0xbe, 0x04, 0x35, 0x92, 0xe5, 0xa3, 0xcb, 0xb5, 0x2e, 0x32, 0x43,
// 0xac, 0x65, 0x17, 0x89, 0x99, 0x15, 0x03, 0x9e, 0xb1, 0x23, 0x2f, 0xed, 0x76, 0x4d, 0xd8,
// 0xac, 0x21, 0x40, 0xc4, 0x99, 0x4e, 0x65, 0x71, 0x2c, 0xb3, 0x45, 0xab, 0xfb, 0xe7, 0x72,
// 0x39, 0x56, 0x30, 0x6d, 0xfb, 0x74, 0xeb, 0x99, 0xf3, 0xcd, 0x57, 0x5c, 0x78, 0x75, 0xe9,
// 0x8d, 0xc3, 0xa2, 0xfb, 0x5d, 0xe0, 0x90, 0xc5, 0x55, 0xad, 0x91, 0x53, 0x4e, 0x9e, 0xbd,
// 0x8c, 0x49, 0xa4, 0xa4, 0x69, 0x10, 0x0c, 0xc5, 0x76, 0xe9, 0x25, 0x86, 0x8d, 0x66, 0x23,
// 0xa8, 0xdb, 0x5c, 0xe8, 0xd9, 0x30, 0xe1, 0x15, 0x7b, 0xc0, 0x99, 0x0f, 0x03, 0xec, 0xaa,
// 0x12, 0xef, 0xce, 0xd4, 0xea, 0x55, 0x5c, 0x08, 0x86, 0xf4, 0xf4, 0xb0, 0x83, 0x42, 0x95,
// 0x37, 0xb6, 0x38, 0xe0, 0x2b, 0x54, 0x89, 0xbd, 0x4e, 0x20, 0x9d, 0x3f, 0xc3, 0x4b, 0xb7,
// 0xec, 0xfa, 0x5a, 0x14, 0x03, 0xcb, 0x64, 0xc8, 0x34, 0x4a, 0x4b, 0x6e, 0xf8, 0x6e, 0x56,
// 0xf6, 0xdd, 0x5f, 0xa1, 0x24, 0xe2, 0xd4, 0xd0, 0x82, 0x64, 0x1f, 0x8e, 0x9b, 0xfa, 0xb4,
// 0xcb, 0xdb, 0x0a, 0xe8, 0x15, 0xfc, 0x15, 0xab, 0x4b, 0x18, 0xbf, 0xd4, 0x42, 0x14, 0x48,
// 0x82, 0x85, 0xdd, 0xeb, 0x49, 0x1b, 0x0b, 0x0b, 0x05, 0xe9, 0xb4, 0xa1, 0x33, 0x0a, 0x5d,
// 0x0e, 0x6c, 0x4b, 0xc0, 0xd6, 0x6c, 0x7c, 0xfb, 0x69, 0x0b, 0x53, 0x19, 0xe4, 0xf3, 0x35,
// 0xfc, 0xbe, 0xa1, 0x34, 0x02, 0x09, 0x4f, 0x74, 0x86, 0x92, 0xcd, 0x5d, 0x1a, 0xc1, 0x27,
// 0x0c, 0xf2, 0xc5, 0xcf, 0xdd, 0x23, 0x93, 0x02, 0xbd, 0x41, 0x5e, 0x42, 0xf0, 0xa0, 0x9d,
// 0x0c, 0x72, 0xc8, 0xec, 0x32, 0x0a, 0x8a, 0xfd, 0x3d, 0x5a, 0x41, 0x27, 0x0c, 0x88, 0x59,
// 0xad, 0x94, 0x2e, 0xef, 0x5d, 0x8f, 0xc7, 0xdf, 0x66, 0xe4, 0xdd, 0x56, 0x6c, 0x7b, 0xca,
// 0x55, 0x81, 0xae, 0xae, 0x5c, 0x1b, 0x1a, 0xab, 0xae, 0x99, 0x8d, 0xcc, 0x42, 0x97, 0x59,
// 0xf4, 0x14, 0x3f, 0x75, 0xc6, 0xd1, 0x88, 0xba, 0xaa, 0x84, 0x4a, 0xd0, 0x34, 0x08, 0x3b,
// 0x7d, 0xdb, 0x15, 0x06, 0xb0, 0x5c, 0xbd, 0x40, 0xf5, 0xa8, 0xec, 0xae, 0x36, 0x40, 0xdd,
// 0x90, 0x1c, 0x3e, 0x0d, 0x7e, 0x73, 0xc7, 0xc2, 0xc5, 0x6a, 0xff, 0x52, 0x05, 0x7f, 0xbe,
// 0xd0, 0x92, 0xfd, 0xb3, 0x6f, 0xff, 0x5d, 0xb7, 0x97, 0x64, 0x73, 0x7b, 0xca, 0xd1, 0x98,
// 0x24, 0x6b, 0x0b, 0x01, 0x68, 0xdd, 0x27, 0x85, 0x85, 0xb5, 0x83, 0xc1, 0xe0, 0x50, 0x64,
// 0xc7, 0xaf, 0xf1, 0xc6, 0x4d, 0xb1, 0xef, 0xc9, 0xb4, 0x0a, 0x6d, 0x65, 0xf3, 0x47, 0xcc,
// 0xa3, 0x02, 0x21, 0x0c, 0xbe, 0x22, 0x29, 0x05, 0xcf, 0x5f, 0xe8, 0x94, 0x6c, 0xe5, 0xdc,
// 0xc4, 0xdf, 0xbe, 0x3e, 0xa8, 0xb4, 0x18, 0xb0, 0x99, 0xb8, 0x6f, 0xff, 0x5d, 0xb9, 0xfd,
// 0x3b, 0x5d, 0x16, 0xbf, 0x3e, 0xd8, 0xb3, 0xd8, 0x08, 0x34, 0xf6, 0x47, 0x35, 0x5b, 0x72,
// 0x1a, 0x33, 0xad, 0x52, 0x5d, 0xb8, 0xd0, 0x77, 0xc6, 0xab, 0xba, 0x55, 0x09, 0x5f, 0x02,
// 0xf8, 0xd4, 0x5f, 0x53, 0x06, 0x91, 0xcd, 0x74, 0x42, 0xae, 0x54, 0x91, 0x81, 0x62, 0x13,
// 0x6f, 0xd8, 0xa9, 0x77, 0xc3, 0x6c, 0xcb, 0xf1, 0x29, 0x5a, 0xcc, 0xda, 0x35, 0xbd, 0x52,
// 0x23, 0xbe, 0x59, 0xeb, 0x12, 0x6d, 0xb7, 0x53, 0xee, 0xfc, 0xb4, 0x1b, 0x13, 0x5e, 0xba,
// 0x16, 0x7c, 0xc5, 0xf3, 0xe3, 0x6d, 0x07, 0x78, 0xf5, 0x2b, 0x21, 0x05, 0x88, 0x4c, 0xc0,
// 0xa1, 0xe3, 0x36, 0x10, 0xf8, 0x1b, 0xd8, 0x17, 0xfb, 0x6a, 0x4e, 0xd8, 0xb3, 0x47, 0x2d,
// 0x99, 0xbd, 0xbb, 0x5d, 0x37, 0x7d, 0xba, 0xf1, 0xe1, 0x7c, 0xc0, 0xc5, 0x54, 0x62, 0x7f,
// 0xcf, 0x5a, 0x4a, 0x93, 0xcc, 0xf1, 0x1b, 0x34, 0xc8, 0xa6, 0x05, 0x4c, 0x55, 0x8b, 0x54,
// 0x84, 0xd5, 0x77, 0xeb, 0xc0, 0x6d, 0x3a, 0x29, 0xbd, 0x75, 0x61, 0x09, 0x9a, 0x2c, 0xbb,
// 0xf7, 0x18, 0x79, 0x34, 0x90, 0x24, 0xa5, 0x81, 0x70, 0x87, 0xc5, 0x02, 0x7c, 0xba, 0xd4,
// 0x5e, 0x14, 0x8e, 0xe4, 0xed, 0xa2, 0x61, 0x6a, 0xb9, 0x6e, 0xb5, 0x4a, 0xb9, 0x01, 0x46,
// 0xf4, 0xcf, 0xbc, 0x09, 0x2f, 0x27, 0x4b, 0xbd, 0x86, 0x7a, 0x10, 0xe1, 0xd4, 0xc8, 0xd9,
// 0x20, 0x8d, 0x8a, 0x63, 0x00, 0x63, 0x44, 0xeb, 0x54, 0x0b, 0x75, 0x49, 0x10, 0xa2, 0xa7,
// 0xad, 0xb9, 0xd1, 0x01, 0x80, 0x63, 0x25, 0xc8, 0x12, 0xa6, 0xce, 0x1e, 0xbe, 0xfe, 0x7e,
// 0x5f, 0x3c, 0xdb, 0x34, 0xea, 0x37, 0xec, 0x3b, 0xd5, 0x28, 0xd2, 0x07, 0x8c, 0x9a, 0xb6,
// 0xee, 0x5e, 0x3e, 0xdf, 0x1d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x5c, 0x1b, 0xb4, 0xea, 0x56,
// 0x2e, 0xde, 0x1f, 0x9d, 0xb8, 0xd3, 0x24, 0xab, 0xd4, 0x2a, 0xd6, 0x2e, 0xde, 0x1f, 0x9d,
// 0xb8, 0xf2, 0x66, 0x2f, 0xbd, 0xf8, 0x72, 0x66, 0x4e, 0x1e, 0x9f, 0x9d, 0xb8, 0xf2, 0x47,
// 0x0c, 0x9a, 0xb6, 0xee, 0x3f, 0xfc, 0x7a, 0x57, 0x0d, 0x79, 0x70, 0x62, 0x27, 0xad, 0xb9,
// 0xd1, 0x01, 0x61, 0x40, 0x02, 0x67, 0x2d, 0xd8, 0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xd7, 0x2c,
// 0xbb, 0xf4, 0x4b, 0xf5, 0x49, 0xf1, 0x60, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0xf9, 0x51, 0x01,
// 0x80, 0x63, 0x25, 0xa9, 0xb1, 0xe0, 0x42, 0xe7, 0x4c, 0x1a, 0x97, 0xac, 0xbb, 0xf4, 0x6a,
// 0x37, 0xcd, 0x18, 0xb2, 0xe6, 0x2f, 0xdc, 0x1b, 0x95, 0xa8, 0xd2, 0x07, 0x6d, 0x58, 0x32,
// 0xe6, 0x4e, 0x1e, 0x9f, 0xbc, 0xfa, 0x57, 0x0d, 0x79, 0x51, 0x20, 0xc2, 0x06, 0x6f, 0x5c,
// 0x1b, 0x95, 0xa8, 0xb3, 0xc5, 0xe9, 0x31, 0xe0, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0x18, 0x93,
// 0x85, 0x69, 0x31, 0xc1, 0xe1, 0x21, 0xc0, 0xe3, 0x44, 0x0a, 0x77, 0x6c, 0x5a, 0x17, 0x8d,
// 0x98, 0x93, 0xa4, 0xab, 0xd4, 0x2a, 0xb7, 0xec, 0x5a, 0x17, 0xac, 0xbb, 0xf4, 0x4b, 0x14,
// 0xaa, 0xb7, 0xec, 0x3b, 0xd5, 0x28, 0xb3, 0xc5, 0xe9, 0x31, 0xc1, 0x00, 0x82, 0x67, 0x4c,
// 0xfb, 0x55, 0x28, 0xd2, 0x26, 0xaf, 0xbd, 0xd9, 0x11, 0x81, 0x61, 0x21, 0xa1, 0xa1, 0xc0,
// 0x02, 0x86, 0x6f, 0x5c, 0x1b, 0xb4, 0xcb, 0x14, 0x8b, 0x94, 0xaa, 0xd6, 0x2e, 0xbf, 0xdd,
// 0x19, 0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x7c, 0x5b, 0x15, 0x89, 0x90, 0x83, 0x84, 0x6b, 0x54,
// 0x0b, 0x75, 0x68, 0x52, 0x07, 0x6d, 0x58, 0x32, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0xed, 0x58,
// 0x32, 0xe6, 0x4e, 0xff, 0x7c, 0x7a, 0x76, 0x6e, 0x3f, 0xdd, 0x38, 0xd3, 0x05, 0x88, 0x92,
// 0xa6, 0xaf, 0xdc, 0x1b, 0xb4, 0xcb, 0xf5, 0x68, 0x52, 0x07, 0x8c, 0x7b, 0x55, 0x09, 0x90,
// 0x83, 0x84, 0x6b, 0x54, 0x2a, 0xb7, 0xec, 0x3b, 0xd5, 0x09, 0x90, 0xa2, 0xc6, 0x0e, 0x7f,
// 0x7c, 0x7a, 0x57, 0x0d, 0x98, 0xb2, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0x0c, 0x7b, 0x74, 0x4b,
// 0x14, 0x8b, 0x94, 0xaa, 0xb7, 0xcd, 0x18, 0x93, 0xa4, 0xca, 0x16, 0xae, 0xbf, 0xdd, 0x19,
// 0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x5d, 0x19, 0x91, 0x81, 0x80, 0x63, 0x44, 0xeb, 0x35, 0xc9,
// 0x10, 0x83, 0x65, 0x48, 0x12, 0xa6, 0xce, 0x1e, 0x9f, 0xbc, 0xdb, 0x15, 0x89, 0x71, 0x60,
// 0x23, 0xc4, 0xeb, 0x54, 0x2a, 0xb7, 0xec, 0x5a, 0x36, 0xcf, 0x81, 0x10, 0xac, 0x74,
// ];
// }
This diff is collapsed.
Click to expand it.
src/lib.rs
0 → 100644
+
37
−
0
View file @
1a5afe5e
#![no_std]
pub
mod
pmw3389
;
use
stm32f4xx_hal
::{
prelude
::
*
,
rcc
::
Clocks
,
stm32
};
pub
struct
DwtDelay
{
clocks
:
Clocks
,
}
impl
DwtDelay
{
pub
fn
new
(
dwt
:
&
mut
stm32
::
DWT
,
clocks
:
Clocks
)
->
DwtDelay
{
// required on Cortex-M7 devices that software lock the DWT (e.g. STM32F7)
stm32
::
DWT
::
unlock
();
dwt
.enable_cycle_counter
();
Self
{
clocks
}
}
}
impl
_embedded_hal_blocking_delay_DelayUs
<
u32
>
for
DwtDelay
{
fn
delay_us
(
&
mut
self
,
us
:
u32
)
{
let
freq_m_hertz
=
self
.clocks
.hclk
()
.0
/
1_000_000
;
let
start
=
stm32
::
DWT
::
get_cycle_count
()
as
i32
;
let
end
=
start
.wrapping_add
((
us
*
freq_m_hertz
)
as
i32
);
while
(
stm32
::
DWT
::
get_cycle_count
()
as
i32
)
.wrapping_sub
(
end
)
<
0
{
// this nop should be ok as the `DWT::get_cycle_count() provides side effects
}
}
}
impl
_embedded_hal_blocking_delay_DelayMs
<
u32
>
for
DwtDelay
{
fn
delay_ms
(
&
mut
self
,
ms
:
u32
)
{
self
.delay_us
(
ms
*
1000
)
}
}
This diff is collapsed.
Click to expand it.
src/pmw3389.rs
0 → 100644
+
692
−
0
View file @
1a5afe5e
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment