Added basic implementation of writing a macro program to the firmware

This commit was merged in pull request #6.
This commit is contained in:
2022-02-19 20:09:51 +01:00
parent 0e68a6f20f
commit 4d6c9655b7
7 changed files with 184 additions and 65 deletions
-10
View File
@@ -1,10 +0,0 @@
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <ctype.h>
#include "../include/change_key.h"
void set_key_value(char* firmware_buffer, int key, int value) {
memset(firmware_buffer + key, value, 1);
}
+37 -5
View File
@@ -1,15 +1,16 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/stat.h>
/* Just for debugging */
#include <ctype.h>
#include "../include/firmware_handling.h"
fbuffer_t* get_firmware_buffer(char* filename) {
f_bffrP get_firmware_buffer(char *filename) {
fbuffer_t buffer;
fbuffer_t* p_fb = &buffer;
f_bffrP p_fb = malloc(sizeof(*p_fb));
FILE *firmware = fopen(filename, "rb");
if(!firmware) {
@@ -23,6 +24,7 @@ fbuffer_t* get_firmware_buffer(char* filename) {
exit(EXIT_FAILURE);
}
/* set buffer size and read in firmware file into buffer*/
p_fb->size = sb.st_size;
p_fb->buffer = malloc(p_fb->size);
fread(p_fb->buffer, p_fb->size, 1, firmware);
@@ -35,7 +37,7 @@ fbuffer_t* get_firmware_buffer(char* filename) {
return p_fb;
}
void write_firmware_buffer(char* filename, fbuffer_t* p_fb) {
void write_firmware_buffer(char *filename, f_bffrP p_fb) {
FILE *firmware_file = fopen(filename, "wb+");
if(!firmware_file) {
@@ -47,3 +49,33 @@ void write_firmware_buffer(char* filename, fbuffer_t* p_fb) {
fclose(firmware_file);
}
void set_key_value(char *firmware_buffer, int key, int value) {
memset(firmware_buffer + key, value, 1);
}
void set_program(f_bffrP p_fb, key_progP kp) {
for(int i=0; i<MAX_ACTION; i++){
// Check if an action for that position exists
if(kp->prog_actions[i]){
/* calculate the offset for the action
* -> general prog_offset + current prog_action i times bytes per action
*/
int actionpointer = kp->prog_offset + (i * sizeof(*kp->prog_actions[0]));
/* set the modifiers */
memset(p_fb->buffer + actionpointer + 0, kp->prog_actions[i]->k_modifier, 1);
/* set timing delay */
memset(p_fb->buffer + actionpointer + 1, kp->prog_actions[i]->k_delay, 1);
/* set action 1-6 */
memset(p_fb->buffer + actionpointer + 2, kp->prog_actions[i]->k_action1, 1);
memset(p_fb->buffer + actionpointer + 3, kp->prog_actions[i]->k_action2, 1);
memset(p_fb->buffer + actionpointer + 4, kp->prog_actions[i]->k_action3, 1);
memset(p_fb->buffer + actionpointer + 5, kp->prog_actions[i]->k_action4, 1);
memset(p_fb->buffer + actionpointer + 6, kp->prog_actions[i]->k_action5, 1);
memset(p_fb->buffer + actionpointer + 7, kp->prog_actions[i]->k_action6, 1);
}
}
}
+66 -11
View File
@@ -1,28 +1,83 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "../include/change_key.h"
#include "../include/firmware_handling.h"
#include "../include/keycodes.h"
void testing (f_bffrP p_fb);
char *updated_file_name(char *orig);
int main (int argc, char *argv[])
{
fbuffer_t* p_fb = get_firmware_buffer(argv[1]);
/* Read in the firmware file into a f_bffr_t struct */
f_bffrP p_fb = get_firmware_buffer(argv[1]);
set_key_value(p_fb->buffer, F8_KEY8, KEY_a_A);
/* Call testing method */
testing(p_fb);
write_firmware_buffer(updated_file_name(argv[1]), p_fb);
free(p_fb->buffer);
free(p_fb);
return 0;
}
char *updated_file_name (char *orig){
char *ne = "_new.bin";
int len = strlen(orig);
char *new_name = malloc(len + 4);
strncpy(new_name, orig, len - 4);
strcat(new_name, ne);
printf("New File Name: %s", new_name);
return new_name;
}
void testing (f_bffrP p_fb) {
set_key_value(p_fb->buffer, F8_KEY1, KEY_9_LeftParenthesis);
set_key_value(p_fb->buffer, F8_KEY2, KEY_8_Asterisk);
set_key_value(p_fb->buffer, F8_KEY3, KEY_7_Ampersand);
set_key_value(p_fb->buffer, F8_KEY4, KEY_6_Caret);
set_key_value(p_fb->buffer, F8_KEY5, KEY_5_Percent);
set_key_value(p_fb->buffer, F8_KEY6, KEY_4_Dollar);
set_key_value(p_fb->buffer, F8_KEY7, KEY_3_Pound);
set_key_value(p_fb->buffer, F8_KEY8, KEY_2_At);
/* for debugging -> print content of buffer to terminal */
/*
for(int i = 0; i<fb->size; i++){
putc(isprint(fb->buffer[i]) ? fb->buffer[i] : '.', stdout);
for(int i = 0; i<p_fb->size; i++){
putc(isprint(p_fb->buffer[i]) ? p_fb->buffer[i] : '.', stdout);
}
*/
/* Temporary solution to renaming the input file */
char str[50];
sprintf(str, "new_%s", argv[1]);
write_firmware_buffer(str, p_fb);
return 0;
prog_actionP pa = calloc(1, sizeof(*pa));
pa->k_modifier = 0x00;
pa->k_delay = 0x00;
pa->k_action1 = 0x0B;
pa->k_action2 = 0x04;
pa->k_action3 = 0x0F;
pa->k_action4 = 0x0F;
pa->k_action5 = 0x12;
pa->k_action6 = 0x00;
key_progP kp = calloc(1, sizeof(*kp));
kp->prog_offset = PROG1_OFFSET;
kp->prog_actions[0] = pa;
kp->prog_actions[1] = pa;
kp->prog_actions[2] = pa;
kp->prog_actions[3] = pa;
kp->prog_actions[99] = pa;
//*/
set_program(p_fb, kp);
free(kp);
free(pa);
}