From 419d5a55d5323628668c52364886eb0004d1ec21 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Mon, 15 Mar 2010 11:08:40 +0000 Subject: [PATCH] Autodetect the correct layout at runtime. --- src/oceanic_common.c | 12 ++++++++++++ src/oceanic_common.h | 3 +++ src/oceanic_vtpro.c | 20 +++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/oceanic_common.c b/src/oceanic_common.c index f7d8d41..9d09f03 100644 --- a/src/oceanic_common.c +++ b/src/oceanic_common.c @@ -82,6 +82,18 @@ get_profile_last (const unsigned char data[], const oceanic_common_layout_t *lay } +int +oceanic_common_match (const unsigned char *pattern, const unsigned char *string, unsigned int n) +{ + for (unsigned int i = 0; i < n; ++i, ++pattern, ++string) { + if (*pattern != '\0' && *pattern != *string) + return 0; + } + + return 1; +} + + void oceanic_common_device_init (oceanic_common_device_t *device, const device_backend_t *backend) { diff --git a/src/oceanic_common.h b/src/oceanic_common.h index 293b811..da78f66 100644 --- a/src/oceanic_common.h +++ b/src/oceanic_common.h @@ -57,6 +57,9 @@ typedef struct oceanic_common_device_t { unsigned int multipage; } oceanic_common_device_t; +int +oceanic_common_match (const unsigned char *pattern, const unsigned char *string, unsigned int n); + void oceanic_common_device_init (oceanic_common_device_t *device, const device_backend_t *backend); diff --git a/src/oceanic_vtpro.c b/src/oceanic_vtpro.c index 84acce9..a2c4b26 100644 --- a/src/oceanic_vtpro.c +++ b/src/oceanic_vtpro.c @@ -64,6 +64,9 @@ static const device_backend_t oceanic_vtpro_device_backend = { oceanic_vtpro_device_close /* close */ }; +static const unsigned char oceanic_vtpro_version[] = "VTPRO r\0\0 256K"; +static const unsigned char oceanic_wisdom_version[] = "WISDOM r\0\0 256K"; + static const oceanic_common_layout_t oceanic_vtpro_layout = { 0x8000, /* memsize */ 0x0000, /* cf_devinfo */ @@ -75,6 +78,16 @@ static const oceanic_common_layout_t oceanic_vtpro_layout = { 0 /* mode */ }; +static const oceanic_common_layout_t oceanic_wisdom_layout = { + 0x8000, /* memsize */ + 0x0000, /* cf_devinfo */ + 0x0040, /* cf_pointers */ + 0x03D0, /* rb_logbook_begin */ + 0x05D0, /* rb_logbook_end */ + 0x05D0, /* rb_profile_begin */ + 0x8000, /* rb_profile_end */ + 0 /* mode */ +}; static int device_is_oceanic_vtpro (device_t *abstract) @@ -237,7 +250,6 @@ oceanic_vtpro_device_open (device_t **out, const char* name) oceanic_common_device_init (&device->base, &oceanic_vtpro_device_backend); // Override the base class values. - device->base.layout = &oceanic_vtpro_layout; device->base.multipage = MULTIPAGE; // Set the default values. @@ -312,6 +324,12 @@ oceanic_vtpro_device_open (device_t **out, const char* name) return status; } + // Override the base class values. + if (oceanic_common_match (oceanic_wisdom_version, device->version, sizeof (device->version))) + device->base.layout = &oceanic_wisdom_layout; + else + device->base.layout = &oceanic_vtpro_layout; + *out = (device_t*) device; return DEVICE_STATUS_SUCCESS;