Author: jmesquita Date: Thu Jun 11 11:10:03 2009 New Revision: 13756 Log: My first API to show board information Modified: freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/Makefile freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp Modified: freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/Makefile ============================================================================== --- freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/Makefile (original) +++ freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/Makefile Thu Jun 11 11:10:03 2009 @@ -1,4 +1,6 @@ MODNAME=mod_khomp -LOCAL_CFLAGS=-I./include -lk3l -D_REENTRANT -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DK3L_HOSTSYSTEM -lboost_thread -lboost_regex +LOCAL_CFLAGS=-I./include -I./commons/include -lk3l -D_REENTRANT -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DK3L_HOSTSYSTEM -DKHOMP_COMMONS_WITH_CHANNEL -lboost_thread -lboost_regex + +LOCAL_OBJS= ./commons/k3lapi.o include ../../../../build/modmake.rules Modified: freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp ============================================================================== --- freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp (original) +++ freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp Thu Jun 11 11:10:03 2009 @@ -30,8 +30,10 @@ * */ +#define KHOMP_SYNTAX "khomp [status]" + /* Our includes */ -#include "k3l.h" +#include "k3lapi.hpp" extern "C" { @@ -48,6 +50,8 @@ static switch_memory_pool_t *module_pool = NULL; static int running = 1; +static K3LAPI * k3l; + typedef enum { TFLAG_IO = (1 << 0), @@ -103,6 +107,8 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_rates_string, globals.codec_rates_string); SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_ip, globals.ip); +/* Macros to define specific API functions */ +SWITCH_STANDARD_API(khomp); static switch_status_t channel_on_init(switch_core_session_t *session); @@ -534,49 +540,6 @@ return SWITCH_STATUS_SUCCESS; } -bool start_k3l(void) -{ - k3lSetGlobalParam (klpResetFwOnStartup, 1); - k3lSetGlobalParam (klpDisableInternalVoIP, 1); - - sbyte *Erro = k3lStart( 2,0,0 ); - - if ( Erro ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "loading K3L API failed: %s.\n", Erro); - return false; - } - - int _boardCount = k3lGetDeviceCount(); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Number of boards: %d.\n", _boardCount); - - /* No boards */ - if(_boardCount == 0){ - k3lStop(); - return false; - } - -/* _boards = new Board*[ _boardCount ]; - - for( int i = 0; i < _boardCount; i++ ) - _boards[ i ] = new Board( i ); - - - if(handler) - RegisterHandler((void *)EventCallBack); */ - - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "the K3L API have been started!\n"); - - bool is_ok = true; - - if (!is_ok) - return false; - - return true; -}; - - SWITCH_MODULE_LOAD_FUNCTION(mod_khomp_load) { @@ -586,15 +549,33 @@ load_config(); + switch_api_interface_t *api_interface; + *module_interface = switch_loadable_module_create_module_interface(pool, "mod_khomp"); khomp_endpoint_interface = static_cast<switch_endpoint_interface_t*>(switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE)); khomp_endpoint_interface->interface_name = "khomp"; khomp_endpoint_interface->io_routines = &khomp_io_routines; khomp_endpoint_interface->state_handler = &khomp_state_handlers; - if (!start_k3l()) { - return SWITCH_STATUS_FALSE; - } + /* + Spawn our k3l global var that will be used along the module + for sending info to the boards + */ + k3l = new K3LAPI(); + + /* Start the API and connect to KServer */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Starting K3L...\n"); + try { + k3l->start(); + } catch (...) { + /* TODO: Catch the proper error and display it. */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "K3L not started."); + return SWITCH_STATUS_TERM; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "K3L started.\n"); + + /* Add all the specific API functions */ + SWITCH_ADD_API(api_interface, "khomp", "Khomp Menu", khomp, KHOMP_SYNTAX); /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; @@ -628,12 +609,149 @@ /* Finnish him! */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Stopping K3L...\n"); - k3lStop(); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "the K3L API have been stopped!\n"); + k3l->stop(); + delete k3l; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "the K3L API has been stopped!\n"); return SWITCH_STATUS_SUCCESS; } +/* + khomp API + Only displays board information right now +*/ + +SWITCH_STANDARD_API(khomp) +{ + char *argv[10] = { 0 }; + int argc = 0; + void *val; + char *myarg = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; + + /* We should not ever get a session here */ + if (session) return status; + + if (switch_strlen_zero(cmd) || !(myarg = strdup(cmd))) { + stream->write_function(stream, "USAGE: %s\n", KHOMP_SYNTAX); + return SWITCH_STATUS_FALSE; + } + + if ((argc = switch_separate_string(myarg, ' ', argv, (sizeof(argv) / sizeof(argv[0])))) != 1) { + stream->write_function(stream, "USAGE: %s\n", KHOMP_SYNTAX); + goto done; + } + + if (argv[0] && !strncasecmp(argv[0], "status", 6)) { + K3L_API_CONFIG apiCfg; + + stream->write_function(stream," ------------------------------------------------------------------\n"); + stream->write_function(stream, "|---------------------- Khomp System Summary ----------------------|\n"); + stream->write_function(stream, "|------------------------------------------------------------------|\n"); + + if (k3lGetDeviceConfig(-1, ksoAPI, &apiCfg, sizeof(apiCfg)) == ksSuccess) + { + stream->write_function(stream, "| K3L API %d.%d.%d [m.VPD %d] - %-38s |\n" + , apiCfg.MajorVersion , apiCfg.MinorVersion , apiCfg.BuildVersion + , apiCfg.VpdVersionNeeded , apiCfg.StrVersion); + } + + for (unsigned int i = 0; i < k3l->device_count(); i++) + { + K3L_DEVICE_CONFIG & devCfg = k3l->device_config(i); + + stream->write_function(stream, " ------------------------------------------------------------------\n"); + + switch (k3l->device_type(i)) + { + /* E1 boards */ + case kdtE1: + case kdtConf: + case kdtPR: + case kdtE1GW: + case kdtE1IP: + case kdtE1Spx: + case kdtGWIP: + case kdtFXS: + case kdtFXSSpx: + { + K3L_E1600A_FW_CONFIG dspAcfg; + K3L_E1600B_FW_CONFIG dspBcfg; + + if ((k3lGetDeviceConfig(i, ksoFirmware + kfiE1600A, &dspAcfg, sizeof(dspAcfg)) == ksSuccess) && + (k3lGetDeviceConfig(i, ksoFirmware + kfiE1600B, &dspBcfg, sizeof(dspBcfg)) == ksSuccess)) + { + stream->write_function(stream, "| [[ %02d ]] %s, serial '%04d', %02d channels, %d links.|\n" + , i , "E1" , atoi(devCfg.SerialNumber) , devCfg.ChannelCount , devCfg.LinkCount); + stream->write_function(stream, "| * DSP A: %s, DSP B: %s - PCI bus: %02d, PCI slot: %02d %s|\n" + , dspAcfg.DspVersion , dspBcfg.DspVersion , devCfg.PciBus , devCfg.PciSlot + , std::string(18 - strlen(dspAcfg.DspVersion) - strlen(dspBcfg.DspVersion), ' ').c_str()); + stream->write_function(stream, "| * %-62s |\n" , dspAcfg.FwVersion); + stream->write_function(stream, "| * %-62s |\n" , dspBcfg.FwVersion); + + } + + break; + } + + /* analog boards */ + case kdtFXO: + case kdtFXOVoIP: + { + K3L_FXO80_FW_CONFIG dspCfg; + + if (k3lGetDeviceConfig(i, ksoFirmware + kfiFXO80, &dspCfg, sizeof(dspCfg)) == ksSuccess) + { + stream->write_function(stream, "| [[ %02d ]] %s, serial '%04d', %02d channels. %s|\n" + , i , "KFXO80" , atoi(devCfg.SerialNumber) , devCfg.ChannelCount + , std::string(26 - 6, ' ').c_str()); + stream->write_function(stream, "| * DSP: %s - PCI bus: %02d, PCI slot: %02d%s|\n" + , dspCfg.DspVersion , devCfg.PciBus , devCfg.PciSlot + , std::string(30 - strlen(dspCfg.DspVersion), ' ').c_str()); + stream->write_function(stream, "| * %-62s |\n" , dspCfg.FwVersion); + } + + } + + case kdtGSM: + case kdtGSMSpx: + { + K3L_GSM40_FW_CONFIG dspCfg; + + if (k3lGetDeviceConfig(i, ksoFirmware + kfiGSM40, &dspCfg, sizeof(dspCfg)) == ksSuccess) + { + stream->write_function(stream, "| [[ %02d ]] %s, serial '%04d', %02d channels. %s|\n" + , i , "KGSM" , atoi(devCfg.SerialNumber) , devCfg.ChannelCount + , std::string(26 - 4, ' ').c_str()); + + stream->write_function(stream, "| * DSP: %s - PCI bus: %02d, PCI slot: %02d%s|\n" + , dspCfg.DspVersion , devCfg.PciBus , devCfg.PciSlot + , std::string(30 - strlen(dspCfg.DspVersion), ' ').c_str()); + + stream->write_function(stream, "| * %-62s |\n" , dspCfg.FwVersion); + } + + break; + } + default: + stream->write_function(stream, "| [[ %02d ]] Unknown type '%02d'! Please contact Khomp support for help! |\n" + , i , k3l->device_type(i)); + break; + } + } + + stream->write_function(stream, " ------------------------------------------------------------------\n"); + + } else { + stream->write_function(stream, "USAGE: %s\n", KHOMP_SYNTAX); + } + +done: + switch_safe_free(myarg); + return status; + +} + /* For Emacs: * Local Variables: * mode:c