Created
December 21, 2015 16:46
-
-
Save Ced2911/d50b1ca465fe1e7c9853 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <vector> | |
#include <iostream> | |
#include <string.h> | |
#include <string> | |
#include <stdio.h> | |
#include <boost/asio.hpp> | |
#include <boost/thread.hpp> | |
#include <boost/program_options.hpp> | |
#define PORT_COM "COM4" | |
#define PORT_SPEED 115200 | |
using namespace std; | |
using namespace boost; | |
namespace po = boost::program_options; | |
void __log(const char * format, ...) | |
{ | |
char buffer[256]; | |
va_list args; | |
va_start(args, format); | |
vsnprintf(buffer, 256, format, args); | |
//perror(buffer); | |
fprintf(stderr, buffer); | |
fflush(stderr); | |
va_end(args); | |
} | |
class ArduinoSerial | |
{ | |
public: | |
ArduinoSerial(std::string port, unsigned int baud_rate) | |
: io(), serial(io,port) | |
{ | |
serial.set_option(boost::asio::serial_port_base::baud_rate(baud_rate)); | |
__log("connected\r\n"); | |
boost::this_thread::sleep(boost::posix_time::seconds(1)); | |
} | |
void writeString(std::string s) | |
{ | |
boost::asio::write(serial, boost::asio::buffer(s.c_str(),s.size())); | |
} | |
unsigned char readByte() { | |
char c; | |
asio::read(serial,asio::buffer(&c,1)); | |
return c; | |
} | |
unsigned short readWord() { | |
unsigned short c = 0; | |
asio::read(serial,asio::buffer(&c,2)); | |
// Byteswap it (tmp) | |
return (c & 0xFF) << 8 | (c & 0xFF00) >> 8; | |
} | |
private: | |
boost::asio::io_service io; | |
boost::asio::serial_port serial; | |
}; | |
static std::string filename; | |
static std::string com_port; | |
static unsigned int dump_size; | |
void dump_to_file(void * v, unsigned int len) { | |
FILE *fd = fopen(filename.c_str(), "wb"); | |
fwrite(v, len, 1, fd); | |
fclose(fd); | |
} | |
void dump_thread() { | |
ArduinoSerial serial(com_port.c_str(), PORT_SPEED); | |
unsigned short * buf = (unsigned short*)malloc(dump_size * sizeof(unsigned short)); | |
memset(buf, 0, sizeof(unsigned short) * dump_size); | |
// Start | |
serial.writeString("0"); | |
// Dump | |
for(int i=0; i < dump_size; i++) { | |
__log("\rs:%0d",(i * 100) / dump_size); | |
buf[i] = serial.readWord(); | |
} | |
// Write to file | |
dump_to_file(buf, dump_size * sizeof(unsigned short)); | |
// End | |
free(buf); | |
} | |
void parse_command_line(int argc, char *argv[]) { | |
po::options_description desc("Allowed options"); | |
desc.add_options() | |
("f", po::value<std::string>()->default_value("out.bin"), "output file name") | |
("com", po::value<std::string>()->default_value("COM3"), "com port") | |
("s", po::value<int>()->default_value(2048), "rom size * 1024") | |
; | |
po::variables_map vm; | |
po::store(po::command_line_parser(argc, argv).options(desc).run(), vm); | |
po::notify(vm); | |
filename = vm["f"].as<std::string>(); | |
com_port = vm["com"].as<std::string>(); | |
dump_size = (vm["s"].as<int>() * 1024) / sizeof(unsigned short); | |
__log("Dump %s [%08x] in %s\r\n", filename.c_str(), dump_size, com_port.c_str()); | |
} | |
int main(int argc, char *argv[]) { | |
__log("mddumper\r\n"); | |
parse_command_line(argc, argv); | |
boost::thread workerThread(dump_thread); | |
workerThread.join(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment