NXPCUP-libary
Library for car's control board on NXPCUP competition based on the Mbed framework.
Camera.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "mbed.h"
4 
5 #include "Image.h"
6 #include "util.h"
7 
8 namespace nxpcup {
9 
10 class Camera {
11 public:
12  static constexpr int ImageSize = 128;
13  using ImageType = uint16_t;
15 
16  struct Config {
17  PinName analogOut;
18  PinName clk;
19  PinName si;
20  uint32_t exposition_us;
22  static constexpr uint32_t EXPOSURE_TIME_MIN = 0;
23  static constexpr uint32_t EXPOSURE_TIME_MAX = 150000;
24  };
25 
31  Camera(const Config& config)
32  : m_analogOut(config.analogOut)
33  , m_clk(config.clk)
34  , m_si(config.si)
35  {
36  m_clk.write(false);
37  m_si.write(true);
39  }
40 
46  void setExpositionMs(uint32_t exposition_ms)
47  {
48  setExpositionUs(exposition_ms * 1000);
49  }
50 
57  {
58  exposition_us = nxpcup::clamp<uint32_t>(
61  }
62 
66  uint32_t expositionUs() const { return m_expositionUs; }
67 
74  ImageType pixel(int index) const
75  {
76  index = nxpcup::clamp<int>(index, 0, 127);
77  return m_image[index];
78  }
79 
83  CameraImage& image() { return m_image; }
84 
90  [[deprecated]] std::array<ImageType, CameraImage::size>& pixels() {
91  return m_image.data;
92  }
93 
101  void update()
102  {
103  m_si.write(true);
104  m_clk.write(true);
105  m_si.write(false);
106  // Skip one image due to the correct m_exposition_us
107  for (std::size_t i = 0; i < CameraImage::size; i++) {
108  m_clk.write(false);
109  m_clk.write(true);
110  }
111  m_clk.write(false);
112  wait_us(m_expositionUs);
113  updateImage();
114  }
115 
116 protected:
120  void updateImage()
121  {
122  m_si.write(true);
123  m_clk.write(true);
124  m_si.write(false);
125 
126  for (std::size_t j = 0; j < CameraImage::size; j++) {
127  m_image[j] = m_analogOut.read_u16();
128  m_clk.write(false);
129  m_clk.write(true);
130  }
131  m_clk.write(false);
132  }
133 
134  AnalogIn m_analogOut;
135  DigitalOut m_clk;
136  DigitalOut m_si;
137 
139  uint32_t m_expositionUs = 10000;
140 };
141 
142 } // namespace nxpcup
ImageType pixel(int index) const
Definition: Camera.h:74
static constexpr int ImageSize
Definition: Camera.h:12
void setExpositionMs(uint32_t exposition_ms)
Definition: Camera.h:46
PinName analogOut
Definition: Camera.h:17
CameraImage & image()
Definition: Camera.h:83
DigitalOut m_si
Definition: Camera.h:136
uint32_t expositionUs() const
Definition: Camera.h:66
PinName clk
Definition: Camera.h:18
Definition: BorderDetector.h:6
Definition: Camera.h:10
DigitalOut m_clk
Definition: Camera.h:135
CameraImage m_image
Definition: Camera.h:138
std::array< T, size > data
Definition: Image.h:16
static constexpr uint32_t EXPOSURE_TIME_MAX
Definition: Camera.h:23
uint32_t m_expositionUs
Definition: Camera.h:139
std::array< ImageType, CameraImage::size > & pixels()
Definition: Camera.h:90
PinName si
Definition: Camera.h:19
Camera(const Config &config)
Definition: Camera.h:31
void setExpositionUs(uint32_t exposition_us)
Definition: Camera.h:56
uint32_t exposition_us
Definition: Camera.h:20
static constexpr uint32_t EXPOSURE_TIME_MIN
Definition: Camera.h:22
void updateImage()
Definition: Camera.h:120
void update()
Definition: Camera.h:101
AnalogIn m_analogOut
Definition: Camera.h:134
static constexpr std::size_t size
Definition: Image.h:14
uint16_t ImageType
Definition: Camera.h:13
Definition: Camera.h:16