libyggdrasil  v1.0.0
can.hpp
Go to the documentation of this file.
1  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  * _____.___. .___ .__.__ *
3  * \__ | | ____ ____ __| _/___________ _____|__| | *
4  * / | |/ ___\ / ___\ / __ |\_ __ \__ \ / ___/ | | *
5  * \____ / /_/ > /_/ > /_/ | | | \// __ \_\___ \| | |__ *
6  * / ______\___ /\___ /\____ | |__| (____ /____ >__|____/ *
7  * \/ /_____//_____/ \/ \/ \/ *
8  * - Common - *
9  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
10  * This software can be used by students and other personal of the *
11  * Bern University of Applied Sciences under the terms of the MIT *
12  * license. *
13  * For other persons this software is under the terms of the GNU *
14  * General Public License version 2. *
15  * *
16  * Copyright © 2021, Bern University of Applied Sciences. *
17  * All rights reserved. *
18  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
26 #pragma once
27 
28 #include <cpp/common/registers.hpp>
30 #include <cpp/common/utils.hpp>
31 
32 #include <array>
33 #include <tuple>
34 
35 namespace bsp::drv {
36 
37  template<typename T>
38  struct CANPacket {
40  union {
42  };
43  T data;
44  };
45 
52  template<auto Context, template<auto> typename CanImpl>
53  struct CAN {
54  CAN() = delete;
55 
56  using Impl = CanImpl<Context>;
57 
64  static auto init(auto ... args) {
65  return Impl::init(args...);
66  }
67 
72  static auto deinit(auto ... args) {
73  return Impl::deinit(args...);
74  }
75 
79  static bool enable() {
80  return Impl::enable();
81  }
82 
86  static bool disable() {
87  return Impl::disable();
88  }
89 
90 
97  template<typename T>
98  static CANPacket<T> read() {
99  static_assert(sizeof(T) <= 8, "CAN data can be 8 byte maximal");
100  CANPacket<T> rxPacket;
101  std::array<u8, 8> data;
102  Impl::read(rxPacket.id, rxPacket.extendedId, rxPacket.timestamp, data);
103 
104  rxPacket.data = bit_cast<T>(data);
105 
106  return rxPacket;
107  }
108 
115  template<typename T>
116  static u32 write(CANPacket<T> packet) {
117  static_assert(sizeof(T) <= 8, "CAN data can be 8 byte maximal");
118 
119  return Impl::write(packet);
120 
121  }
122 
130  template<typename T>
131  static u32 write(u32 id, const T &data) {
132  static_assert(sizeof(T) <= 8, "CAN data can be 8 byte maximal");
133  CANPacket<T> packet = {0};
134  if(id <= 0x7FF) packet.id = id;
135  else packet.extendedId = id;
136  packet.data = data;
137  return Impl::write(packet);
138 
139  }
140 
149  static bool setStdFilter(u8 bank, u16 id, u16 mask = 0x7FF) {
150  return Impl::setStdFilter(bank, id, mask);
151  }
152 
163  static bool setExtFilter(u8 bank, u32 id, u32 mask = 0x1FFF'FFFF) {
164  return Impl::setExtFilter(bank, id, mask);
165  }
166 
173  static bool disableFilter(u8 bank) {
174  return Impl::disableFilter(bank);
175  }
176  };
177 }
u16
uint16_t u16
Definition: types.h:37
utils.hpp
Commonly used helper functions.
u8
uint8_t u8
Unsigned integer definitions.
Definition: types.h:36
bsp::drv::CAN::write
static u32 write(u32 id, const T &data)
CAN write function.
Definition: can.hpp:131
bsp::drv::CAN::setExtFilter
static bool setExtFilter(u8 bank, u32 id, u32 mask=0x1FFF 'FFFF)
Extended ID filter configuration function.
Definition: can.hpp:163
bsp::drv::CAN::setStdFilter
static bool setStdFilter(u8 bank, u16 id, u16 mask=0x7FF)
Standard ID filter configuration function.
Definition: can.hpp:149
bsp::drv::CANPacket::id
u32 id
Definition: can.hpp:39
bsp::drv::CAN::write
static u32 write(CANPacket< T > packet)
CAN write function.
Definition: can.hpp:116
bsp::drv::CAN::deinit
static auto deinit(auto ... args)
Deinit function.
Definition: can.hpp:72
bsp::drv::CANPacket::extendedId
u32 extendedId
Definition: can.hpp:39
bsp::drv::CAN::init
static auto init(auto ... args)
Init function.
Definition: can.hpp:64
bsp::drv::CAN::Impl
CanImpl< Context > Impl
Definition: can.hpp:56
u32
uint32_t u32
Definition: types.h:38
bsp::drv::CAN::CAN
CAN()=delete
bsp::drv::CANPacket
Definition: can.hpp:38
bsp::drv::CANPacket::data
T data
Definition: can.hpp:43
bsp::drv::CANPacket::transmitGlobalTime
u32 transmitGlobalTime
Definition: can.hpp:41
bsp::drv::CAN
Base class for CAN abstraction.
Definition: can.hpp:53
registers.hpp
Zero-cost abstraction for accessing registers and bits/bitfields within them.
bsp::drv::CAN::enable
static bool enable()
Can enable.
Definition: can.hpp:79
bsp::drv::CAN::disable
static bool disable()
Can disable.
Definition: can.hpp:86
bsp::drv::CAN::read
static CANPacket< T > read()
CAN read function.
Definition: can.hpp:98
attributes.hpp
Commonly used C++ and GNU attributes.
bsp::drv
Definition: display.hpp:37
bsp::drv::CANPacket::timestamp
u32 timestamp
Definition: can.hpp:41