//显示温度 //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); }
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; }
//设置除校表参数意外的所有参数 //校表参数如果无法读出,也会置成默认参数 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); } } } }
//写一条默认参数,参数标识为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; } } }
//获取温度显示的像素宽度 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; }
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); }
//資函晩豚�幣議�殆錐業 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); }
//資函佛豚�幣議�殆錐業 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); }
//�幣佛豚議忖憲堪 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]); }
//计算默认参数的校验和,该校验和只取每项的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; }
//检查某个参数项是否有默认参数,有则返回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; }
//读数据项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; }
//資函蝶倖囂冱議佛豚忖憲堪議恷寄�殆錐業 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; }