Use the builtin program execute function for some cases.
This commit is contained in:
parent
96d192091c
commit
72bf7f31d5
2 changed files with 70 additions and 7 deletions
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
|
@ -4,7 +4,7 @@
|
||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "tibridge",
|
"name": "tibridge",
|
||||||
"type": "cppdbg",
|
"type": "cppdbg",
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
"type": "cppdbg",
|
"type": "cppdbg",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "${workspaceFolder}/build/tikeys",
|
"program": "${workspaceFolder}/build/tikeys",
|
||||||
"args": ["-m", "83p", "-r", "-t", "${workspaceFolder}/build/program.8xp", "-k", "BLAH", "-s", "noshell", "-p", "CRACKERS", "--log-level=trace"],
|
"args": ["-s=noshell", "-p=CRACKERS", "--log-level=trace"],
|
||||||
"stopAtEntry": true,
|
"stopAtEntry": true,
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"environment": [],
|
"environment": [],
|
||||||
|
|
73
src/tikeys.c
73
src/tikeys.c
|
@ -93,7 +93,63 @@ static int get_program_index(GNode *tree, char* program) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int start_app(GNode *apps, char *app_name, int is_program) {
|
static VarEntry* get_program(GNode *tree, char* program) {
|
||||||
|
for (int i = 0; i < (int)g_node_n_children(tree); i++) {
|
||||||
|
GNode *parent = g_node_nth_child(tree, i);
|
||||||
|
VarEntry *ve = parent->data;
|
||||||
|
|
||||||
|
for (int j = 0; j < (int)g_node_n_children(parent); j++) {
|
||||||
|
GNode *child = g_node_nth_child(parent, j);
|
||||||
|
ve = child->data;
|
||||||
|
|
||||||
|
if(ve != NULL && strcmp(ve->name, program) == 0) {
|
||||||
|
return ve;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int start_app(GNode *apps, char *app_name, bool is_program) {
|
||||||
|
static const CalcModel allowed_models[] = {
|
||||||
|
CALC_TI83,
|
||||||
|
CALC_TI83P,
|
||||||
|
CALC_TI84P,
|
||||||
|
CALC_TI84P_USB,
|
||||||
|
CALC_TI84PC,
|
||||||
|
CALC_TI84PC_USB,
|
||||||
|
CALC_TI83PCE_USB,
|
||||||
|
CALC_TI84PCE_USB,
|
||||||
|
CALC_TI84PT_USB,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool is_ti8x = false;
|
||||||
|
for(int i = 0; i < sizeof(allowed_models)/sizeof(allowed_models[0]); i++) {
|
||||||
|
if(allowed_models[i] == model) {
|
||||||
|
is_ti8x = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We use my function for apps on TI8x, and the builtin for programs
|
||||||
|
if(is_program || !is_ti8x) {
|
||||||
|
VarEntry *app = get_program(apps, app_name);
|
||||||
|
if(app == NULL) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_ti8x && strcmp(tifiles_vartype2string(model, app->type), "PPRGM") == 0) {
|
||||||
|
// We remap TI8x assembly programs so noshell can do its work
|
||||||
|
// it doesn't like the Asm( token
|
||||||
|
app->type = tifiles_string2vartype(model, "PRGM");
|
||||||
|
}
|
||||||
|
|
||||||
|
ticalcs_calc_execute(calc_handle, app, "");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int app_idx = get_program_index(apps, app_name);
|
int app_idx = get_program_index(apps, app_name);
|
||||||
if(app_idx == -1) {
|
if(app_idx == -1) {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -120,6 +176,7 @@ int start_app(GNode *apps, char *app_name, int is_program) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_sigint(int code) {
|
void handle_sigint(int code) {
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
@ -255,7 +312,7 @@ int main(int argc, char *argv[]) {
|
||||||
send_key(ticalcs_keys_83p(keys[i])->normal.value, 1);
|
send_key(ticalcs_keys_83p(keys[i])->normal.value, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(subtype) > 0 || strlen(program) > 0) {
|
if(strlen(subtype) > 0 || strlen(program) > 0) {
|
||||||
log(LEVEL_DEBUG, "Got a program startup request.\n");
|
log(LEVEL_DEBUG, "Got a program startup request.\n");
|
||||||
|
|
||||||
|
@ -298,13 +355,19 @@ int main(int argc, char *argv[]) {
|
||||||
log(LEVEL_WARN, "Subtype was not recognized! It will be started with noshell!\n");
|
log(LEVEL_WARN, "Subtype was not recognized! It will be started with noshell!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
log(LEVEL_INFO, "Verifying that noshell is correctly hooked.\n");
|
|
||||||
|
|
||||||
GNode *vars, *apps;
|
GNode *vars, *apps;
|
||||||
while((err = ticalcs_calc_get_dirlist(calc_handle, &vars, &apps)));
|
while((err = ticalcs_calc_get_dirlist(calc_handle, &vars, &apps)));
|
||||||
|
|
||||||
log(LEVEL_DEBUG, "Got dirlist\n");
|
log(LEVEL_DEBUG, "Got dirlist\n");
|
||||||
|
|
||||||
|
if(get_program(vars, program) == NULL) {
|
||||||
|
log(LEVEL_ERROR, "Could not find %s. Is it installed? Error %d\n", program, err);
|
||||||
|
cleanup();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
log(LEVEL_INFO, "Verifying that noshell is correctly hooked.\n");
|
||||||
|
|
||||||
if((err = start_app(apps, "Noshell ", 0))) {
|
if((err = start_app(apps, "Noshell ", 0))) {
|
||||||
log(LEVEL_ERROR, "Could not start Noshell. Is it installed?\n");
|
log(LEVEL_ERROR, "Could not start Noshell. Is it installed?\n");
|
||||||
cleanup();
|
cleanup();
|
||||||
|
@ -318,7 +381,7 @@ int main(int argc, char *argv[]) {
|
||||||
ticables_options_set_timeout(cable_handle, CABLE_TIMEOUT);
|
ticables_options_set_timeout(cable_handle, CABLE_TIMEOUT);
|
||||||
|
|
||||||
if((err = start_app(vars, program, 1))) {
|
if((err = start_app(vars, program, 1))) {
|
||||||
log(LEVEL_ERROR, "Could not start %s. Is it installed?\n", program);
|
log(LEVEL_ERROR, "Could not start %s. Is it installed? Error %d\n", program, err);
|
||||||
cleanup();
|
cleanup();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue