Skip to content

Instantly share code, notes, and snippets.

@Ced2911
Created December 21, 2015 16:46
Show Gist options
  • Save Ced2911/d50b1ca465fe1e7c9853 to your computer and use it in GitHub Desktop.
Save Ced2911/d50b1ca465fe1e7c9853 to your computer and use it in GitHub Desktop.
#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