#include <stdio.h>
#include "/prg/prglib.h"
#define N 5 /* количество управляющих физических
параметров в данной задаче */
#define M 20 /* количество значений управляющих физических
параметров в данной задаче */
unsigned short int pp_value[N][2]; /* семафоры результата и семафоры управления
управляющих физических параметров */
short int pp_id=0; /* идентификатор PASSPORT-таблицы описания управляющих
физических параметров */
short int pd_id=0; /* идентификатор DATA-таблиц значений управляющих
физических параметров */
unsigned char pd_value[M][N]; /* значения управляющих физических параметров
типа "статус" */
/*****************************************************************************
функция выполняет чтение семафоров управляющих физических параметров и
определяет команду пользователя
*/
int Test_Command(unsigned short int *cmd)
{
int i;
/* чтение семафоров управляющих физических параметров */
prg_tcoord[0]=prg_tcoord[1]=1;
prg_tcoord[2]=1; prg_tcoord[3]=N;
prg_tcoord[4]=1; prg_tcoord[5]=2; prg_tcoord[6]=1;
if ((prg_err=PrgDBa_rw(0,pp_value,4*N,prg_tcoord,&pp_id))!=0) return 1;
/* определение команды пользователя из семафоров управления */
for (i=0; i<N; i++) if ((*cmd=pp_value[i][1])!=CMD_NOTHING) break;
return 0;
}
/*****************************************************************************
функция выполняет запись результата выполнения алгоритма управления в
семафоры управляющих физических параметров:
семафор результата: код ошибки,
семафор управления: 0
*/
int Test_Result(unsigned short int code)
{
int i;
/* формирование семафоров результата и семафоров управления физических параметров */
for (i=0; i<N; i++) PrgSem_SetResult(code,&pp_value[i][0],&pp_value[i][1]);
/* запись семафоров результата и семафоров управления физических параметров в таблицу */
prg_tcoord[2]=1; prg_tcoord[3]=N;
prg_tcoord[4]=1; prg_tcoord[5]=2; prg_tcoord[6]=1;
prg_tcoord[0]=prg_tcoord[1]=1;
if ((prg_err=PrgDBa_rw(1,pp_value,N*2*sizeof(short int),prg_tcoord,&pp_id))!=0) return 1;
return 0;
}
/*****************************************************************************
функция будет вызвана для выполнения командs "новые данные",
т.е. при выполнении пользователем:
1) редактирования физических параметров
2) чтения физических параметров из архива:
функция выполняет:
a) чтение новых значений физических параметров, введенных пользователем
или прочитанных Диалоговой Программой из архива с номером narc
b) в этой задаче - выделение цветом при выводе статусных перменных
с) запись этих значений в "горячую копию"
*/
int Test_Edit(void)
{
int i, j;
/* чтение новых значений физических параметров,
введенных пользователем */
prg_tcoord[0]=prg_tcoord[1]=2;
prg_tcoord[2]=1; prg_tcoord[3]=M;
prg_tcoord[4]=1; prg_tcoord[5]=N; prg_tcoord[6]=1;
if ((prg_err=PrgDBa_rw(0,pd_value,N*M*sizeof(char),prg_tcoord,&pd_id))!=0) return 1;
/* выделить цветом при выводе, если значение параметра равно 0 */
for (i=0; i<M;i++)
for (j=0; j<N; j++)
if (!(pd_value[i][j] & ~PRG_COLOR_VAR))
pd_value[i][j] |= PRG_COLOR_VAR;
else pd_value[i][j] &=~PRG_COLOR_VAR;
/* запись значений физических параметров в "горячую копию" */
prg_tcoord[0]=prg_tcoord[1]=1;
if ((prg_err=PrgDBa_rw(1,pd_value,N*M*sizeof(char),prg_tcoord,&pd_id))!=0) return 1;
return 0;
}
/*****************************************************************************
функция выполняет инициализацию физических и технологических параметров задачи:
открытие соответствующих таблиц в Глобальной БД ССУДА
*/
int Test_Ini(int narg, char *sarg[])
{
int i;
char tname[TBL_LEN_TABLE];
/* инициализация семафоров физических параметров */
for (i=0; i<N; i++) { pp_value[i][0]=pp_value[i][1]=0; }
/* открытие PASSPORT-таблицы физических параметров */
if ((prg_err=PrgDBa_open(&pp_id,"B_PP_TEST"))!=0) return 1;
/* открытие DATA-таблицы физических параметров */
if ((prg_err=PrgDBa_open(&pd_id,"B_PD_TEST"))!=0) return 1;
return 0;
}
/*****************************************************************************
функция выполняет действия, завершающие работу ПП:
закрытие таблиц в Глобальной БД ССУДА
*/
void Test_End(void)
{
PrgDBa_closeAll();
}
/*****************************************************************************
main-функция управляющей ПП СУ
*/
int main(int narg, char *sarg[])
{
return
PrgCntr_Make(narg, sarg,
Test_Ini, Test_Command, Test_Result,
Test_Edit, NULL, NULL, NULL, NULL, NULL, NULL,
Test_End, 0);
}
|