FreeCalypso > hg > freecalypso-tools
view miscutil/fc-vm2hex.c @ 497:74610c4f10f7
target-utils: added 10 ms delay at the end of abb_power_off()
The deosmification of the ABB access code (replacement of osmo_delay_ms()
bogus delays with correctly-timed ones, which are significantly shorter)
had one annoying side effect: when executing the poweroff command from
any of the programs, one last '=' prompt character was being sent (and
received by the x86 host) as the Calypso board powers off. With delays
being shorter now, the abb_power_off() function was returning and the
standalone program's main loop was printing its prompt before the Iota chip
fully executed the switch-off sequence!
I thought about inserting an endless tight loop at the end of the
abb_power_off() function, but the implemented solution of a 10 ms delay
is a little nicer IMO because if the DEVOFF operation doesn't happen for
some reason in a manual hacking scenario, there won't be an artificial
blocker in the form of a tight loop keeping us from further poking around.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 25 May 2019 20:44:05 +0000 |
parents | a72bbc3ace09 |
children |
line wrap: on
line source
/* * This utility converts the old-fashioned (non-AMR) voice memo files * read out of FFS into hex strings that can be analyzed by a human * or further fed to fc-tch2fr. */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> char *infname; FILE *inf, *outf; static unsigned get_word() { u_char b[2]; int i, c; for (i = 0; i < 2; i++) { c = getc(inf); if (c < 0) { fprintf(stderr, "error: premature EOF in %s\n", infname); exit(1); } b[i] = c; } return((b[1] << 8) | b[0]); } convert_speech_sample() { u_char bytes[34]; int i, dp; unsigned word; dp = 0; for (i = 0; i < 17; i++) { word = get_word(); bytes[dp++] = word >> 8; bytes[dp++] = word; } for (i = 0; i < 33; i++) fprintf(outf, "%02X", bytes[i]); } main(argc, argv) char **argv; { unsigned first_word; if (argc < 2 || argc > 3) { fprintf(stderr, "usage: %s infile [outfile]\n", argv[0]); exit(1); } infname = argv[1]; inf = fopen(infname, "r"); if (!inf) { perror(infname); exit(1); } if (argc > 2) { outf = fopen(argv[2], "w"); if (!outf) { perror(argv[2]); exit(1); } } else outf = stdout; for (;;) { first_word = get_word(); if (first_word == 0xFBFF) /* SC_VM_END_MASK */ break; fprintf(outf, "%04X", first_word); if (first_word & 0x8000) { /* B_VM_SPEECH */ fprintf(outf, " %04X", get_word()); fprintf(outf, " %04X", get_word()); putc(' ', outf); convert_speech_sample(); } putc('\n', outf); } exit(0); }