jcs
/subtext
/amendments
/528
serial: Make number of rings before answering a configurable setting
Defaults to 1 as before, but can be increased to allow caller id
strings to come through the logger.
jcs made amendment 528 about 1 year ago
--- db.c Mon Aug 28 08:47:54 2023
+++ db.c Wed Nov 8 21:02:07 2023
@@ -77,6 +77,9 @@ struct struct_field config_fields[] = {
{ "Modem Init String", CONFIG_TYPE_STRING,
offsetof(struct config, modem_init),
1, member_size(struct config, modem_init) },
+ { "Modem Answer After Rings", CONFIG_TYPE_SHORT,
+ offsetof(struct config, modem_rings),
+ 1, 100 },
{ "Max Idle Minutes", CONFIG_TYPE_SHORT,
offsetof(struct config, max_idle_minutes),
@@ -355,6 +358,7 @@ db_migrate(struct db *tdb, short is_new, Str255 fullpa
tdb->config.modem_speed = 9600;
sprintf(tdb->config.modem_init, "ATQ0V1S0=2&D2");
sprintf(tdb->config.modem_parity, "8N1");
+ tdb->config.modem_rings = 1;
tdb->config.max_idle_minutes = 5;
tdb->config.max_sysop_idle_minutes = 60;
tdb->config.max_login_seconds = 90;
@@ -589,6 +593,19 @@ db_migrate(struct db *tdb, short is_new, Str255 fullpa
bile_flush(sessions_bile, true);
xfree(&ids);
bile_close(sessions_bile);
+ break;
+ }
+ case 19: {
+ /* 19->20, modem rings */
+ struct config new_config = { 0 };
+
+ bile_read(tdb->bile, DB_CONFIG_RTYPE, 1, (char *)&new_config,
+ sizeof(new_config));
+
+ new_config.modem_rings = 1;
+
+ bile_write(tdb->bile, DB_CONFIG_RTYPE, 1, &new_config,
+ sizeof(new_config));
break;
}
}
--- db.h Wed Jun 14 17:49:15 2023
+++ db.h Wed Nov 8 20:43:00 2023
@@ -19,7 +19,7 @@
#include <time.h>
-#define DB_CUR_VERS 19
+#define DB_CUR_VERS 20
#define SUBTEXT_CREATOR 'SUBT'
#define DB_TYPE 'STDB'
@@ -105,6 +105,7 @@ struct config {
unsigned long ftn_max_tossed_message_size;
short max_sysop_idle_minutes;
char ipdb_path[255];
+ short modem_rings;
};
extern struct struct_field config_fields[];
--- serial.c Sun Aug 27 21:35:23 2023
+++ serial.c Wed Nov 8 20:49:54 2023
@@ -62,6 +62,8 @@ static short serial_out_refnum = 0, serial_in_refnum =
static char serial_input_internal_buf[1024];
static char serial_input_buf[128];
static size_t serial_input_buf_len = 0;
+static short serial_rings = 0;
+static unsigned long serial_last_ring = 0;
static ParamBlockRec serial_write_pbr = { 0 };
enum {
@@ -224,6 +226,8 @@ serial_init(void)
the_serial_node.answered_at = 0;
serial_input_buf_len = 0;
+ serial_rings = 0;
+ serial_last_ring = 0;
}
void
@@ -444,6 +448,14 @@ serial_idle(void)
return;
if (strstr(line, "RING") != NULL) {
+ if (Time - serial_last_ring > 10)
+ serial_rings = 0;
+
+ serial_last_ring = Time;
+ serial_rings++;
+ if (serial_rings < db->config.modem_rings)
+ break;
+
sprintf(tty, "ttym%d", (db->config.modem_port == 2 ? 1 : 0));
the_serial_node.session = session_create(tty, "modem",
&serial_node_funcs);
@@ -457,7 +469,8 @@ serial_idle(void)
the_serial_node.state = SERIAL_STATE_ANSWERED;
the_serial_node.answered_at = Time;
- logger_printf("[modem] Answering call");
+ logger_printf("[modem] Answering call after %d ring%s",
+ serial_rings, serial_rings == 1 ? "" : "s");
serial_printf("ATA\r");
}
break;