flash.cpp
Go to the documentation of this file.
1 #include <iostream>
2 #include <fstream>
3 #include <inttypes.h>
4 
5 #include <boost/program_options.hpp>
6 #include <crazyflie_cpp/Crazyflie.h>
7 
8 std::istream& operator>>(std::istream& in, Crazyflie::BootloaderTarget& target)
9 {
10  std::string token;
11  in >> token;
12  if (token == "stm32")
13  target = Crazyflie::TargetSTM32;
14  else if (token == "nrf51")
15  target = Crazyflie::TargetNRF51;
16  else throw boost::program_options::validation_error(boost::program_options::validation_error::invalid_option_value);
17  return in;
18 }
19 
20 enum Mode
21 {
25 };
26 
27 std::istream& operator>>(std::istream& in, Mode& mode)
28 {
29  std::string token;
30  in >> token;
31  if (token == "flashAndVerify")
32  mode = FlashAndVerify;
33  else if (token == "flashOnly")
34  mode = FlashOnly;
35  else if (token == "verifyOnly")
36  mode = VerifyOnly;
37  else throw boost::program_options::validation_error(boost::program_options::validation_error::invalid_option_value);
38  return in;
39 }
40 
41 class MyLogger : public Logger
42 {
43 public:
44  MyLogger(bool verbose)
45  : m_verbose(verbose)
46  {
47  }
48 
49  virtual void info(const std::string& msg)
50  {
51  if (m_verbose) {
52  std::cout << msg << std::endl;
53  }
54  }
55  // virtual void warning(const std::string& /*msg*/) {}
56  // virtual void error(const std::string& /*msg*/) {}
57 private:
58  bool m_verbose;
59 };
60 
61 int main(int argc, char **argv)
62 {
63 
64  std::string fileName;
65  std::string uri;
66  std::string defaultUri("radio://0/0/2M");
68  Mode mode = FlashAndVerify;
69  bool verbose = false;
70 
71  namespace po = boost::program_options;
72 
73  po::options_description desc("Allowed options");
74  desc.add_options()
75  ("help", "produce help message")
76  ("target", po::value<Crazyflie::BootloaderTarget>(&target)->required(), "target {stm32,nrf51}")
77  ("filename", po::value<std::string>(&fileName)->required(), "file to flash")
78  ("uri", po::value<std::string>(&uri)->default_value(defaultUri), "unique ressource identifier")
79  ("mode", po::value<Mode>(&mode)->default_value(mode), "mode {default=flashAndVerify, flashOnly, verifyOnly}")
80  ("verbose,v", "verbose output")
81  ;
82 
83  try
84  {
85  po::variables_map vm;
86  po::store(po::parse_command_line(argc, argv, desc), vm);
87  po::notify(vm);
88 
89  if (vm.count("help")) {
90  std::cout << desc << "\n";
91  return 0;
92  }
93  verbose = vm.count("verbose");
94  }
95  catch(po::error& e)
96  {
97  std::cerr << e.what() << std::endl << std::endl;
98  std::cerr << desc << std::endl;
99  return 1;
100  }
101 
102  try
103  {
104  MyLogger logger(verbose);
105 
106  bool success = true;
107  Crazyflie cf(uri, logger);
108  if (uri != defaultUri) {
109  logger.info("Reboot to Bootloader...");
110  uint64_t address = cf.rebootToBootloader();
111  logger.info("...Done");
112 
113  char addr[17];
114  std::sprintf(addr, "%" SCNx64, address);
115  defaultUri += "/" + std::string(addr);
116  }
117 
118  std::ifstream stream(fileName.c_str(), std::ios::binary);
119  if (!stream.good()) {
120  std::cerr << "Couldn't open " << fileName << "!" << std::endl;
121  return 1;
122  }
123  std::vector<uint8_t> targetData((
124  std::istreambuf_iterator<char>(stream)),
125  (std::istreambuf_iterator<char>()));
126 
127  // Crazyflie cf(defaultUri, logger);
128 
129  if (mode == FlashAndVerify || mode == FlashOnly) {
130  logger.info("Flashing...");
131  cf.writeFlash(target, targetData);
132  }
133  if (mode == FlashAndVerify || mode == VerifyOnly) {
134  logger.info("Reading...");
135  std::vector<uint8_t> currentData;
136  cf.readFlash(target, targetData.size(), currentData);
137  std::ofstream dbg("data.bin", std::ios::binary);
138  dbg.write((char*)currentData.data(), currentData.size());
139  if (memcmp(targetData.data(), currentData.data(), targetData.size()) == 0) {
140  logger.info("Verification successful!");
141  } else {
142  std::cerr << "Verification NOT successful!" << std::endl;
143  success = false;
144  }
145  }
146 
147  logger.info("Reboot to firmware");
149 
150  if (success) {
151  return 0;
152  }
153  return 1;
154  }
155  catch(std::exception& e)
156  {
157  std::cerr << e.what() << std::endl;
158  return 1;
159  }
160 }
int main(int argc, char **argv)
Definition: flash.cpp:61
uint8_t error
uint8_t target
void readFlash(BootloaderTarget target, size_t size, std::vector< uint8_t > &data)
Definition: Crazyflie.cpp:522
MyLogger(bool verbose)
Definition: flash.cpp:44
void writeFlash(BootloaderTarget target, const std::vector< uint8_t > &data)
Definition: Crazyflie.cpp:374
Mode
Definition: flash.cpp:20
uint16_t address
void rebootFromBootloader()
Definition: Crazyflie.cpp:329
std::istream & operator>>(std::istream &in, Crazyflie::BootloaderTarget &target)
Definition: flash.cpp:8
virtual void info(const std::string &msg)
Definition: flash.cpp:49
bool m_verbose
Definition: flash.cpp:58
uint64_t rebootToBootloader()
Definition: Crazyflie.cpp:298
uint8_t addr[6]
Definition: crtpNRF51.h:222


crazyflie_tools
Author(s): Wolfgang Hoenig
autogenerated on Mon Sep 28 2020 03:40:15