Blame hpi_shell/ctrl_inv.c

Packit db01ca
/*      -*- linux-c -*-
Packit db01ca
 *
Packit db01ca
 * Copyright (c) 2004 by Intel Corp.
Packit db01ca
 *
Packit db01ca
 * This program is distributed in the hope that it will be useful,
Packit db01ca
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit db01ca
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  This
Packit db01ca
 * file and program are licensed under a BSD style license.  See
Packit db01ca
 * the Copying file included with the OpenHPI distribution for
Packit db01ca
 * full licensing terms.
Packit db01ca
 *
Packit db01ca
 * Author(s):
Packit db01ca
 *	Kouzmich	< Mikhail.V.Kouzmich@intel.com >
Packit db01ca
 *
Packit db01ca
 *
Packit db01ca
 */
Packit db01ca
Packit db01ca
#include <stdio.h>
Packit db01ca
#include <stdlib.h>
Packit db01ca
#include <string.h>
Packit db01ca
#include <time.h>
Packit db01ca
#include <ctype.h>
Packit db01ca
Packit db01ca
#include "hpi_ui.h"
Packit db01ca
#include "hpi_cmd.h"
Packit db01ca
Packit db01ca
typedef struct {
Packit db01ca
	SaHpiResourceIdT	rptid;
Packit db01ca
	SaHpiInstrumentIdT	rdrnum;
Packit db01ca
} inv_block_env_t;
Packit db01ca
Packit db01ca
static inv_block_env_t		inv_block_env;
Packit db01ca
Packit db01ca
typedef struct {
Packit db01ca
	SaHpiResourceIdT	rptid;
Packit db01ca
	SaHpiInstrumentIdT	rdrnum;
Packit db01ca
} ctrl_block_env_t;
Packit db01ca
Packit db01ca
static ctrl_block_env_t		ctrl_block_env;
Packit db01ca
Packit db01ca
typedef struct {
Packit db01ca
	SaHpiResourceIdT	rptid;
Packit db01ca
	SaHpiInstrumentIdT	rdrnum;
Packit db01ca
	SaHpiRdrT		rdr_entry;
Packit db01ca
} ann_block_env_t;
Packit db01ca
Packit db01ca
static ann_block_env_t		ann_block_env;
Packit db01ca
Packit db01ca
typedef struct {
Packit db01ca
	char			*name;
Packit db01ca
	SaHpiIdrAreaTypeT	val;
Packit db01ca
} Area_type_t;
Packit db01ca
Packit db01ca
static Area_type_t Area_types[] = {
Packit db01ca
	{ "inter",	SAHPI_IDR_AREATYPE_INTERNAL_USE },
Packit db01ca
	{ "chass",	SAHPI_IDR_AREATYPE_CHASSIS_INFO },
Packit db01ca
	{ "board",	SAHPI_IDR_AREATYPE_BOARD_INFO },
Packit db01ca
	{ "prod",	SAHPI_IDR_AREATYPE_PRODUCT_INFO },
Packit db01ca
	{ "oem",	SAHPI_IDR_AREATYPE_OEM },
Packit db01ca
	{ NULL,		SAHPI_IDR_AREATYPE_UNSPECIFIED } };
Packit db01ca
Packit db01ca
typedef struct {
Packit db01ca
	char			*name;
Packit db01ca
	SaHpiIdrFieldTypeT	val;
Packit db01ca
} Field_type_t;
Packit db01ca
Packit db01ca
static Field_type_t Field_types[] = {
Packit db01ca
	{ "chass",	SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE },
Packit db01ca
	{ "time",	SAHPI_IDR_FIELDTYPE_MFG_DATETIME },
Packit db01ca
	{ "manuf",	SAHPI_IDR_FIELDTYPE_MANUFACTURER },
Packit db01ca
	{ "prodname",	SAHPI_IDR_FIELDTYPE_PRODUCT_NAME },
Packit db01ca
	{ "prodver",	SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION },
Packit db01ca
	{ "snum",	SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER },
Packit db01ca
	{ "pnum",	SAHPI_IDR_FIELDTYPE_PART_NUMBER },
Packit db01ca
	{ "file",	SAHPI_IDR_FIELDTYPE_FILE_ID },
Packit db01ca
	{ "tag",	SAHPI_IDR_FIELDTYPE_ASSET_TAG },
Packit db01ca
	{ "custom",	SAHPI_IDR_FIELDTYPE_CUSTOM },
Packit db01ca
	{ NULL,		SAHPI_IDR_FIELDTYPE_UNSPECIFIED } };
