Aruna
FT_I2C.cpp
Go to the documentation of this file.
1 //
2 // Created by noeel on 19-04-21.
3 //
4 
5 #include <malloc.h>
6 #include <cstring>
8 
9 #ifdef _WIN32
10 #include <Windows.h>
11 #else
12 #include <unistd.h>
13 #endif
14 
15 using namespace aruna;
16 using namespace aruna::log;
17 using namespace aruna::driver;
18 const static size_t ACK_TIME = 0;
19 
20 log::channel_t FT_I2C::log("FT_I2C");
21 
22 err_t FT_I2C::_write(uint8_t address, uint8_t reg, uint8_t *data, size_t data_size) {
23  size_t write_size = 2 + data_size; // address + reg + datasize
25  char *writebuffer = (char *) malloc(write_size);
26  writebuffer[0] = ((address << 1) | 0b00000000);
27  writebuffer[1] = reg;
28  for (int i = 0; i < data_size; ++i) {
29  writebuffer[i + 2] = data[i];
30  }
31  if (Start(mpsse) == MPSSE_OK) {
32  if (Write(mpsse, writebuffer, write_size) == MPSSE_OK) {
33  if (GetAck(mpsse) == ACK)
34  ret = err_t::OK;
35  else
36  ret = err_t::NO_RESPONSE;
37  }
38  }
39  if (Stop(mpsse) != MPSSE_OK)
41  free(writebuffer);
42  return ret;
43 }
44 
45 err_t FT_I2C::_read(uint8_t address, uint8_t reg, uint8_t *buffer, size_t buffer_size) {
46 
48  const static size_t write_size = 2; // address + reg
49  char write_buffer[write_size];
50  uint8_t *read_buffer = (uint8_t *) malloc(buffer_size);
51  write_buffer[0] = ((address << 1) | 0b00000000); // write mode
52  write_buffer[1] = reg;
53  if (Start(mpsse) == MPSSE_OK) {
54  if (Write(mpsse, write_buffer, write_size) == MPSSE_OK) {
55  if (GetAck(mpsse) == ACK) {
56  if (Start(mpsse) == MPSSE_OK) {
57  char w = ((address << 1) | 0b00000001); // read mode
58  if (Write(mpsse, &w, 1) == MPSSE_OK) {
59  if (GetAck(mpsse) == ACK) {
60  read_buffer = (uint8_t *)Read(mpsse, buffer_size);
61  memcpy(buffer, read_buffer, buffer_size);
62  SendNacks(mpsse);
63  ret = err_t::OK;
64  } else {
65  ret = err_t::NO_RESPONSE;
66  }
67  }
68  }
69  } else {
70  ret = err_t::NO_RESPONSE;
71  }
72  }
73  }
74  if (Stop(mpsse) != MPSSE_OK)
76  free(read_buffer);
77  return ret;
78 }
79 
80 FT_I2C::FT_I2C(struct mpsse_context *mpsse) {
81  if (mpsse != NULL && !mpsse->open) {
82  log.error("Failed to initialize MPSSE: %s", ErrorString(mpsse));
83  startup_error = err_t::HARDWARE_FAILURE;
84  } else {
85  startup_error = err_t::OK;
86  }
87  this->mpsse = mpsse;
88 }
89 
90 FT_I2C::~FT_I2C() {
91  // TODO mpsse word niet in deze klasse gemaakt, dus hij mag hem ook niet afsluiten. Maar anders werken mijn unittests niet.
92  Close(mpsse);
93 }
Definition: comm.cpp:14
static const size_t ACK_TIME
Definition: FT_I2C.cpp:18
static log::channel_t * log
Definition: comm.cpp:23
int error(const char *format,...)
log error message
Definition: log.cpp:90