Example #1
0
//显示温度
//pDst_Buf目标显示缓冲
//Area_No分区
//X、Y为显示坐标
//Temp为温度,小数为1位
//
void Show_Temp(S_Show_Data *pDst_Buf, INT8U Area_No, INT16U X, INT16U Y, INT16S Temp, INT8U Type, INT8U Font, INT8U Color)
{
    char const *p;
    INT8U d; //i为整数部分,d为小数部分
    INT8U i;
    //INT16U uTemp;
    
    if(Temp >= 0)
    {
      if(Type >= S_NUM(TempStr0))
        return;
     
      p = TempStr0[Type].str;
      d = Temp % 10;
      i = Temp / 10;
    }
    else
    {
      if(Type >= S_NUM(TempStr1))
        return;
      
      p = TempStr1[Type].str;
      d = (0 - Temp)% 10;
      i = (0 - Temp)/ 10;
    }
    
    if(Type EQ 0 || Type EQ 2)
      LED_Print(Font, Color, pDst_Buf, Area_No, X, Y, p, i,d);
    else if(Type EQ 1 || Type EQ 3)
      LED_Print(Font, Color, pDst_Buf, Area_No, X, Y, p, i);
}
Example #2
0
int add_shop(struct shop_data *nshp)
{
  shop_rnum rshop;
  int found = 0;
  zone_rnum rznum = real_zone_by_thing(S_NUM(nshp));

  /*
   * The shop already exists, just update it.
   */
  if ((rshop = real_shop(S_NUM(nshp))) != NOWHERE) {
    free_shop_strings(&shop_index[rshop]);
    copy_shop(&shop_index[rshop], nshp);
    if (rznum != NOWHERE)
      add_to_save_list(zone_table[rznum].number, SL_SHP);
    else
      mudlog("SYSERR: GenOLC: Cannot determine shop zone.", BRF, LVL_BUILDER, TRUE);
    return rshop;
  }

  top_shop++;
  RECREATE(shop_index, struct shop_data, top_shop + 1);

  for (rshop = top_shop; rshop > 0; rshop--) {
    if (nshp->vnum > SHOP_NUM(rshop - 1)) {
      found = rshop;

      /* Make a "nofree" variant and remove these later. */
      shop_index[rshop].in_room = NULL;
      shop_index[rshop].producing = NULL;
      shop_index[rshop].type = NULL;

      copy_shop(&shop_index[rshop], nshp);
      break;
    }
    shop_index[rshop] = shop_index[rshop - 1];
  }

  if (!found) {
    /* Make a "nofree" variant and remove these later. */
    shop_index[rshop].in_room = NULL;
    shop_index[rshop].producing = NULL;
    shop_index[rshop].type = NULL;

    copy_shop(&shop_index[0], nshp);
  }

  if (rznum != NOWHERE)
    add_to_save_list(zone_table[rznum].number, SL_SHP);
  else
    mudlog("SYSERR: GenOLC: Cannot determine shop zone.", BRF, LVL_BUILDER, TRUE);

  return rshop;
}
Example #3
0
//设置除校表参数意外的所有参数
//校表参数如果无法读出,也会置成默认参数
void Set_Def_Para_Except_Adj()
{
  INT16U i,j,Len;
  INT8U Temp[10];
  
  Disp_Info("SET PArA");
  for(i=0;i<S_NUM(Def_Para);i++)
  {
    if(Check_Meter_Factory_Status() EQ 0)//当前不是工厂状态则推出
      return;
    
    Len=Get_Storage_Data_Len(Def_Para[i].SDI);
    
    for(j=0;j<Def_Para[i].Num;j++)
    {
      if(Check_Meter_Factory_Status() EQ 0)
        return;  
  
      //如果是校表参数则不置默认
      if(!((Def_Para[i].SDI + j >= _SDI_ADJ_METER_PARA_STATUS && Def_Para[i].SDI + j <= _SDI_ADJ_METER_C_CUR) || \
            Def_Para[i].SDI + j EQ SDI_ACTIVE_CONST || Def_Para[i].SDI + j EQ SDI_REACTIVE_CONST))
        Write_Storage_Data(Def_Para[i].SDI + j,(void *)(Def_Para[i].pPara + j*Len),Len);
      else
      {
        //校表参数,先看能否读出,不能读出则置默认
        if(Read_Storage_Data_Fix_Len(Def_Para[i].SDI + j, 0, Len, Temp, Temp, sizeof(Temp)) EQ 0)
          Write_Storage_Data(Def_Para[i].SDI + j, (void *)(Def_Para[i].pPara + j*Len),Len);      
      }
    }
  }  
}
Example #4
0
//写一条默认参数,参数标识为DI
void Write_One_Def_Para(STORA_DI SDI)
{
  INT16U i;
  INT16U Len;

  TRACE();

  if(Check_Meter_Factory_Status() EQ 0)//当前不是工厂状态则推出
  {
    Debug_Print("Write Def Para failed! not in factory status!");
    return;
  }

  for(i = 0; i < S_NUM(Def_Para); i++)
  {
    if(SDI >= Def_Para[i].SDI && SDI < Def_Para[i].SDI + Def_Para[i].Num)
    {
      if(Check_Meter_Factory_Status() EQ 0)//当前不是工厂状态则推出
        return;
      Len = Get_Storage_Data_Len(Def_Para[i].SDI);
      Write_Storage_Data(SDI, (void *) (Def_Para[i].pPara + (SDI - Def_Para[i].SDI) * Len), Len);
      return;
    }
  }
}
Example #5
0
//获取温度显示的像素宽度
INT16U Get_TempStr_Pix_Width(INT8U Type, INT8U Font)
{
  if(Type < S_NUM(TempStr0)) //TempStr0和TempStr1的宽度是一样的
   return TempStr0[Type].Len*Get_Font_Width(Font);
  else
    return 0;
}
Example #6
0
void copy_shop(struct shop_data *tshop, struct shop_data *fshop)
{
  /*
   * Copy basic information over.
   */
  S_NUM(tshop) = S_NUM(fshop);
  S_KEEPER(tshop) = S_KEEPER(fshop);
  S_OPEN1(tshop) = S_OPEN1(fshop);
  S_CLOSE1(tshop) = S_CLOSE1(fshop);
  S_OPEN2(tshop) = S_OPEN2(fshop);
  S_CLOSE2(tshop) = S_CLOSE2(fshop);
  S_BANK(tshop) = S_BANK(fshop);
  S_BROKE_TEMPER(tshop) = S_BROKE_TEMPER(fshop);
  S_BITVECTOR(tshop) = S_BITVECTOR(fshop);
  S_NOTRADE(tshop) = S_NOTRADE(fshop);
  S_SORT(tshop) = S_SORT(fshop);
  S_BUYPROFIT(tshop) = S_BUYPROFIT(fshop);
  S_SELLPROFIT(tshop) = S_SELLPROFIT(fshop);
  S_FUNC(tshop) = S_FUNC(fshop);

  /*
   * Copy lists over.
   */
  copy_list(&(S_ROOMS(tshop)), S_ROOMS(fshop));
  copy_list(&(S_PRODUCTS(tshop)), S_PRODUCTS(fshop));
  copy_type_list(&(tshop->type), fshop->type);

  /*
   * Copy notification strings over.
   */
  free_shop_strings(tshop);
  S_NOITEM1(tshop) = str_dup(S_NOITEM1(fshop));
  S_NOITEM2(tshop) = str_dup(S_NOITEM2(fshop));
  S_NOCASH1(tshop) = str_dup(S_NOCASH1(fshop));
  S_NOCASH2(tshop) = str_dup(S_NOCASH2(fshop));
  S_NOBUY(tshop) = str_dup(S_NOBUY(fshop));
  S_BUY(tshop) = str_dup(S_BUY(fshop));
  S_SELL(tshop) = str_dup(S_SELL(fshop));
  S_PROPRIETARIO(tshop) = S_PROPRIETARIO(fshop);
  S_CLAN(tshop) = S_CLAN(fshop);
  S_VALORE(tshop) = S_VALORE(fshop);
  S_VALORE1(tshop) = S_VALORE1(fshop);
  S_VALORE2(tshop) = S_VALORE2(fshop);
  S_VALORE3(tshop) = S_VALORE3(fshop);
  S_VALORE4(tshop) = S_VALORE4(fshop);
  S_VALORE5(tshop) = S_VALORE5(fshop);
}
Example #7
0
//資函晩豚�幣議�殆錐業
INT16U Get_DateStr_Pix_Width(INT8U Type, INT8U Font)
{
    if(Type >= S_NUM(DateStr))
    {
        ASSERT_FAILED();
        Type = 0;
    }
  return DateStr[Type].Len*Get_Font_Width(Font);
}
Example #8
0
//資函佛豚�幣議�殆錐業
INT16U Get_WeekStr_Pix_Width(INT8U Type, INT8U Font, INT8U Week)
{
    if(Type >= S_NUM(WeekStr))
    {
        ASSERT_FAILED();
        Type = 0;
    }
  return strlen(WeekStr[Type][Week])*Get_Font_Width(Font);
}
Example #9
0
//�幣佛豚議忖憲堪
void Show_Week(S_Show_Data *pDst_Buf, INT8U Area_No, INT16U X, INT16U Y, S_Time *pTime, INT8U Language, INT8U Font, INT8U Color)
{
    INT8U Week;

    if(Language >= S_NUM(WeekStr))
    {
      Language = 0;
      ASSERT_FAILED();
    }

    Week = pTime->Time[T_WEEK];
    if(Week >= 7)
        Week = 0;
    LED_Print(Font, Color, pDst_Buf, Area_No, X, Y, "%s", WeekStr[Language][Week]);
}
Example #10
0
//计算默认参数的校验和,该校验和只取每项的SDI和NUM
//因此修改默认参数的内容不会导致CS变化,增加或者减少默认参数则会导致CS变化
INT32U Get_Def_Para_Info_CS()
{
  INT16U i, Len;
  INT32U CS;
   
  CS = 0;
  for(i = 0; i < S_NUM(Def_Para); i ++)
  {
    CS += Def_Para[i].SDI + Def_Para[i].Num;
    Len = Get_Storage_Data_Len(Def_Para[i].SDI); 
    CS += Sum_4Bytes((INT8U *)Def_Para[i].pPara, Len * Def_Para[i].Num);
  }
  //OS_Set_Sum((INT8U *)Def_Para, sizeof(Def_Para), &CS, sizeof(CS), &CS, sizeof(CS)); 
  return CS;
}
Example #11
0
//检查某个参数项是否有默认参数,有则返回1,否则返回0
INT8U Check_Def_Para(STORA_DI SDI)
{
  INT16U i;

  TRACE();

  for(i = 0; i < S_NUM(Def_Para); i++)
  {
    if(SDI >= Def_Para[i].SDI && SDI < Def_Para[i].SDI + Def_Para[i].Num)
    {
      return 1;
    }
  }  
  return 0;
}
Example #12
0
//读数据项DI的默认参数
INT16U Read_Def_Para(STORA_DI SDI, void* pDst, INT16U Len, void* pDst_Start, INT16U DstLen)
{
  INT16U i;

  TRACE();

  for(i = 0; i < S_NUM(Def_Para); i++)
  {
    if(SDI EQ Def_Para[i].SDI || \
       (SDI > Def_Para[i].SDI && SDI < Def_Para[i].SDI + Def_Para[i].Num))
    {
      mem_cpy(pDst, (INT8U *) Def_Para[i].pPara + (SDI - Def_Para[i].SDI) * Len, Len, pDst_Start, DstLen);
      return Len;
    }
  }
  return 0;
}
Example #13
0
//資函蝶倖囂冱議佛豚忖憲堪議恷寄�殆錐業
INT16U Get_WeekStr_Type_Max_Pix_Width(INT8U Type, INT8U Font)
{
    INT16U max = 0;
	INT8U i;

    if(Type >= S_NUM(WeekStr))
    {
        ASSERT_FAILED();
        Type = 0;
    }

    for(i=0; i < 7; i ++)
    {
      if(strlen(WeekStr[Type][i]) > max)
          max = strlen(WeekStr[Type][i]);
    }

    return max*Get_Font_Width(Font);
}
//-----------------------------------------------------------------------------
//得到明文+mac 对esam进行设置 ,pSrc为从数据标示开始的数据,  SrcLen为数据长度 即 645帧中L字段的值
//不需要告诉黄工  修改esam参数, 
INT8U Set_Esam_Para(  INT8U *pSrc, INT8U SrcLen)
{//一类数据修改
        INT8U DataPdi[4];
        INT8U i,j;
        INT16U Temp;
  
	struct Far_Deal_Para_Flag_T1  Far_Deal_Para_Flag_T1;
	struct Far_645_Frame_T1   Far_645_Frame_T1;
        // 
        //查看 身份认证有效时间有没有到
        Far_Identity_Auth_Ok_Flag=!Chk_Pay_Time_Arrive();
        if(Far_Identity_Auth_Ok_Flag != 1)
        {
           Reset_Pay_Timer(0);
           ASSERT_FAILED();
           return 0;
        }
        //        
        CPU_ESAM_CARD_Control(ESAM);
        if( Select_Directry(0,0x3F,0) != OK )
        {
            ASSERT_FAILED();
            Card_Error_State.CardErrorState.CPU_CARD_ESAM_ATR_ERR=1;
            return 0;
        }
        
	if(FarPrePayment.ID_Ins_Counter >=15 )
        {    
             ASSERT_FAILED();
             return 0;
        }
        
        mem_cpy(DataPdi,pSrc,4,DataPdi,4);
        
        mem_cpy(&Far_645_Frame_T1,pSrc+4,sizeof(Far_645_Frame_T1),&Far_645_Frame_T1,sizeof(Far_645_Frame_T1)); 

	for( i=0;i<S_NUM(Far_Deal_Para_List_T1);i++ )
        {
                if(memcmp(&Far_Deal_Para_List_T1[i].Data_ID[0],&DataPdi[0],4) EQ 0 )
                {
                   break;
                }        
	}
	if( i EQ S_NUM(Far_Deal_Para_List_T1))
        {
            ASSERT_FAILED();
            return 0;
        }
        //长度不对 //  SrcLen  应该 和 数据实际长度,+4字节mac  +12 字节 数据标示,密码,操作者代码,   相等
	if( SrcLen != (Far_Deal_Para_List_T1[i].Esam_Length+16) )
        {
            ASSERT_FAILED();
            return 0;		
        }
        ///////
	for( j=0;j<LENGTH_FAR_DEAL_PARA_FLAG_T1;j++ )
		*(((INT8U *)(&Far_Deal_Para_Flag_T1))+j) = *(((const INT8U *)&Far_Deal_Para_List_T1[i])+j);
        //检查数据合法性因为多了4个字节mac  所以这里要减去4
        if( Set_Data_Format_Check(pSrc,SrcLen-4, &Temp) )
        {
            ASSERT_FAILED();
            return 0;  
        }
	if(Far_Write_Esam(0x04,Update_Binary,0x80+Far_Deal_Para_Flag_T1.Esam_File,
			(INT8U)Far_Deal_Para_Flag_T1.Esam_Offset,
			Far_Deal_Para_Flag_T1.Esam_Length,
			pSrc+LENGTH_FAR_645_FRAME_T1+4,0)!=OK)//这里为偏移16个字节即实际数据为N1N2...Nm
	{
            FarPrePayment.Far_Error_State.CpuCardInternlAuthenticationErr=1; //这里的赋值没有任何意义
            ReNew_Err_Code(DIS_CERTI_ERR);
            ASSERT_FAILED();
            return 0;
	}
	return 1;
}
//-----------------------------------------------------------------------------
//写数据时的esam权限判断和密文解密
//pSrc表示通信协议中的lc字段后面的数据
//SrcLen表示lc 字段的值
//pDst存放解密后的数据 , ,不要管数据标示之类的东西,
//pDst_Start目标缓冲起始地址
//DstLen 告诉黄工 解密后的数据长度,
//返回值 权限正确且解密成功返回1,否则返回0
//注意:该函数传入的pSrc和pDst可能是同一地址。
INT8U  Esam_Auth_Check(  INT8U *pSrc, INT16U SrcLen, INT8U * DstLen)
{//二类数据修改
        INT8U i,j,Block_Flag;
	//INT8U Length; 
        INT8U DataPdi[4];
	struct Far_Deal_Para_Flag_T2  Far_Deal_Para_Flag_T2;
	//struct Far_645_Frame_T2    Far_645_Frame_T2;
	INT8U ID_a,ID_b,ID_c,ID_d;
        
        CPU_ESAM_CARD_Control(ESAM);
        if( Select_Directry(0,0x3F,0) != OK )
        {
            ASSERT_FAILED();
            Card_Error_State.CardErrorState.CPU_CARD_ESAM_ATR_ERR=1;
            return 0;
        }
        //查看 身份认证有效时间有没有到
        Far_Identity_Auth_Ok_Flag=!Chk_Pay_Time_Arrive();
        //  身份验证没通过,不允许操作
        if(Far_Identity_Auth_Ok_Flag != 1)
        {
            Reset_Pay_Timer(0);
            ASSERT_FAILED();
            return 0;
        }

	if( FarPrePayment.ID_Ins_Counter >=15 )
        {
              ASSERT_FAILED();
              return 0;
        }
        
        mem_cpy(DataPdi,pSrc,4,DataPdi,4);
                
	//Far_645_Frame_T2 = (struct Far_645_Frame_T2  *)(pSrc+4);
	ID_a = *(DataPdi+3 );
	ID_b = *(DataPdi+2 );
	ID_c = *(DataPdi+1 );
	ID_d = *(DataPdi+0 );
	Block_Flag = 0x00;
	for( i=0;i<S_NUM(Far_Deal_Para_List_T2);i++ ){
              if(memcmp(&Far_Deal_Para_List_T2[i].Data_ID[0],&DataPdi[0],4) EQ 0 ){
                   break;
              }    
	}
	if( i  EQ  S_NUM(Far_Deal_Para_List_T2) ){
		Far_Deal_Para_Flag_T2.Source_Length = 16;
		Far_Deal_Para_Flag_T2.Data_ID[0] = *(DataPdi+0 );
		Far_Deal_Para_Flag_T2.Data_ID[1] = *(DataPdi+1 );
		Far_Deal_Para_Flag_T2.Data_ID[2] = *(DataPdi+2 );
		Far_Deal_Para_Flag_T2.Data_ID[3] = *(DataPdi+3 );
//		if( ( *(ID_Point+0 )>=1 && *(ID_Point+0 )<=8 ) && (*(ID_Point+1 )==0) && ((*(ID_Point+2 )==1) || (*(ID_Point+2 )==2)) )
//			Far_Deal_Para_Flag_T2.TX_Length = 3;
                //04   03  00 01~~fe
		if( ( *(DataPdi+0 )>=1 && *(DataPdi+0 )<=0xFE ) && (*(DataPdi+1 )==0) && (*(DataPdi+2 )==3)  )
			Far_Deal_Para_Flag_T2.TX_Length = 4;
                //04 06 03~~00 05~~00
		else if( ( *(DataPdi+0 )<=0x05 ) && (*(DataPdi+1 )<=3) && (*(DataPdi+2 )==6)  )
			Far_Deal_Para_Flag_T2.TX_Length = 4;
                 // 0x04010000~0x04010008                  0x04020000~0x04020008
		else if(   ID_a==0x04 &&  ( ID_b>=0x01 || ID_b<=0x02 ) && ID_c==0x00 && ID_d<=0x08 ){
			Block_Flag = 0xFF;
			Far_Deal_Para_Flag_T2.TX_Length = 42;
			Far_Deal_Para_Flag_T2.Source_Length = 48;
		}else{
                   ASSERT_FAILED();
                   return 0;
                }	
	}
	else{
		for( j=0;j<LENGTH_FAR_DEAL_PARA_FLAG_T2;j++ )
			*(((INT8U *)(&Far_Deal_Para_Flag_T2))+j) = *(((const INT8U *)&Far_Deal_Para_List_T2[i])+j);
	}
	//645协议中定义的 L字段的长度 ,应该 和 表中的定义的密文的长度 + 4 字节mac + 12字节 数据标示,密码,操作者代码 相等
	//if(  SrcLen  != (Far_Deal_Para_Flag_T2.Source_Length+16) )
        //{
         //  ASSERT_FAILED();
          // return 0;		
        //}	
        Far_Deal_Para_Flag_T2.Source_Length = SrcLen-16;
 	i = *(DataPdi+2 );
	i%=5;
	j = Data_ID_Offset[i];
        //把N1N2....Nm 写到esam中去
	if( Far_Write_Esam(0x04,Update_Binary,0x80+j,0x00,Far_Deal_Para_Flag_T2.Source_Length,pSrc+LENGTH_FAR_645_FRAME_T2+4,0)!=OK)
        {
                 FarPrePayment.Far_Error_State.CpuCardInternlAuthenticationErr=1; //这里的赋值没有任何意义
                 ReNew_Err_Code(DIS_CERTI_ERR);
		 ASSERT_FAILED();
                 return 0;  
	}
        //读出长度
	if( Read(0x00, Read_Binary, 0x80+j, 0x00, 1) != OK )
        {
           ASSERT_FAILED();
           return ERR;
        }
	Far_Deal_Para_Flag_T2.TX_Length = receive_send_buffer[0]-4;
       
	if( Read(0x00, Read_Binary, 0x80+j, 0x00, Far_Deal_Para_Flag_T2.TX_Length+5) != OK )
        {
           ASSERT_FAILED();
           return ERR;
        }
        //判断是否数据标示正确
	Reverse_data(receive_send_buffer+1,4);
	if( My_Memcmp(receive_send_buffer+1,Far_Deal_Para_Flag_T2.Data_ID,4) != 0 )
        {
          ASSERT_FAILED();
          return ERR;
        }
        //判断是否 是否
	if( Block_Flag EQ 0 )
		My_memcpyRev(pSrc+LENGTH_FAR_645_FRAME_T2+4, receive_send_buffer+5, Far_Deal_Para_Flag_T2.TX_Length);
	else
		{
		Block_Flag = Far_Deal_Para_Flag_T2.TX_Length/3;
		for( i=0;i<Block_Flag;i++ )
			{
			My_memcpyRev(pSrc+4+LENGTH_FAR_645_FRAME_T2+i*3, receive_send_buffer+5+i*3, 3);
			}
		}
        ///
	*DstLen=Far_Deal_Para_Flag_T2.TX_Length +12;//这里只要告诉黄工 解密后的数据 实际长度即可, 不要管其他的
        return 1;
}