Packit db01ca
Packit db01ca
static ret_code_t add_inventory_area(SaHpiSessionIdT sessionId,
Packit db01ca
	SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaHpiEntryIdT	entry;
Packit db01ca
	SaErrorT	rv;
Packit db01ca
	char		buf[10];
Packit db01ca
	int		i;
Packit db01ca
Packit db01ca
	i = get_string_param("Area type (inter,chass,board,prod,oem): ", buf, 9);
Packit db01ca
	if (i != 0) return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	for (i = 0; Area_types[i].name != (char *)NULL; i++)
Packit db01ca
		if (strcmp(Area_types[i].name, buf) == 0) break;
Packit db01ca
	if (Area_types[i].name == (char *)NULL) {
Packit db01ca
		printf("Error!!! Unknown Area type: %s\n", buf);
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	rv = saHpiIdrAreaAdd(sessionId, rptid, rdrnum, Area_types[i].val, &entry);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("ERROR!!! saHpiIdrAreaAdd: %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t add_inventory_field(SaHpiSessionIdT sessionId,
Packit db01ca
	SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT	rv;
Packit db01ca
	SaHpiIdrFieldT	field;
Packit db01ca
	char		buf[256];
Packit db01ca
	int		res, i;
Packit db01ca
Packit db01ca
	i = get_int_param("Area Id: ", &res;;
Packit db01ca
	if (i != 1) {
Packit db01ca
		printf("Error!!! Invalid Area Id\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	field.AreaId = res;
Packit db01ca
Packit db01ca
	i = get_string_param("Field type(chass,time,manuf,prodname,prodver,"
Packit db01ca
		"snum,pnum,file,tag,custom): ", buf, 9);
Packit db01ca
	if (i != 0) {
Packit db01ca
		printf("Error!!! Invalid Field type: %s\n", buf);
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	for (i = 0; Field_types[i].name != (char *)NULL; i++)
Packit db01ca
		if (strcmp(Field_types[i].name, buf) == 0) break;
Packit db01ca
	if (Field_types[i].name == (char *)NULL) {
Packit db01ca
		printf("Error!!! Unknown Field type: %s\n", buf);
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	field.Type = Field_types[i].val;
Packit db01ca
	field.ReadOnly = SAHPI_FALSE;
Packit db01ca
	i = set_text_buffer(&(field.Field));
Packit db01ca
	if (i != 0) {
Packit db01ca
		printf("Invalid text\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	rv = saHpiIdrFieldAdd(sessionId, rptid, rdrnum, &field);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("ERROR!!! saHpiIdrFieldAdd: %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t set_inventory_field(SaHpiSessionIdT sessionId,
Packit db01ca
	SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT	rv;
Packit db01ca
	SaHpiIdrFieldT	field, read_field;
Packit db01ca
	SaHpiEntryIdT	next;
Packit db01ca
	int		res, i;
Packit db01ca
Packit db01ca
	memset(&field, 0, sizeof(SaHpiIdrFieldT));
Packit db01ca
	i = get_int_param("Area Id: ", &res;;
Packit db01ca
	if (i != 1) {
Packit db01ca
		printf("Error!!! Invalid Area Id\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	field.AreaId = res;
Packit db01ca
Packit db01ca
	i = get_int_param("Field Id: ", &res;;
Packit db01ca
	if (i != 1) {
Packit db01ca
		printf("Error!!! Invalid Field Id\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	field.FieldId = res;
Packit db01ca
	
Packit db01ca
	rv = saHpiIdrFieldGet(sessionId, rptid, rdrnum, field.AreaId,
Packit db01ca
		SAHPI_IDR_FIELDTYPE_UNSPECIFIED, field.FieldId, &next, &read_field);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("ERROR!!! saHpiIdrFieldGet: %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	field.Type = read_field.Type;
Packit db01ca
Packit db01ca
	i = set_text_buffer(&(field.Field));
Packit db01ca
	if (i != 0) {
Packit db01ca
		printf("Invalid text\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	rv = saHpiIdrFieldSet(sessionId, rptid, rdrnum, &field);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("ERROR!!! saHpiIdrFieldSet: %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t del_inventory_field(SaHpiSessionIdT sessionId,
Packit db01ca
	SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT	rv;
Packit db01ca
	SaHpiEntryIdT	areaId, fieldId;
Packit db01ca
	int		res, i;
Packit db01ca
Packit db01ca
	i = get_int_param("Area Id: ", &res;;
Packit db01ca
	if (i != 1) {
Packit db01ca
		printf("Error!!! Invalid Area Id\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	areaId = res;
Packit db01ca
Packit db01ca
	i = get_int_param("Field Id: ", &res;;
Packit db01ca
	if (i != 1) {
Packit db01ca
		printf("Error!!! Invalid Field Id\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	fieldId = res;
Packit db01ca
Packit db01ca
	rv = saHpiIdrFieldDelete(sessionId, rptid, rdrnum, areaId, fieldId);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("ERROR!!! saHpiIdrFieldDelete: %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t delete_inventory_area(SaHpiSessionIdT sessionId,
Packit db01ca
	SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT	rv;
Packit db01ca
	int		res, i;
Packit db01ca
Packit db01ca
	i = get_int_param("Area Id: ", &res;;
Packit db01ca
	if (i != 1) {
Packit db01ca
		printf("Error!!! Invalid Area Id\n");
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	rv = saHpiIdrAreaDelete(sessionId, rptid, rdrnum, res);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("ERROR!!! saHpiIdrAreaDelete: %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t sa_show_inv(SaHpiResourceIdT resourceid)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv = SA_OK, rva, rvf;
Packit db01ca
	SaHpiEntryIdT		rdrentryid;
Packit db01ca
	SaHpiEntryIdT		nextrdrentryid;
Packit db01ca
	SaHpiRdrT		rdr;
Packit db01ca
	SaHpiIdrIdT		idrid;
Packit db01ca
	SaHpiIdrInfoT		idrInfo;
Packit db01ca
	SaHpiEntryIdT		areaId;
Packit db01ca
	SaHpiEntryIdT		nextareaId;
Packit db01ca
	SaHpiIdrAreaTypeT	areaType;
Packit db01ca
	SaHpiEntryIdT		fieldId;
Packit db01ca
	SaHpiEntryIdT		nextFieldId;
Packit db01ca
	SaHpiIdrFieldTypeT	fieldType;
Packit db01ca
	SaHpiIdrFieldT		thisField;
Packit db01ca
	SaHpiIdrAreaHeaderT	areaHeader;
Packit db01ca
Packit db01ca
	rdrentryid = SAHPI_FIRST_ENTRY;
Packit db01ca
	while (rdrentryid != SAHPI_LAST_ENTRY) {
Packit db01ca
		rv = saHpiRdrGet(Domain->sessionId, resourceid, rdrentryid,
Packit db01ca
			&nextrdrentryid, &rdr;;
Packit db01ca
		if (rv != SA_OK) {
Packit db01ca
			printf("saHpiRdrGet error %s\n", oh_lookup_error(rv));
Packit db01ca
			return HPI_SHELL_CMD_ERROR;
Packit db01ca
		}
Packit db01ca
Packit db01ca
		if (rdr.RdrType != SAHPI_INVENTORY_RDR) {
Packit db01ca
			rdrentryid = nextrdrentryid;
Packit db01ca
			continue;
Packit db01ca
		};
Packit db01ca
		
Packit db01ca
		idrid = rdr.RdrTypeUnion.InventoryRec.IdrId;
Packit db01ca
		rv = saHpiIdrInfoGet(Domain->sessionId, resourceid, idrid, &idrInfo);
Packit db01ca
		if (rv != SA_OK) {
Packit db01ca
			printf("saHpiIdrInfoGet error %s\n", oh_lookup_error(rv));
Packit db01ca
			return HPI_SHELL_CMD_ERROR;
Packit db01ca
		}
Packit db01ca
		
Packit db01ca
		areaType = SAHPI_IDR_AREATYPE_UNSPECIFIED;
Packit db01ca
		areaId = SAHPI_FIRST_ENTRY; 
Packit db01ca
		while (areaId != SAHPI_LAST_ENTRY) {
Packit db01ca
			rva = saHpiIdrAreaHeaderGet(Domain->sessionId, resourceid,
Packit db01ca
				idrInfo.IdrId, areaType, areaId, &nextareaId,
Packit db01ca
				&areaHeader);
Packit db01ca
			if (rva != SA_OK) {
Packit db01ca
				printf("saHpiIdrAreaHeaderGet error %s\n",
Packit db01ca
					oh_lookup_error(rva));
Packit db01ca
				break;
Packit db01ca
			}
Packit db01ca
			show_inv_area_header(&areaHeader, 2, ui_print);
Packit db01ca
Packit db01ca
			fieldType = SAHPI_IDR_FIELDTYPE_UNSPECIFIED;
Packit db01ca
			fieldId = SAHPI_FIRST_ENTRY;
Packit db01ca
			while (fieldId != SAHPI_LAST_ENTRY) {
Packit db01ca
				rvf = saHpiIdrFieldGet(Domain->sessionId, resourceid,
Packit db01ca
						idrInfo.IdrId, areaHeader.AreaId, 
Packit db01ca
						fieldType, fieldId, &nextFieldId,
Packit db01ca
						&thisField);
Packit db01ca
				if (rvf != SA_OK) {
Packit db01ca
					printf("saHpiIdrFieldGet error %s\n",
Packit db01ca
						oh_lookup_error(rvf));
Packit db01ca
					break;
Packit db01ca
				}
Packit db01ca
				show_inv_field(&thisField, 4, ui_print);
Packit db01ca
				fieldId = nextFieldId;
Packit db01ca
			}
Packit db01ca
			areaId = nextareaId;
Packit db01ca
		}
Packit db01ca
		rdrentryid = nextrdrentryid;
Packit db01ca
	}
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t inv_block_show(void)
Packit db01ca
{
Packit db01ca
    term_def_t      *term;
Packit db01ca
    SaHpiEntryIdT areaid;
Packit db01ca
Packit db01ca
        term = get_next_term();
Packit db01ca
        if (term != NULL) {
Packit db01ca
        areaid = strtol( term->term, NULL, 10 );
Packit db01ca
    } else {
Packit db01ca
        areaid = SAHPI_LAST_ENTRY;
Packit db01ca
    }
Packit db01ca
Packit db01ca
	return(show_inventory(Domain->sessionId, inv_block_env.rptid,
Packit db01ca
		inv_block_env.rdrnum, areaid, ui_print));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t inv_block_addarea(void)
Packit db01ca
{
Packit db01ca
	return(add_inventory_area(Domain->sessionId, inv_block_env.rptid,
Packit db01ca
		inv_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t inv_block_delarea(void)
Packit db01ca
{
Packit db01ca
	return(delete_inventory_area(Domain->sessionId, inv_block_env.rptid,
Packit db01ca
		inv_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t inv_block_addfield(void)
Packit db01ca
{
Packit db01ca
	return(add_inventory_field(Domain->sessionId, inv_block_env.rptid,
Packit db01ca
		inv_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t inv_block_setfield(void)
Packit db01ca
{
Packit db01ca
	return(set_inventory_field(Domain->sessionId, inv_block_env.rptid,
Packit db01ca
		inv_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t inv_block_delfield(void)
Packit db01ca
{
Packit db01ca
	return(del_inventory_field(Domain->sessionId, inv_block_env.rptid,
Packit db01ca
		inv_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t inv_block(void)
Packit db01ca
{
Packit db01ca
	SaHpiRdrT		rdr_entry;
Packit db01ca
	SaHpiResourceIdT	rptid;
Packit db01ca
	SaHpiInstrumentIdT	rdrnum;
Packit db01ca
	SaHpiRdrTypeT		type;
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	char			buf[256];
Packit db01ca
	ret_code_t		ret;
Packit db01ca
	term_def_t		*term;
Packit db01ca
	int			res;
Packit db01ca
Packit db01ca
	ret = ask_rpt(&rptid);
Packit db01ca
	if (ret != HPI_SHELL_OK) return(ret);
Packit db01ca
	type = SAHPI_INVENTORY_RDR;
Packit db01ca
	ret = ask_rdr(rptid, type, &rdrnum);
Packit db01ca
	if (ret != HPI_SHELL_OK) return(ret);
Packit db01ca
	inv_block_env.rptid = rptid;
Packit db01ca
	inv_block_env.rdrnum = rdrnum;
Packit db01ca
	rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum,
Packit db01ca
		&rdr_entry);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv));
Packit db01ca
		printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n",
Packit db01ca
			rptid, type, rdrnum);
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	show_inventory(Domain->sessionId, rptid, rdrnum, SAHPI_LAST_ENTRY, ui_print);
Packit db01ca
	for (;;) {
Packit db01ca
		block_type = INV_COM;
Packit db01ca
		res = get_new_command("inventory block ==> ");
Packit db01ca
		if (res == 2) {
Packit db01ca
			unget_term();
Packit db01ca
			return HPI_SHELL_OK;
Packit db01ca
		};
Packit db01ca
		term = get_next_term();
Packit db01ca
		if (term == NULL) continue;
Packit db01ca
		snprintf(buf, 256, "%s", term->term);
Packit db01ca
		if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break;
Packit db01ca
	};
Packit db01ca
	block_type = MAIN_COM;
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t show_inv(void)
Packit db01ca
{
Packit db01ca
	SaHpiResourceIdT	resid = 0;
Packit db01ca
	int			i, res;
Packit db01ca
	term_def_t		*term;
Packit db01ca
Packit db01ca
	term = get_next_term();
Packit db01ca
	if (term == NULL) {
Packit db01ca
		i = show_rpt_list(Domain, SHOW_ALL_RPT, resid,
Packit db01ca
			SHORT_LSRES, ui_print);
Packit db01ca
		if (i == 0) {
Packit db01ca
			printf("NO rpt!\n");
Packit db01ca
			return(HPI_SHELL_OK);
Packit db01ca
		};
Packit db01ca
		i = get_int_param("RPT ID ==> ", &res;;
Packit db01ca
		if (i == 1) resid = (SaHpiResourceIdT)res;
Packit db01ca
		else return HPI_SHELL_OK;
Packit db01ca
	} else {
Packit db01ca
		resid = (SaHpiResourceIdT)atoi(term->term);
Packit db01ca
	};
Packit db01ca
			
Packit db01ca
	return sa_show_inv(resid);
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t set_control_state(SaHpiSessionIdT sessionid,
Packit db01ca
	SaHpiResourceIdT resourceid, SaHpiCtrlNumT num)
Packit db01ca
{
Packit db01ca
        SaErrorT		rv;
Packit db01ca
	SaHpiRdrT		rdr;
Packit db01ca
	SaHpiCtrlRecT		*ctrl;
Packit db01ca
	SaHpiCtrlTypeT		type;
Packit db01ca
	SaHpiCtrlStateDigitalT	state_val = 0;
Packit db01ca
	SaHpiCtrlModeT		mode;
Packit db01ca
	SaHpiCtrlStateT		state;
Packit db01ca
	char			buf[SAHPI_MAX_TEXT_BUFFER_LENGTH];
Packit db01ca
	char			*str;
Packit db01ca
	int			i, res;
Packit db01ca
Packit db01ca
	rv = saHpiRdrGetByInstrumentId(sessionid, resourceid, SAHPI_CTRL_RDR,
Packit db01ca
		num, &rdr;;
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiRdrGetByInstrumentId: error: %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	memset(&state, 0, sizeof(SaHpiCtrlStateT));
Packit db01ca
	i = get_string_param("Mode(auto|manual): ", buf, 7);
Packit db01ca
	if (i != 0) return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	if (strcmp(buf, "auto") == 0) mode = SAHPI_CTRL_MODE_AUTO;
Packit db01ca
	else if (strcmp(buf, "manual") == 0) mode = SAHPI_CTRL_MODE_MANUAL;
Packit db01ca
	else return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	if (mode == SAHPI_CTRL_MODE_AUTO) {
Packit db01ca
		rv = saHpiControlSet(sessionid, resourceid, num,
Packit db01ca
			mode, (SaHpiCtrlStateT *)NULL);
Packit db01ca
		if (rv != SA_OK) {
Packit db01ca
			printf("saHpiControlSet: error: %s\n",
Packit db01ca
				oh_lookup_error(rv));
Packit db01ca
			return(HPI_SHELL_CMD_ERROR);
Packit db01ca
		};
Packit db01ca
		return(HPI_SHELL_OK);
Packit db01ca
	};
Packit db01ca
	ctrl = &(rdr.RdrTypeUnion.CtrlRec);
Packit db01ca
	type = ctrl->Type;
Packit db01ca
	state.Type = type;
Packit db01ca
	switch (type) {
Packit db01ca
		case SAHPI_CTRL_TYPE_DIGITAL:
Packit db01ca
			i = get_string_param(
Packit db01ca
				"New state(on|off|pulseon|pulseoff): ", buf, 9);
Packit db01ca
			if (i != 0) return(HPI_SHELL_CMD_ERROR);
Packit db01ca
			if (strcmp(buf, "on") == 0) state_val = SAHPI_CTRL_STATE_ON;
Packit db01ca
			if (strcmp(buf, "off") == 0) state_val = SAHPI_CTRL_STATE_OFF;
Packit db01ca
			if (strcmp(buf, "pulseon") == 0)
Packit db01ca
				state_val = SAHPI_CTRL_STATE_PULSE_ON;
Packit db01ca
			if (strcmp(buf, "pulseoff") == 0)
Packit db01ca
				state_val = SAHPI_CTRL_STATE_PULSE_OFF;
Packit db01ca
			state.StateUnion.Digital = state_val;
Packit db01ca
			break;
Packit db01ca
		case SAHPI_CTRL_TYPE_DISCRETE:
Packit db01ca
			i = get_int_param("Value ==> ", &res;;
Packit db01ca
			if (i != 1) {
Packit db01ca
				printf("Invalid value\n");
Packit db01ca
				return HPI_SHELL_CMD_ERROR;
Packit db01ca
			};
Packit db01ca
			state.StateUnion.Discrete = res;
Packit db01ca
			break;
Packit db01ca
		case SAHPI_CTRL_TYPE_ANALOG:
Packit db01ca
			i = get_int_param("Value ==> ", &res;;
Packit db01ca
			if (i != 1) {
Packit db01ca
				printf("Invalid value\n");
Packit db01ca
				return HPI_SHELL_CMD_ERROR;
Packit db01ca
			};
Packit db01ca
			state.StateUnion.Analog = res;
Packit db01ca
			break;
Packit db01ca
		case SAHPI_CTRL_TYPE_STREAM:
Packit db01ca
			i = get_string_param("Repeat(yes|no): ", buf, 4);
Packit db01ca
			if (i != 0) return(HPI_SHELL_CMD_ERROR);
Packit db01ca
			str = buf;
Packit db01ca
			while (*str == ' ') str++;
Packit db01ca
			if (strncmp(str, "yes", 3) == 0)
Packit db01ca
				state.StateUnion.Stream.Repeat = 1;
Packit db01ca
			i = get_string_param("Stream: ", buf, 4);
Packit db01ca
			i = strlen(buf);
Packit db01ca
			if (i > 4) i = 4;
Packit db01ca
			state.StateUnion.Stream.StreamLength = i;
Packit db01ca
			strncpy((char *)(state.StateUnion.Stream.Stream), buf, i);
Packit db01ca
			break;
Packit db01ca
		case SAHPI_CTRL_TYPE_TEXT:
Packit db01ca
			i = get_int_param("Line #: ", &res;;
Packit db01ca
			if (i != 1) {
Packit db01ca
				printf("Invalid value\n");
Packit db01ca
				return HPI_SHELL_CMD_ERROR;
Packit db01ca
			};
Packit db01ca
			state.StateUnion.Text.Line = res;
Packit db01ca
			printf("Text: ");
Packit db01ca
			i = set_text_buffer(&(state.StateUnion.Text.Text));
Packit db01ca
			if (i != 0) {
Packit db01ca
				printf("Invalid text\n");
Packit db01ca
				return(HPI_SHELL_CMD_ERROR);
Packit db01ca
			};
Packit db01ca
			break;
Packit db01ca
		case SAHPI_CTRL_TYPE_OEM:
Packit db01ca
			i = get_int_param("Manufacturer Id: ", &res;;
Packit db01ca
			if (i != 1) {
Packit db01ca
				printf("Invalid value\n");
Packit db01ca
				return HPI_SHELL_CMD_ERROR;
Packit db01ca
			};
Packit db01ca
			state.StateUnion.Oem.MId = res;
Packit db01ca
			memset(state.StateUnion.Oem.Body, 0,
Packit db01ca
				SAHPI_CTRL_MAX_OEM_BODY_LENGTH);
Packit db01ca
			i = get_hex_string_param("Oem body: ",
Packit db01ca
				(char *)(state.StateUnion.Oem.Body),
Packit db01ca
				SAHPI_CTRL_MAX_OEM_BODY_LENGTH);
Packit db01ca
			state.StateUnion.Oem.BodyLength = i;
Packit db01ca
			break;
Packit db01ca
		default:
Packit db01ca
			strcpy(buf, "Unknown control type\n");
Packit db01ca
			return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	rv = saHpiControlSet(sessionid, resourceid, num,
Packit db01ca
		SAHPI_CTRL_MODE_MANUAL, &state);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiControlSet: error: %s\n",
Packit db01ca
			oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ctrl_block_state(void)
Packit db01ca
{
Packit db01ca
	show_control_state(Domain->sessionId, ctrl_block_env.rptid,
Packit db01ca
		ctrl_block_env.rdrnum, ui_print, get_int_param);
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ctrl_block_setst(void)
Packit db01ca
{
Packit db01ca
	return(set_control_state(Domain->sessionId, ctrl_block_env.rptid,
Packit db01ca
		ctrl_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ctrl_block_show(void)
Packit db01ca
{
Packit db01ca
	show_control(Domain->sessionId, ctrl_block_env.rptid,
Packit db01ca
		ctrl_block_env.rdrnum, ui_print);
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ctrl_block(void)
Packit db01ca
{
Packit db01ca
	SaHpiRdrT		rdr_entry;
Packit db01ca
	SaHpiResourceIdT	rptid;
Packit db01ca
	SaHpiInstrumentIdT	rdrnum;
Packit db01ca
	SaHpiRdrTypeT		type;
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	char			buf[256];
Packit db01ca
	ret_code_t		ret;
Packit db01ca
	term_def_t		*term;
Packit db01ca
	int			res;
Packit db01ca
Packit db01ca
	ret = ask_rpt(&rptid);
Packit db01ca
	if (ret != HPI_SHELL_OK) return(ret);
Packit db01ca
	type = SAHPI_CTRL_RDR;
Packit db01ca
	ret = ask_rdr(rptid, type, &rdrnum);
Packit db01ca
	if (ret != HPI_SHELL_OK) return(ret);
Packit db01ca
	ctrl_block_env.rptid = rptid;
Packit db01ca
	ctrl_block_env.rdrnum = rdrnum;
Packit db01ca
	rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum,
Packit db01ca
		&rdr_entry);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv));
Packit db01ca
		printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n",
Packit db01ca
			rptid, type, rdrnum);
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	show_control(Domain->sessionId, rptid, rdrnum, ui_print);
Packit db01ca
	for (;;) {
Packit db01ca
		block_type = CTRL_COM;
Packit db01ca
		res = get_new_command("control block ==> ");
Packit db01ca
		if (res == 2) {
Packit db01ca
			unget_term();
Packit db01ca
			return HPI_SHELL_OK;
Packit db01ca
		};
Packit db01ca
		term = get_next_term();
Packit db01ca
		if (term == NULL) continue;
Packit db01ca
		snprintf(buf, 256, "%s", term->term);
Packit db01ca
		if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break;
Packit db01ca
	};
Packit db01ca
	block_type = MAIN_COM;
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
int set_text_buffer(SaHpiTextBufferT *buf)
Packit db01ca
{
Packit db01ca
	int		i, j, ind;
Packit db01ca
	char		str[SAHPI_MAX_TEXT_BUFFER_LENGTH], *str1;
Packit db01ca
	SaHpiTextTypeT	type = SAHPI_TL_TYPE_TEXT;
Packit db01ca
	SaHpiLanguageT	lang = SAHPI_LANG_ENGLISH;
Packit db01ca
Packit db01ca
	i = get_string_param("DataType(text|bcd|ascii6|bin|unicode): ", str, 10);
Packit db01ca
	if (i != 0) return(-1);
Packit db01ca
	if (strcmp(str, "text") == 0) type = SAHPI_TL_TYPE_TEXT;
Packit db01ca
	else if (strcmp(str, "bcd") == 0) type = SAHPI_TL_TYPE_BCDPLUS;
Packit db01ca
	else if (strcmp(str, "ascii6") == 0) type = SAHPI_TL_TYPE_ASCII6;
Packit db01ca
	else if (strcmp(str, "bin") == 0) type = SAHPI_TL_TYPE_BINARY;
Packit db01ca
	else if (strcmp(str, "unicode") == 0) type = SAHPI_TL_TYPE_UNICODE;
Packit db01ca
Packit db01ca
	/*
Packit db01ca
	 *   ask a language for unicode and text: Fix me
Packit db01ca
	 */
Packit db01ca
Packit db01ca
	i = get_string_param("Text: ", str, SAHPI_MAX_TEXT_BUFFER_LENGTH);
Packit db01ca
	if (i != 0) return(-1);
Packit db01ca
	buf->DataType = type;
Packit db01ca
	switch (type) {
Packit db01ca
		case SAHPI_TL_TYPE_UNICODE:
Packit db01ca
			printf("UNICODE: not implemented");
Packit db01ca
			return(-1);
Packit db01ca
		case SAHPI_TL_TYPE_BCDPLUS:
Packit db01ca
			for (i = 0; i < strlen(str); i++) {
Packit db01ca
				switch ( str[i] ) {
Packit db01ca
					case '0':
Packit db01ca
					case '1':
Packit db01ca
					case '2':
Packit db01ca
					case '3':
Packit db01ca
					case '4':
Packit db01ca
					case '5':
Packit db01ca
					case '6':
Packit db01ca
					case '7':
Packit db01ca
					case '8':
Packit db01ca
					case '9':
Packit db01ca
					case ' ':
Packit db01ca
					case '-':
Packit db01ca
					case '.':
Packit db01ca
					case ':':
Packit db01ca
					case ',':
Packit db01ca
					case '_':
Packit db01ca
						break;
Packit db01ca
					default:
Packit db01ca
						printf( "BCD+: Illegal symbol \'%c\'(0x%x)\n", str[i], str[i] );
Packit db01ca
						return -1;
Packit db01ca
				}
Packit db01ca
			}
Packit db01ca
			snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str);
Packit db01ca
			buf->DataLength = strlen(str);
Packit db01ca
			buf->Language = lang;
Packit db01ca
			break;
Packit db01ca
		case SAHPI_TL_TYPE_ASCII6:
Packit db01ca
			for (i = 0; i < strlen(str); i++) {
Packit db01ca
				if ( ( str[i] < 0x20 ) || ( str[i] > 0x5F ) ) {
Packit db01ca
					printf( "ASCII6: Illegal symbol \'%c\'(0x%x)\n", str[i], str[i] );
Packit db01ca
					return -1;
Packit db01ca
				}
Packit db01ca
			}
Packit db01ca
			snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str);
Packit db01ca
			buf->DataLength = strlen(str);
Packit db01ca
			buf->Language = lang;
Packit db01ca
			break;
Packit db01ca
		case SAHPI_TL_TYPE_TEXT:
Packit db01ca
			snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str);
Packit db01ca
			buf->DataLength = strlen(str);
Packit db01ca
			buf->Language = lang;
Packit db01ca
			break;
Packit db01ca
		case SAHPI_TL_TYPE_BINARY:
Packit db01ca
			str1 = (char *)&(buf->Data);
Packit db01ca
			ind = 0;
Packit db01ca
			for (i = 0; i < strlen(str); i++) {
Packit db01ca
				for (j = 0; j < 16; j++)
Packit db01ca
					if (hex_codes[j] == toupper(str[i])) break;
Packit db01ca
				if (j >= 16) return(-1);
Packit db01ca
				if (i % 2) str1[ind++] += j;
Packit db01ca
				else str1[ind] = j << 4;
Packit db01ca
			};
Packit db01ca
			buf->DataLength = (i + 1)/ 2;
Packit db01ca
			break;
Packit db01ca
	};
Packit db01ca
	return(0);
Packit db01ca
}
Packit db01ca
Packit db01ca
static void show_rdr_attrs(SaHpiRdrT *rdr_entry)
Packit db01ca
{
Packit db01ca
	Rdr_t			tmp_rdr;
Packit db01ca
Packit db01ca
	make_attrs_rdr(&tmp_rdr, rdr_entry);
Packit db01ca
	show_Rdr(&tmp_rdr, ui_print);
Packit db01ca
	free_attrs(&(tmp_rdr.Attrutes));
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t list_cond(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	SaHpiAnnouncementT	annon;
Packit db01ca
	SaHpiTextBufferT	buffer;
Packit db01ca
Packit db01ca
	annon.EntryId = SAHPI_FIRST_ENTRY;
Packit db01ca
	for (;;) {
Packit db01ca
		rv = saHpiAnnunciatorGetNext(Domain->sessionId, rptid, rdrnum,
Packit db01ca
			SAHPI_ALL_SEVERITIES, SAHPI_FALSE, &annon);
Packit db01ca
		if (rv != SA_OK) {
Packit db01ca
			if (rv == SA_ERR_HPI_NOT_PRESENT)
Packit db01ca
				break;
Packit db01ca
			printf("saHpiAnnunciatorGetNext error %s\n", oh_lookup_error(rv));
Packit db01ca
			return(HPI_SHELL_CMD_ERROR);
Packit db01ca
		};
Packit db01ca
		oh_decode_time(annon.Timestamp, &buffer);
Packit db01ca
		printf("   ID: %d  AddedByUser: %d  Acknowledged: %d  Time: %s  Sever: %d\n",
Packit db01ca
			annon.EntryId, annon.AddedByUser, annon.Acknowledged,
Packit db01ca
			buffer.Data, annon.Severity);
Packit db01ca
	};
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t set_acknowledge(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	char			str[32];
Packit db01ca
	int			i, all = 0;
Packit db01ca
	SaHpiSeverityT		sev = SAHPI_OK;
Packit db01ca
	SaHpiEntryIdT		entryId = 0;
Packit db01ca
Packit db01ca
	i = get_string_param("EntryId(<Id> | all): ", str, 32);
Packit db01ca
	if (i != 0) return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	if (strcmp(str, "all") == 0) all = 1;
Packit db01ca
	else entryId = atoi(str);
Packit db01ca
	if (all) {
Packit db01ca
		i = get_string_param("Severity(crit|maj|min|info|ok): ",
Packit db01ca
			str, 10);
Packit db01ca
		if (i != 0) return(HPI_SHELL_PARM_ERROR);
Packit db01ca
		if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL;
Packit db01ca
		else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR;
Packit db01ca
		else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR;
Packit db01ca
		else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL;
Packit db01ca
		else if (strcmp(str, "ok") == 0) sev = SAHPI_OK;
Packit db01ca
		else {
Packit db01ca
			printf("Invalid severity %s\n", str);
Packit db01ca
			return(HPI_SHELL_PARM_ERROR);
Packit db01ca
		};
Packit db01ca
		entryId = SAHPI_ENTRY_UNSPECIFIED;
Packit db01ca
	};
Packit db01ca
Packit db01ca
	rv = saHpiAnnunciatorAcknowledge(Domain->sessionId, rptid, rdrnum,
Packit db01ca
		entryId, sev);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiAnnunciatorAcknowledge error %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t delete_announ(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	char			str[32];
Packit db01ca
	int			i, any = 0;
Packit db01ca
	SaHpiSeverityT		sev = SAHPI_OK;
Packit db01ca
	SaHpiEntryIdT		entryId = 0;
Packit db01ca
Packit db01ca
	i = get_string_param("EntryId(<Id> | any): ", str, 32);
Packit db01ca
	if (i != 0) return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	if (strcmp(str, "any") == 0) any = 1;
Packit db01ca
	else entryId = atoi(str);
Packit db01ca
	if (any) {
Packit db01ca
		i = get_string_param("Severity(crit|maj|min|info|ok|all): ",
Packit db01ca
			str, 10);
Packit db01ca
		if (i != 0) return(-1);
Packit db01ca
		if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL;
Packit db01ca
		else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR;
Packit db01ca
		else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR;
Packit db01ca
		else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL;
Packit db01ca
		else if (strcmp(str, "ok") == 0) sev = SAHPI_OK;
Packit db01ca
		else if (strcmp(str, "all") == 0) sev = SAHPI_ALL_SEVERITIES;
Packit db01ca
		else {
Packit db01ca
			printf("Invalid severity %s\n", str);
Packit db01ca
			return(HPI_SHELL_PARM_ERROR);
Packit db01ca
		};
Packit db01ca
		entryId = SAHPI_ENTRY_UNSPECIFIED;
Packit db01ca
	};
Packit db01ca
Packit db01ca
	rv = saHpiAnnunciatorDelete(Domain->sessionId, rptid, rdrnum,
Packit db01ca
		entryId, sev);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiAnnunciatorDelete error %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
static ret_code_t add_announ(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	char			str[32];
Packit db01ca
	int			i;
Packit db01ca
	SaHpiSeverityT		sev = SAHPI_OK;
Packit db01ca
	SaHpiAnnouncementT	announ;
Packit db01ca
	SaHpiStatusCondTypeT	type = SAHPI_STATUS_COND_TYPE_SENSOR;
Packit db01ca
	SaHpiDomainIdT		did;
Packit db01ca
	SaHpiResourceIdT	resId;
Packit db01ca
	SaHpiSensorNumT		sennum = 0;
Packit db01ca
Packit db01ca
	memset(&announ, 0, sizeof(SaHpiAnnouncementT));
Packit db01ca
	i = get_string_param("Severity(crit|maj|min|info|ok): ",
Packit db01ca
		str, 10);
Packit db01ca
	if (i != 0) return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL;
Packit db01ca
	else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR;
Packit db01ca
	else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR;
Packit db01ca
	else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL;
Packit db01ca
	else if (strcmp(str, "ok") == 0) sev = SAHPI_OK;
Packit db01ca
	else {
Packit db01ca
		printf("Invalid severity %s\n", str);
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	announ.Severity = sev;
Packit db01ca
Packit db01ca
	i = get_string_param("Condition Type(sensor|res|oem|user): ",
Packit db01ca
		str, 10);
Packit db01ca
	if (i != 0) return(-1);
Packit db01ca
	if (strcmp(str, "sensor") == 0) type = SAHPI_STATUS_COND_TYPE_SENSOR;
Packit db01ca
	else if (strcmp(str, "res") == 0) type = SAHPI_STATUS_COND_TYPE_RESOURCE;
Packit db01ca
	else if (strcmp(str, "oem") == 0) type = SAHPI_STATUS_COND_TYPE_OEM;
Packit db01ca
	else if (strcmp(str, "user") == 0) type = SAHPI_STATUS_COND_TYPE_USER;
Packit db01ca
	else {
Packit db01ca
		printf("Invalid Condition Type %s\n", str);
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	announ.StatusCond.Type = type;
Packit db01ca
	// EntityPath:  is needed ???
Packit db01ca
	// oh_encode_entitypath(char *str, SaHpiEntityPathT *ep);   convert string into ep.
Packit db01ca
Packit db01ca
	i = get_int_param("DomainId: ", (int *)&did;;
Packit db01ca
	if (i != 1) did = SAHPI_UNSPECIFIED_DOMAIN_ID;
Packit db01ca
	announ.StatusCond.DomainId = did;
Packit db01ca
Packit db01ca
	i = get_int_param("ResourceId: ", (int *)&resId);
Packit db01ca
	if (i != 1) resId = SAHPI_UNSPECIFIED_RESOURCE_ID;
Packit db01ca
	announ.StatusCond.ResourceId = resId;
Packit db01ca
Packit db01ca
	i = get_int_param("Sensor number: ", (int *)&sennum);
Packit db01ca
	announ.StatusCond.SensorNum = sennum;
Packit db01ca
Packit db01ca
	rv = saHpiAnnunciatorAdd(Domain->sessionId, rptid, rdrnum, &announ);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiAnnunciatorAdd error %s\n", oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
static void show_cond(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum, int num)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	SaHpiAnnouncementT	announ;
Packit db01ca
	SaHpiTextBufferT	buffer;
Packit db01ca
	SaHpiConditionT		*cond;
Packit db01ca
	char			*str;
Packit db01ca
	oh_big_textbuffer	tmpbuf;
Packit db01ca
Packit db01ca
	rv = saHpiAnnunciatorGet(Domain->sessionId, rptid, rdrnum, num, &announ);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("Can not find Announcement: %d\n", num);
Packit db01ca
		return;
Packit db01ca
	};
Packit db01ca
	oh_decode_time(announ.Timestamp, &buffer);
Packit db01ca
	printf("   ID: %d  AddedByUser: %d  Acknowledged: %d  Time: %s  Sever: %d\n",
Packit db01ca
		announ.EntryId, announ.AddedByUser, announ.Acknowledged,
Packit db01ca
		buffer.Data, announ.Severity);
Packit db01ca
	cond = &(announ.StatusCond);
Packit db01ca
	switch (cond->Type) {
Packit db01ca
		case SAHPI_STATUS_COND_TYPE_SENSOR:	str = "SENSOR"; break;
Packit db01ca
		case SAHPI_STATUS_COND_TYPE_RESOURCE:	str = "RESOURCE"; break;
Packit db01ca
		case SAHPI_STATUS_COND_TYPE_OEM:	str = "OEM"; break;
Packit db01ca
		case SAHPI_STATUS_COND_TYPE_USER:	str = "USER"; break;
Packit db01ca
		default: str = "UNKNOWN"; break;
Packit db01ca
	};
Packit db01ca
	printf("      Condition: Type = %s   DomainId = %d  ResId %d  SensorNum = %d\n",
Packit db01ca
		str, cond->DomainId, cond->ResourceId, cond->SensorNum);
Packit db01ca
	oh_decode_entitypath(&(cond->Entity), &tmpbuf);
Packit db01ca
	printf("                 EPath = %s\n", tmpbuf.Data);
Packit db01ca
	printf("                 Mid = %d  EventState = %x\n", cond->Mid, cond->EventState);
Packit db01ca
	printf("                 Name = %s  Data = %s\n", cond->Name.Value, cond->Data.Data);
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block_acknow(void)
Packit db01ca
{
Packit db01ca
	return(set_acknowledge(ann_block_env.rptid, ann_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block_list(void)
Packit db01ca
{
Packit db01ca
	return(list_cond(ann_block_env.rptid, ann_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block_add(void)
Packit db01ca
{
Packit db01ca
	return(add_announ(ann_block_env.rptid, ann_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block_delete(void)
Packit db01ca
{
Packit db01ca
	return(delete_announ(ann_block_env.rptid, ann_block_env.rdrnum));
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block_modeget(void)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	SaHpiAnnunciatorModeT	mode;
Packit db01ca
	char			*str;
Packit db01ca
Packit db01ca
	rv = saHpiAnnunciatorModeGet(Domain->sessionId, ann_block_env.rptid,
Packit db01ca
		ann_block_env.rdrnum, &mode);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiAnnunciatorModeGet error %s\n",
Packit db01ca
			oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	switch (mode) {
Packit db01ca
		case SAHPI_ANNUNCIATOR_MODE_AUTO:
Packit db01ca
			str = "AUTO"; break;
Packit db01ca
		case SAHPI_ANNUNCIATOR_MODE_USER:
Packit db01ca
			str = "USER"; break;
Packit db01ca
		case SAHPI_ANNUNCIATOR_MODE_SHARED:
Packit db01ca
			str = "SHARED"; break;
Packit db01ca
		default: str = "Unknown"; break;
Packit db01ca
	};
Packit db01ca
	printf("Annunciator Mode: %s\n", str);
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block_modeset(void)
Packit db01ca
{
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	SaHpiAnnunciatorModeT	mode;
Packit db01ca
	char			buf[256];
Packit db01ca
	int			res;
Packit db01ca
Packit db01ca
	res = get_string_param("Mode(auto|user|shared): ", buf, 10);
Packit db01ca
	if (res != 0) {
Packit db01ca
		printf("Invalid mode: %s\n", buf);
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	if (strcmp(buf, "auto") == 0)
Packit db01ca
		mode = SAHPI_ANNUNCIATOR_MODE_AUTO;
Packit db01ca
	else if (strcmp(buf, "user") == 0)
Packit db01ca
		mode = SAHPI_ANNUNCIATOR_MODE_USER;
Packit db01ca
	else if (strcmp(buf, "shared") == 0)
Packit db01ca
		mode = SAHPI_ANNUNCIATOR_MODE_SHARED;
Packit db01ca
	else {
Packit db01ca
		printf("Invalid mode: %s\n", buf);
Packit db01ca
		return(HPI_SHELL_PARM_ERROR);
Packit db01ca
	};
Packit db01ca
	rv = saHpiAnnunciatorModeSet(Domain->sessionId, ann_block_env.rptid,
Packit db01ca
		ann_block_env.rdrnum, mode);
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiAnnunciatorModeSet error %s\n",
Packit db01ca
			oh_lookup_error(rv));
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block_show(void)
Packit db01ca
{
Packit db01ca
	term_def_t		*term;
Packit db01ca
	int			res, val;
Packit db01ca
Packit db01ca
	term = get_next_term();
Packit db01ca
	if (term == NULL) {
Packit db01ca
		show_rdr_attrs(&(ann_block_env.rdr_entry));
Packit db01ca
		return(HPI_SHELL_OK);
Packit db01ca
	};
Packit db01ca
	unget_term();
Packit db01ca
	res = get_int_param(" ", &val;;
Packit db01ca
	if (res != 1) unget_term();
Packit db01ca
	else show_cond(ann_block_env.rptid, ann_block_env.rdrnum, val);
Packit db01ca
	return(HPI_SHELL_OK);
Packit db01ca
}
Packit db01ca
Packit db01ca
ret_code_t ann_block(void)
Packit db01ca
{
Packit db01ca
	SaHpiResourceIdT	rptid;
Packit db01ca
	SaHpiInstrumentIdT	rdrnum;
Packit db01ca
	SaHpiRdrTypeT		type;
Packit db01ca
	SaErrorT		rv;
Packit db01ca
	char			buf[256];
Packit db01ca
	ret_code_t		ret;
Packit db01ca
	term_def_t		*term;
Packit db01ca
	int			res;
Packit db01ca
Packit db01ca
	ret = ask_rpt(&rptid);
Packit db01ca
	if (ret != HPI_SHELL_OK) return(ret);
Packit db01ca
	type = SAHPI_ANNUNCIATOR_RDR;
Packit db01ca
	ret = ask_rdr(rptid, type, &rdrnum);
Packit db01ca
	if (ret != HPI_SHELL_OK) return(ret);
Packit db01ca
	rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum,
Packit db01ca
		&(ann_block_env.rdr_entry));
Packit db01ca
	if (rv != SA_OK) {
Packit db01ca
		printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv));
Packit db01ca
		printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n",
Packit db01ca
			rptid, type, rdrnum);
Packit db01ca
		return(HPI_SHELL_CMD_ERROR);
Packit db01ca
	};
Packit db01ca
	ann_block_env.rptid = rptid;
Packit db01ca
	ann_block_env.rdrnum = rdrnum;
Packit db01ca
	show_rdr_attrs(&(ann_block_env.rdr_entry));
Packit db01ca
	for (;;) {
Packit db01ca
		block_type = ANN_COM;
Packit db01ca
		res = get_new_command("annunciator block ==> ");
Packit db01ca
		if (res == 2) {
Packit db01ca
			unget_term();
Packit db01ca
			block_type = MAIN_COM;
Packit db01ca
			return HPI_SHELL_OK;
Packit db01ca
		};
Packit db01ca
		term = get_next_term();
Packit db01ca
		if (term == NULL) continue;
Packit db01ca
		snprintf(buf, 256, "%s", term->term);
Packit db01ca
		if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break;
Packit db01ca
	};
Packit db01ca
	block_type = MAIN_COM;
Packit db01ca
	return HPI_SHELL_OK;
Packit db01ca
}