2025-01-24 00:22:15 +08:00

193 lines
4.6 KiB
C

#include "main.h"
FDS_T s_fds;
PROFILE_T s_profile; // global profile
int parse_user_input(int argc, char *argv[], PROFILE_T *profile)
{
int opt = 1;
int option;
profile->sms_index = -1;
#define has_more_argv() (opt < argc ? 1 : 0)
while (opt < argc)
{
option = match_option(argv[opt]);
if (option == -1)
{
usage(argv[0]);
return INVALID_PARAM;
}
opt++;
switch (option)
{
case AT_CMD:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->at_cmd = argv[opt++];
break;
case TTY_DEV:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->tty_dev = argv[opt++];
break;
case BAUD_RATE:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->baud_rate = atoi(argv[opt++]);
break;
case DATA_BITS:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->data_bits = atoi(argv[opt++]);
break;
case PARITY:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->parity = argv[opt++];
break;
case STOP_BITS:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->stop_bits = atoi(argv[opt++]);
break;
case FLOW_CONTROL:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->flow_control = argv[opt++];
break;
case TIMEOUT:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->timeout = atoi(argv[opt++]);
break;
case OPERATION:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->op = match_operation(argv[opt++]);
break;
case DEBUG:
profile->debug = 1;
break;
case SMS_PDU:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->sms_pdu = argv[opt++];
break;
case SMS_INDEX:
if (!has_more_argv())
{
usage(argv[0]);
return INVALID_PARAM;
}
profile->sms_index = atoi(argv[opt++]);
break;
default:
err_msg("Invalid option: %s", argv[opt]);
break;
}
}
// default settings:
if (profile->baud_rate == 0 )
{
profile->baud_rate = 115200;
}
if (profile->data_bits == 0)
{
profile->data_bits = 8;
}
if (profile->timeout == 0)
{
profile->timeout = 3;
}
if (profile->op == 0 || profile->op == -1)
{
profile->op = AT_OP;
}
return SUCCESS;
}
int run_op(PROFILE_T *profile,FDS_T *fds)
{
switch (profile->op)
{
case AT_OP:
return at(profile,fds);
case BINARY_AT_OP:
return binary_at(profile,fds);
case SMS_READ_OP:
return sms_read(profile,fds);
case SMS_SEND_OP:
return sms_send(profile,fds);
case SMS_DELETE_OP:
return sms_delete(profile,fds);
default:
err_msg("Invalid operation");
}
return UNKNOWN_ERROR;
}
static void clean_up()
{
if (tcsetattr(s_fds.tty_fd, TCSANOW, &s_fds.old_termios) != 0)
{
err_msg("Error restoring old tty attributes");
return;
}
dbg_msg("Clean up success");
tcflush(s_fds.tty_fd, TCIOFLUSH);
if (s_fds.tty_fd >= 0)
close(s_fds.tty_fd);
}
int main(int argc, char *argv[])
{
PROFILE_T *profile = &s_profile;
FDS_T *fds = &s_fds;
parse_user_input(argc, argv, profile);
dump_profile();
// try open tty devices
if (tty_open_device(profile,fds))
{
err_msg("Failed to open tty device");
return COMM_ERROR;
}
atexit(clean_up);
if (run_op(profile,fds))
{
err_msg("Failed to run operation %d", profile->op);
kill(getpid(), SIGINT);
}
dbg_msg("Exit");
return SUCCESS;
}