// returns diff from uppper left corner void VoxelImage::cutBorders() { AGPainter p(mSurface); int minx,miny,maxx,maxy; bool found=false; minx=maxx=miny=maxy=0; cdebug(mSurface.width()<<"///"<<mSurface.height()); for(int x=0; x<mSurface.width(); x++) for(int y=0; y<mSurface.height(); y++) { AGColor c=p.getPixel(x,y); if(c.a>0) { if(found) { minx=std::min(minx,x); miny=std::min(miny,y); maxx=std::max(maxx,x); maxy=std::max(maxy,y); //cdebug("x:"<<x<<" y:"<<y); //cdebug(minx<<"/"<<maxx<<","<<miny<<",m:"<<maxy); } else { minx=maxx=x; miny=maxy=y; found=true; } } } cdebug(minx<<";"<<maxx<<";"<<miny<<";"<<maxy); cdebug(mSurface.width()<<"///"<<mSurface.height()); if(!found) { maxx=maxy=5; minx=miny=0; } int w=maxx-minx+1; int h=maxy-miny+1; w=std::max(10,w); // workaround for bad libpng calls h=std::max(10,h); if(w<=0 || h<=0) std::cerr<<"Error cutting! "<<w<<","<<h<<std::endl; AGSurface ns(w,h); AGPainter p2(ns); p2.blit(mSurface,AGRect(0,0,w,h),AGRect(minx,miny,w,h)); mSurface=ns; mCenter=mCenter-Pos2D(minx,miny); if(w==0 || h==0) mSurface=AGSurface(1,1); // FIXME: this is some workaround }
void AntargisMap::loadXML(const xmlpp::Node &node) { xmlpp::Node::const_iterator i=node.begin(); for(;i!=node.end();i++) { TRACE; AntEntity *e=0; if(i->getName()=="heightMap") { CTRACE; cdebug("content:"<<i->getContent()); cdebug("---"); std::istringstream hmaps; hmaps.str(i->getContent()); // parse height map float h; cdebug("mH:"<<mH); cdebug("mW:"<<mW); for(int j=0;j<mH;j++) { for(int i=0;i<mW;i++) { hmaps>>h; mHeight.setPoint(i,j,h); } cdebug("j:"<<j); } } else if((e=loadEntity(*i)))
/* *1-on,0-off */ int setFanRunLed(int runStatus) { int ret = 0 ; unsigned char data[2]; data[0] = 0x00; if (runStatus==0) data[1] = 0x00; else data[1] = 0x01; int fd = open(FPGADRVDIR, O_RDWR); if (fd < 0) { cdebug("open /dev/spidev0.0 is error"); return (-1); } if(ioctl(fd, SPI_IOC_OPER_FPGA, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA error\n"); } lseek(fd, FAN_LED_ADDR, SEEK_SET); ret = write(fd , data , 2) ; if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA error\n"); } close(fd); return 0; }
int getFanInfo(int index, struct sdm_ce_fan_running_info *fan) { int is_raise_alarm =0 ; unsigned short fan_speed[2]; cdebug("Start fan getFanInfo\n"); if(index != 1) // For 1610, There are one fan module with 3 subunit { cdebug("Error Fan index %d. \n", index); return (-1); } //if(NULL == fan || NULL == fan[0].SubUnitHwState || NULL == fan[0].RunSpeed) if(NULL == fan) { cdebug("The parameter in function getFanInfo is NULL\n"); return (-1); } memset(fan, 0, sizeof(struct sdm_ce_fan_running_info)); if(getFanSpeed(fan_speed)<0) { cdebug("Can not get the fan speed\n"); return (-1); } fan[0].RunSpeed[0] = fan_speed[0]; if (fan_speed[0]<=FAN_SPEED_THRESH) is_raise_alarm = 1 ; fan[0].RunSpeed[1] = fan_speed[1]; if (fan_speed[1]<=FAN_SPEED_THRESH) is_raise_alarm = 1 ; // cdebug("The fan speed in function getFanInfo is: \n"); // pdata((unsigned char *)fan[0].RunSpeed,4); // setFanRunLed(is_raise_alarm); return 0; }
bool EditIsoView::selectSize(const std::string&,const AGEvent *,AGMessageObject *pCaller) { CTRACE; cdebug(dynamic_cast<AGWidget*>(pCaller)->getName()); editSize=toInt(dynamic_cast<AGWidget*>(pCaller)->getName().substr(4,std::string::npos));//mEditButtons[pCaller]; cdebug(editSize); mAddEntity=""; return true; }
void do_test(const TestOpts& opts) { std::cout << "Testing with parameters: " << opts.to_string() << std::endl; std::vector<std::thread> threads; TestContext ctx(opts); std::cout << "Running workers ... " << std::endl; threads.emplace_back([&ctx] { ctx.barrier_start.wait(); for (size_t i = 1; i <= ctx.opts.n_additions + ctx.opts.n_elements; ++i) { while (!ctx.buffer.enqueue(i)) { std::this_thread::yield(); } cdebug("added " << i); } }); threads.emplace_back([&ctx] { ctx.barrier_start.wait(); for (size_t i = 1; i <= ctx.opts.n_additions; ++i) { size_t result = -1; while (!ctx.buffer.dequeue(result)) { std::this_thread::yield(); } cdebug("checking " << i); test_assert(result == i, "expected to get " << i << " << as next result, got " << result); } }); std::cout << "Done" << std::endl; std::cout << "Joining workers ... " << std::endl; for (auto& t : threads) { if (t.joinable()) { t.join(); } } for (size_t i = 1; i <= ctx.opts.n_elements; ++i) { size_t result = -1; test_assert(ctx.buffer.dequeue(result), "could not get result"); cdebug("checking " << i); test_assert(result == i + ctx.opts.n_additions, "expected to get " << i + ctx.opts.n_additions << " << as next result, got " << result); } std::cout << "Done" << std::endl; std::cout << "OK" << std::endl; }
/*write data to fpga */ int write_fpga_data(int fd, struct fpga_msg *msg, int step) { if(fd < 0) return (-1); lseek(fd, (*msg).addr, SEEK_SET); cdebug("step %d begin ==== write %d bytes at 0x%04x:", step, (*msg).len, (unsigned short)(*msg).addr); if (write(fd, (*msg).buf, (*msg).len) == (*msg).len){ pdata((*msg).buf, (*msg).len); cdebug("\nstep %d done\n", step); } else{ cdebug(" step %d error\n", step); return (-1); } return 1; }
/********************************************* * *从缓冲器中获取光模块信息 * * * *********************************************/ int get_sfpEnvInfo_by_port(int port, struct sfpxfpenvinfo_ *sfpPtr) { /* struct sfpxfpenvinfo_ sfpinfo; if(sfpPtr == NULL) { //cdebug("get_sfpEnvInfo_by_port input address err\n"); return (-1); } if(port > SFPXFP_PORT_NUM) { //cdebug("get_sfpEnvInfo_by_port input port err\n"); return (-1); } extern struct sfpxfpenvinfo_ *sfpinfo_table; memcpy(sfpPtr, sfpinfo_table[port-1], sizeof(sfpinfo)); */ if(get_sfpEnvInfo_by_port_from_sxfp(port, sfpPtr) != 0) { cdebug("Error to get_sfpEnvInfo_by_port_from_sxfp()\n"); } return 0; }
IsoView::IsoView(AGWidget *parent,AGRect r,Pos3D p,AntargisMap *map): AntargisView(parent,r,p,false),MapListener(),mMap(map),mRain(r.w,r.h,0),shallUpdate(false),maxPos(0,0,0) { cdebug("IsoView-Rect:"<<r); inited=false; initTileCache(); }
Pos3D randDir(Pos3D dir,float angle) { return getRandDirOrtho(dir); cdebug("dir:"<<dir); dir=dir.normalized(); cdebug("dir:"<<dir); Pos3D normal=getRandDirOrtho(dir).normalized(); cdebug("normal:"<<normal); cdebug("*:"<<normal*dir); Pos3D res=rotVector(dir,normal,angle); cdebug("res:"<<res); return res; }
void AntargisMap::saveXML(xmlpp::Node &node) const { CTRACE; cdebug("node:"<<&node); // height and grass map xmlpp::Node &hmap=*node.add_child("heightMap"); xmlpp::Node &gmap=*node.add_child("grassMap"); hmap.set("width",toString(mW)); hmap.set("height",toString(mH)); gmap.set("width",toString(mW)); gmap.set("height",toString(mH)); std::ostringstream hmaps,gmaps; for(int j=0;j<mH;j++) { for(int i=0;i<mW;i++) { hmaps<<(int)(mHeight.getPoint(i,j))<<" "; gmaps<<(int)(mGrass.getPoint(i,j))<<" "; } hmaps<<std::endl; gmaps<<std::endl; } cdebug(hmaps.str()); hmap.setContent(hmaps.str()); gmap.setContent(gmaps.str()); // players /* std::set<AntPlayer*>::const_iterator k=mPlayers.begin(); for(;k!=mPlayers.end();k++) { xmlpp::Node &child=node.newChild("player"); (*k)->saveXML(child); }*/ // entities std::list<AntEntity*>::const_iterator i=mEntList.begin(); for(;i!=mEntList.end();i++) { xmlpp::Node &child=node.newChild((*i)->xmlName()); (*i)->saveXML(child); } }
bool EditIsoView::addEntity(const std::string&,const AGEvent *,AGMessageObject *pCaller) { AGWidget *b=dynamic_cast<AGWidget*>(pCaller); if(b) { std::string n=b->getName(); mAddEntity=n; cdebug(mAddEntity); } return true; }
/***** * Enable fan edit by lidingcheng2015-05-12 for on-off fan * 1-enable,0-disable */ int enableFan(const short on_off) { int fanState, ret = 0; unsigned char data[4]={0}; if (on_off==1) { data[2] = 0x00; data[3] = 0x00; } else { data[2] = 0xff; data[3] = 0xff; } int fd = open(FPGADRVDIR, O_RDWR); if (fd < 0) { cdebug("open /dev/spidev0.0 is error") ; return (-1); } if(ioctl(fd, SPI_IOC_OPER_FPGA, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA error\n"); } lseek(fd, FAN_ENABLE_ADDR, SEEK_SET); if(!(write(fd, data, 4) == 4)) { cdebug("Write to enable FAN error!\n"); ret = -1; goto END; } END: if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA_DONE error\n"); } close(fd); return ret; }
int getFanSpeed(unsigned short *fan) { int i, fd , ret = 0; struct fpga_msg fan_fpga_msg[2]; fd=open(FPGADRVDIR,O_RDWR); if(fd<0) { cdebug("open /dev/spidev0.0 error\n"); return(-1); } if(ioctl(fd, SPI_IOC_OPER_FPGA, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA error\n"); } fan_fpga_msg[0].addr = FAN1_SPEED_ADDR; fan_fpga_msg[1].addr = FAN2_SPEED_ADDR; for(i=0; i<2; i++) { fan_fpga_msg[i].len = 4; ret = read_fpga_data(fd, (struct fpga_msg*)&fan_fpga_msg[i], 0) ; if (ret>0) { cdebug("read the %d fan successfully", i); fan[i] = fan_fpga_msg[i].buf[2]<<8|fan_fpga_msg[i].buf[3]; fan[i] /= 60; cdebug("The fan[%d] is : %d\n", i, fan[i]); } else { cdebug("read the %d fan unsuccessfully", i); fan[i] = 0; // Rethink this value !!! if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA_DONE error\n"); } close(fd); } } if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA_DONE error\n"); } close(fd); return 0; }
int getFanState(unsigned short *fan) { if(fan == NULL) { cdebug("Para pointer is NULL in function getFanState\n"); return (-1); } //fan[0] = getFanRunState(); //edit by lidingcheng for plugin fan[0] = getFanHwState(); if(fan[0]==1 || fan[0]==0) return 0; else return -1; }
void AntargisMap::insertEntity(AntEntity *e) { cdebug("INSERTING:"<<e); mEntities.insert(e); mEntList.push_back(e); mEntityMap[e->getID()]=e; /* if(e->mRubyObject) { VALUE rubyAnimal = e->mRUBY; //rb_gc_register_address(&rubyAnimal); // rb_gc_mark(rubyAnimal); cdebug("mark:"); } */ }
int main(int argc, char * argv[]) { struct sfpxfpenvinfo_ *sfpPtr; int i ; cdebug("Begin-----------\n"); sfpPtr = malloc(sizeof(struct sfpxfpenvinfo_)); if(sfpPtr == NULL) { printf("malloc error\n"); return ; } for(i=1;i<21;i++) { if(get_sfpEnvInfo_by_port_from_sxfp(i,sfpPtr) == 0) { printf("------------------port %d-----------------\n",i); printf("Vendor Name=%s\n", sfpPtr->vendorName); printf("Vendor PN = %s \n", sfpPtr->vendorPN); printf("transceiverType = %s \n", sfpPtr->transceiverType); printf("connector type = %s\n", sfpPtr->connectorType); printf("opticalType = %s\n", sfpPtr->opticalType); printf("lineCoding = %s\n", sfpPtr->lineCoding); printf("vendorRev = %s\n", sfpPtr->vendorRev); printf("nominalBitRate = %s\n", sfpPtr->nominalBitRate); printf("linkLength = %s\n", sfpPtr->linkLength); printf("waveLength = %s\n", sfpPtr->waveLength); printf("maxBitRateMargin = %s\n", sfpPtr->maxBitRateMargin); printf("minBitRateMargin = %s\n", sfpPtr->minBitRateMargin); printf("vendorSerialNo = %s\n", sfpPtr->vendorSerialNo); printf("date = %s\n", sfpPtr->date); printf("temperature = %s\n", sfpPtr->temperature); printf("vccVoltage = %s\n", sfpPtr->vccVoltage); printf("TXBiasCurrent = %s\n", sfpPtr->TXBiasCurrent); printf("TXOutputPower = %s\n", sfpPtr->TXOutputPower); printf("RXInputPower = %s\n", sfpPtr->RXInputPower); }else{ printf("\n get sfp info of port %d is error\n",i); } } free(sfpPtr); return 1; }
int getFanHwState(void) //There is only one fan module { struct fpga_msg fan_state_msg; int fd = open(FPGADRVDIR, O_RDWR); if (fd < 0) { cdebug("open /dev/fpga is error"); return (-1); } if(ioctl(fd, SPI_IOC_OPER_FPGA, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA error\n"); } //fan_state_msg.addr = FAN_STATE_ADDR; fan_state_msg.addr = FAN_PLUG_IN_ADDR ; fan_state_msg.len = 4; lseek(fd, fan_state_msg.addr, SEEK_SET); if (read(fd, fan_state_msg.buf, fan_state_msg.len) == fan_state_msg.len) { cdebug("To get the fan Hw state"); } else { cdebug("Error to get the fan state"); if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA_DONE error\n"); } close(fd); return (-1); } cdebug("In getFanHwState, register is: \n"); if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { cdebug("ioctl SPI_IOC_OPER_FPGA_DONE error\n"); } close(fd); return (fan_state_msg.buf[3] & 0x01) ; }
int get_bdinfo_port_num(struct bdinfo_ *ptr) { if(ptr != NULL) { ptr->RJ45100M_num = switch_total_RJ45100M_port_num; ptr->SFP100M_num = switch_total_SFP100M_port_num; ptr->RJ451G_num = switch_total_RJ451G_port_num; ptr->SFP1G_num = switch_total_SFP1G_port_num; ptr->XFP10G_num = switch_total_XFP10G_port_num; ptr->total_num = switch_total_RJ45100M_port_num + switch_total_SFP100M_port_num + switch_total_RJ451G_port_num + \ switch_total_SFP1G_port_num + switch_total_XFP10G_port_num; cdebug("RJ45 100M port=%d SFP 100M port=%d RJ45 1G port=%d SFP 1G port=%d XFP 10G port=%d total_port=%d\n", \ switch_total_RJ45100M_port_num, switch_total_SFP100M_port_num,switch_total_RJ451G_port_num,\ switch_total_SFP1G_port_num, switch_total_XFP10G_port_num, ptr->total_num); return 0; } else return(-1); }
/*Check if the fiber module is plugged */ int is_fiber_plugged(int fd, int port) { struct fpga_msg is_plugged_msg; unsigned short temp = 0; if(port<16) { is_plugged_msg.addr = FPGA_SFP_PLUGGED; } else { is_plugged_msg.addr = FPGA_SFPXFP_PLUGGED; } is_plugged_msg.len = 2; cdebug("Check the addr 0x%x\n ", is_plugged_msg.addr); lseek(fd, is_plugged_msg.addr, SEEK_SET); if (read(fd, is_plugged_msg.buf, is_plugged_msg.len) == is_plugged_msg.len) { cdebug("Check if a fiber modue inserted at Port %d\n ", port); pdata(is_plugged_msg.buf,is_plugged_msg.len); }else{ cdebug("Can not read fpga when check if fiber is plugged"); return (-1); } temp = (is_plugged_msg.buf[0] & 0xff)<<8; temp += is_plugged_msg.buf[1] & 0xff; cdebug("\ntemp is 0x%x\n",temp); if((temp>> (port<16?port:(port-16))) & 0x01 ) //if 1, then return { cdebug("\n The fiber module is not plugged\n"); return (-1); } cdebug("\nThe fiber module is inserted at port %d",port); return 1; }
void do_test(const TestOpts& opts) { std::cout << "Testing with parameters: " << opts.to_string() << std::endl; std::vector<std::thread> threads; TestContext ctx(opts); std::cout << "Running workers ... " << std::endl; for (size_t i = 0; i < opts.n_workers; ++i) { threads.emplace_back([i, &ctx] { ctx.barrier_start.wait(); for (size_t j = 0; j < ctx.opts.n_additions; ++j) { if ((j % ctx.opts.n_workers) != i) { continue; } cdebug("!ctx.hash_set_a.contains(" << j << ") before add"); test_assert(!ctx.hash_set_a.contains(j), "expected not to contain " << j << " before test"); cdebug("!ctx.hash_set_b.contains(" << j << ") before add"); test_assert(!ctx.hash_set_b.contains(j), "expected not to contain " << j << " before test"); cdebug("ctx.hash_set_a.add(" << j << ")"); ctx.hash_set_a.add(j); cdebug("ctx.hash_set_b.add(" << j << ")"); ctx.hash_set_b.add(j); cdebug("ctx.hash_set_a.contains(" << j << ") after add"); test_assert(ctx.hash_set_a.contains(j), "expected to contain " << j << " after addition"); cdebug("ctx.hash_set_b.contains(" << j << ") after add"); test_assert(ctx.hash_set_b.contains(j), "expected to contain " << j << " after addition"); cdebug("ctx.hash_set_a.add(" << j << ") once more"); ctx.hash_set_a.add(j); cdebug("ctx.hash_set_b.add(" << j << ") once more"); ctx.hash_set_b.add(j); cdebug("ctx.hash_set_a.remove(" << j << ")"); ctx.hash_set_a.remove(j); cdebug("ctx.hash_set_b.remove(" << j << ")"); ctx.hash_set_b.remove(j); cdebug("!ctx.hash_set_a.contains(" << j << ") after remove"); test_assert(!ctx.hash_set_a.contains(j), "expected not to contain " << j << " after removal"); cdebug("!ctx.hash_set_b.contains(" << j << ") after remove"); test_assert(!ctx.hash_set_b.contains(j), "expected not to contain " << j << " after removal"); cdebug("ctx.hash_set_a.add(" << j << ") second time"); ctx.hash_set_a.add(j); cdebug("ctx.hash_set_b.add(" << j << ") second time"); ctx.hash_set_b.add(j); cdebug("ctx.hash_set_a.contains(" << j << ") after second add"); test_assert(ctx.hash_set_a.contains(j), "expected to contain " << j << " after addition"); cdebug("ctx.hash_set_b.contains(" << j << ") after second add"); test_assert(ctx.hash_set_b.contains(j), "expected to contain " << j << " after addition"); cdebug("finished testing on item " << j); } }); } std::cout << "Done" << std::endl; std::cout << "Joining workers ... " << std::endl; for (auto& t : threads) { if (t.joinable()) { t.join(); } } std::cout << "Done" << std::endl; std::cout << "OK" << std::endl; }
VoxelImage *makeTerrainTile(const SplineMapD &m,const SplineMapD &gm,int px,int py) //ComplexVoxelImage *makeTerrainTile(const SplineMap<float> &m,const SplineMap<float> &gm,int px,int py) { gDrawingTerrain=true; Uint32 t1=SDL_GetTicks(); int w=TILE_WIDTH; FastVoxelView v(w,w*4,Pos3D(0,0,0),true); if(true) { for(int x=0; x<w; x++) for(int z=0; z<w; z++) // for(int z=w/2-4;z<w/2;z++) { float mx=float(x*POINTS_PER_TILE)/w+px; float mz=float(z*POINTS_PER_TILE)/w+py; // cdebug(mx<<" "<<mz); float h=m.get(mx,mz); for(int y=std::max(0,(int)(h-3)); y<h; y++) { if(y>WATER_HEIGHT) { float a=std::min(1.0f,h-y); int n=rand()%50; v.set(Pos3D(x,y,z),Color(0xAA-n,0xAA-n,0,a)); } } // grass above int mgh=(int)gm.get(mx,mz); if(mgh>0) { float gh=rand()%int(mgh); if(gh>0) for(int y=0; y<gh; y++) { float a=1.0f-(y/gh); int mh=(int)(y+h); // cdebug(a); if(mh>WATER_HEIGHT) v.set(Pos3D(x,mh,z),Color(0,0xAA,0,a)); } } /* if(rand()%60<2) { int w=10; int w2=w/2; float x1=(rand()%w)-w2; float z1=(rand()%w)-w2; float x2=(rand()%w)-w2; float z2=(rand()%w)-w2; float steps=15; // paint a longer leaf for(int i=0;i<steps;i++) { int ax=(int)bezier2(i/steps,float(x),x1+x,x2+x); int az=(int)bezier2(i/steps,float(z),z1+z,z2+z); int ay=(int)bezier2(i/steps,0.0f,steps/4,steps/2); v.set(Pos3D(ax,int(ay+h),az),Color(0,0xAA,0,i/steps)); } } */ } /* for(int x=0;x<8;x++) for(int y=0;y<8;y++) for(int z=0;z<8;z++) { int mx=x-4; int my=y-4; int mz=z-4; if(sqrt(mx*mx+my*my+mz*mz)<4) v.set(Pos3D(x+10,y+40,z+20),Color(0xAA,0,0)); } */ } /** add water **/ srand(0); if(false) // skip water { float a=18; SplineMapD wh((int)a,(int)a,3,1,3,true); for(int x=0; x<w; x++) for(int z=0; z<w; z++) { float mx=x-z+w/2; float mz=x+z-w/2; mx/=w; mz/=w; while(mx>1) mx-=1; while(mx<0) mx+=1; while(mz>1) mz-=1; while(mz<0) mz+=1; float h=wh.get(a*float(mx),a*float(mz))+6; for(int y=0; y<h; y++) { float f=std::min(1.0f,h-y); v.set(Pos3D(x,y,z),Color(0,0,0xAA,f)); } } } /** till here */ Uint32 t2=SDL_GetTicks(); cdebug("TIME:"<<t2-t1); AGSurface s= v.getSurface(); t1=SDL_GetTicks(); cdebug("TIME:"<<t1-t2); // SDL_SaveBMP(s.surface(),"hupe.bmp"); //return new ComplexVoxelImage(Pos3D(0,0,0),s,v.getDepthMap(),v.getShadowMap()); gDrawingTerrain=false; return new VoxelImage(s,Pos3D(0,0,0)); }
bool CompleteIsoView::eventMouseClick(const AGEvent *m) { const AGSDLEvent *e=reinterpret_cast<const AGSDLEvent*>(m); if(e) { if(e->getButton()==SDL_BUTTON_RIGHT) mSelected.clear(); else if(getScreenRect().contains(e->getMousePosition())) { //clicked AGPoint p(e->getMousePosition()); cdebug("clicked on "<<p.x<<","<<p.y); std::vector<AntEntity *> es=getEntity(p); if(es.size()) clickEntities(toEntVector(es)); else { IVTile t=getTile(p); cdebug(t.x<<","<<t.y); Pos2D p2=getTilePos(t); clickMap(p2); } /* if(es.size()) { if(mSelected.size()) { // already something selected - so fight for(std::set <AVItem*>::iterator k=mSelected.begin();k!=mSelected.end();k++) // loop selected { AVItem *i=*k; AntHero *h=dynamic_cast<AntHero*>(mEntities[i]); if(isMyHero(h)) { AntHero *otherHero=getHero(es); if(otherHero) h->fightHero(otherHero); //h->setJob(new FightJob(*es.begin())); // FIXME: currently fighting first } } } else { std::vector<AntEntity*>::iterator i=es.begin(); for(;i!=es.end();i++) mSelected.insert(mEntitiesInv[*i]); } } else { IVTile t=getTile(p); cdebug(t.x<<","<<t.y); Pos2D p2=getTilePos(t); clickMap(p2); if(mSelected.size() && es.size()==0) { for(std::set <AVItem*>::iterator k=mSelected.begin();k!=mSelected.end();k++) { AVItem *i=*k; AntEntity *h=mEntities[i]; if(isMyHero(h)) { // h->goTo(1,getTilePos(t)); h->setJob(new MoveJob(0,getTilePos(t),0)); } } } }*/ } } return false; }
int main(int argc,char *argv[]) { AGMain main; MyApp app; AntargisView *av=new AntargisView(0,AGRect(0,0,100,100),Pos3D(0,0,0)); int x,y,z; int w=64; int s=0; Terrain t(16,16); AGSurface ms; int test=4; if(argc>1) test=atoi(argv[1]); if(test==1) { ms=test1(); av->insert(new VoxelImage(ms,Pos3D(0,0,0))); } if(test==2) { ms=ball(); av->insert(new VoxelImage(ms,Pos3D(0,0,0))); } else if(test==3) { ms=getTerrain(t.getInfo(2,0)); av->insert(new VoxelImage(ms,Pos3D(0,0,0))); } else if(test==4) { ms=getTerrain(t.getInfo(1,0)); av->insert(new VoxelImage(ms,Pos3D(0,0,0))); ms=getTerrain(t.getInfo(2,0)); av->insert(new VoxelImage(ms,Pos3D(64,0,0))); ms=getTerrain(t.getInfo(1,1)); av->insert(new VoxelImage(ms,Pos3D(32,0,-32))); ms=getTerrain(t.getInfo(2,1)); av->insert(new VoxelImage(ms,Pos3D(64+32,0,-32))); } else if(test==5) { int x,y; for(int x=0;x<4;x++) for(int y=0;y<4;y++) { ms=getTerrain(t.getInfo(x,y)); av->insert(new VoxelImage(ms,Pos3D(x*64+(y%2)*32,0,-y*32))); } } else if(test==6) { SplineMap<float> m(16,16,50); SplineMap<float> gm(16,16,20); int w=64; VoxelView v(w,w*2,Pos3D(0,0,0),true); for(int x=0;x<w;x++) for(int z=0;z<w;z++) { float mx=x/16.0; float mz=z/16.0; float h=m.get(mx,mz); for(int y=0;y<h;y++) { float a=std::min(1.0f,h-y); // cdebug(a); v.set(Pos3D(x,y,z),Color(0xAA,0xAA,0,a)); } // grass above float gh=rand()%int(gm.get(mx,mz)); if(gh>0) for(int y=0;y<gh;y++) { float a=1.0f-(y/gh); // cdebug(a); v.set(Pos3D(x,y+h,z),Color(0,0xAA,0,a)); } } /* // small ball above for(int x=0;x<8;x++) for(int y=0;y<8;y++) for(int z=0;z<8;z++) { int mx=x-4; int my=y-4; int mz=z-4; if(sqrt(mx*mx+my*my+mz*mz)<4) v.set(Pos3D(x+10,y+40,z+20),Color(0xAA,0,0)); } */ av->insert(new VoxelImage(v.getSurface(),Pos3D(0,0,0))); } else if(test==7) { float v0=-20; float v1=60; float v2=60; float v3=-20; float v4=0; float v5=0; float v6=0; int x; SDL_Surface *s=getScreen().surface(); Color c(0,0,1); for(x=0;x<32;x++) { int y=spline2(x/32.0,v0,v1,v2);//,v3); sge_PutPixel(s,x,y+50,c.toColor(s)); } for(x=0;x<32;x++) { int y=spline2(x/32.0,v1,v2,v3);//,v4); sge_PutPixel(s,x+32,y+50,c.toColor(s)); } for(x=0;x<32;x++) { int y=spline2(x/32.0,v2,v3,v4);//,v5); sge_PutPixel(s,x+64,y+50,c.toColor(s)); } for(x=0;x<32;x++) { int y=spline2(x/32.0,v3,v4,v5);//,v6); sge_PutPixel(s,x+96,y+50,c.toColor(s)); } SDL_Flip(s); // SDL_Delay(1000); } else if(test==8) { float v0=-20; float v1=60; float v2=60; float v3=-20; float v4=0; float v5=0; float v6=0; int x; SDL_Surface *s=getScreen().surface(); Color c(1,0,1); for(x=0;x<32;x++) { int y=spline3(x/32.0,v0,v1,v2,v3); sge_PutPixel(s,x,y+50,c.toColor(s)); } for(x=0;x<32;x++) { int y=spline3(x/32.0,v1,v2,v3,v4); sge_PutPixel(s,x+32,y+50,c.toColor(s)); } for(x=0;x<32;x++) { int y=spline3(x/32.0,v2,v3,v4,v5); sge_PutPixel(s,x+64,y+50,c.toColor(s)); } for(x=0;x<32;x++) { int y=spline3(x/32.0,v3,v4,v5,v6); sge_PutPixel(s,x+96,y+50,c.toColor(s)); } SDL_Flip(s); // SDL_Delay(1000); } else if(test==9) { SplineMap<float> m(64,64,50); int w=64; VoxelView v(w,w*2,Pos3D(0,0,0),false); int z=0; for(int x=0;x<w;x++) { float h=20+x/16.0; for(int y=0;y<h;y++) { float a=std::min(1.0f,h-y); // if(a<1) if(a>0) { cdebug(a); v.set(Pos3D(x,y,z),Color(0xFF,0xFF,0xFF,a));//Color(0xAA*a,0xAA*a,0));//,a)); } } } av->insert(new VoxelImage(v.getSurface(),Pos3D(0,0,0))); } else if(test==10) { SDL_Surface *s=getScreen().surface(); for(int x=0;x<100;x++) { float h=20+x/16.0; for(int y=0;y<h;y++) { float a=std::min(1.0f,h-y); if(a>0) { sge_PutPixelAlpha(s,x,100-y,SDL_MapRGBA(s->format,0xFF,0xFF,0xFF,a*0xFF),a*0xFF); } } } SDL_Flip(s); SDL_Delay(1000); } else if(test==11 || test==12) { int w=8; SplineMap<float> m(POINTS_PER_TILE*(w+2),POINTS_PER_TILE*(w+2),40); SplineMap<float> gm(POINTS_PER_TILE*(w+2),POINTS_PER_TILE*(w+2),10); if(test==12) w=2; for(int y=0;y<w;y++) for(int x=0;x<w;x++) { int mx=x*(POINTS_PER_TILE); int my=y*(POINTS_PER_TILE/2); if(y&1) mx+=(POINTS_PER_TILE/2); av->insert(new VoxelImage(makeTerrainTile(m,gm,mx,my),Pos3D(mx*TILE_WIDTH/POINTS_PER_TILE,0,my*TILE_WIDTH/POINTS_PER_TILE))); } } else if(test==13) { AGSurface s=makeWaterTile(); av->insert(new VoxelImage(s,Pos3D(64,0,0))); av->insert(new VoxelImage(s,Pos3D(0,0,0))); av->insert(new VoxelImage(s,Pos3D(64+32,0,32))); av->insert(new VoxelImage(s,Pos3D(32,0,32))); av->insert(new VoxelImage(s,Pos3D(64+32,0,-32))); av->insert(new VoxelImage(s,Pos3D(32,0,-32))); } else if(test==14) { AGSurface s=makeWaterTile(); std::string ms=toPNG(s.surface()); s=fromPNG(ms); av->insert(new VoxelImage(s,Pos3D(64,0,0))); } app.setMainWidget(av); app.run(); }
void drawTree(FastVoxelView &vv,Pos3D base,float h) { Pos3D p1(0,0,0),p2(0,0,0),p3(0,0,0); Color c(0x99,0x69,0); Color bc(0,0xAA,0); p1=base; p2=base+Pos3D(0,1,0)*h*0.25; p3=base+Pos3D(0,1,0)*h*0.5; cdebug(p1<<p2<<p3); Trunk t(p1,p2,p3,7,5); std::list<Trunk> tlist,nlist; tlist.push_back(t); int rw=h/4; float angle=M_PI/1.5; // 30 degrees int last=5; for(int i=0;i<=last;i++) { std::cout<<"_______________"<<std::endl; std::list<Trunk>::iterator k=tlist.begin(); for(;k!=tlist.end();k++) { Pos3D dir=k->p3 - k->p2; int count=4; std::list<Pos3D> l=splitDir(dir,count,angle,M_PI/count/8.0,0);//M_PI/count,angle/3); std::list<Pos3D>::iterator j=l.begin(); for(;j!=l.end();j++) { Pos3D r=*j; r=r*rw; int mi=i+1; // c=Color(mi&1,(mi>>1)&1,(mi>>2)&1); /* drawBall(vv,k->p1,4,c); drawBall(vv,k->p2,3,c); drawBall(vv,k->p3,2,c);*/ draw3Line(vv,k->p1,k->p2,k->p3,c,40,k->w1,k->w2); if(i==last) draw3Line(vv,k->p1,k->p2,k->p2,bc,4,2,1); float start=0.6; start+=getRandEq()*0.3; Pos3D sp=bezier(start, k->p1,k->p2,k->p3); // Pos3D np(k->p3*2-k->p2+Pos3D(rx,ry,rz)); Pos3D np(k->p3*2-k->p2+r); Trunk nt(sp, sp*0.5+np*0.5+getRandPos(rw), np, k->w2,k->w2-1); nlist.push_back(nt); } } rw*=0.9; tlist.clear(); cdebug(nlist.size()); tlist=nlist; nlist.clear(); } // roots std::list<Pos3D> l=splitDir(Pos3D(0,-1,0),4,M_PI/4,0,0); std::list<Pos3D>::iterator j=l.begin(); for(;j!=l.end();j++) { Pos3D n=*j * 10 + base; draw3Line(vv,base,base*0.5+n*0.5,n,c,40,t.w1,t.w2); } }
/********************************************* * *从sfp/xfp模块中直接获取光模块信息 * for 161x: port : 5-8 * for 0800C port : 1-8 * for 1604c port : 1-16 sfp 17-20 xfp *********************************************/ int get_sfpEnvInfo_by_port_from_sxfp(int port, struct sfpxfpenvinfo_ *sfpPtr) { int m_type; unsigned char baseData[128]; //unsigned char tempData=0; //port -= 5; port -= 1; cdebug("start get_sfpEnvInfo_by_port_from_sxfp\n"); if(sfpPtr == NULL) { cdebug("get_sfpEnvInfo_by_port input address err\n"); return (-1); } if(port>SFPXFP_PORT_NUM-1 || port<0) { cdebug("The port number exceed the ranger\n"); return (-1); } memset(baseData, 0,128); if(readSfpXfpInfo(port, (char*)baseData) != 0) { cdebug("read sfp/xfp error\n"); return (-1); } if (SFP == baseData[SFP_IDENTIFIYER]) { sprintf(sfpPtr->transceiverType,"%s", "SFP"); }else{ cdebug("Unsupported Identifiyer"); return (-1); } memcpy(sfpPtr->vendorName, &baseData[SFP_VENDOR_NAME_START],16); sfpPtr->vendorName[15] = '\0'; memcpy(sfpPtr->vendorPN, &baseData[SFP_VENDOR_PN_START],16); sfpPtr->vendorPN[15] = '\0'; // CONNECTOR TYPE switch (baseData[CONNECTOR]) { case 0x07: sprintf(sfpPtr->connectorType, "%s", "LC"); break; case 0x01: sprintf(sfpPtr->connectorType,"%s", "SC"); break; default: sprintf(sfpPtr->connectorType,"%s", "Unspecified"); break; } // OPTICAL TYPE switch (baseData[TRANCEIVER_ETHERNET]) { case 0x80: sprintf(sfpPtr->opticalType, "%s", "BASE-PX"); break; case 0x40: sprintf(sfpPtr->opticalType, "%s", "BASE-BX10"); break; case 0x20: sprintf(sfpPtr->opticalType, "%s", "100BASE-FX"); break; case 0x10: sprintf(sfpPtr->opticalType, "%s", "100BASE-LX"); break; case 0x08: sprintf(sfpPtr->opticalType, "%s", "1000BASE-T"); break; case 0x04: sprintf(sfpPtr->opticalType, "%s", "1000BASE-CX"); break; case 0x02: sprintf(sfpPtr->opticalType, "%s", "1000BASE-LX"); break; case 0x01: sprintf(sfpPtr->opticalType, "%s", "1000BASE-SX"); break; default: sprintf(sfpPtr->opticalType, "%s", "Unspecified"); break; } /* LINE CODING */ switch (baseData[ENCODING]) { case 0x01: sprintf(sfpPtr->lineCoding, "%s", "8B10B"); break; case 0x02: sprintf(sfpPtr->lineCoding, "%s", "4B5B"); break; case 0x03: sprintf(sfpPtr->lineCoding, "%s", "NRZ"); break; case 0x04: sprintf(sfpPtr->lineCoding, "%s", "Manchester"); break; case 0x05: sprintf(sfpPtr->lineCoding, "%s", "SONET Scrambled"); break; default: sprintf(sfpPtr->lineCoding, "%s", "Unspecified"); break; } /* Vendor Revison */ memcpy(sfpPtr->vendorRev, &baseData[SFP_VENDOR_REV_START],3); sfpPtr->vendorRev[15] = '\0'; /* Bit Rate Nominal */ sprintf(sfpPtr->nominalBitRate, "%d%s", ((int)baseData[BR_NOMINAL])*100 , " MBit/sec"); /* LinkLength for 9/125 fiber */ if (baseData[LENGTH_9M_KM] == 0 && baseData[LENGTH_9M] == 0) { sprintf(sfpPtr->linkLength , "%s", "Not Specified"); } else { if (baseData[LENGTH_9M_KM] == 0) { sprintf(sfpPtr->linkLength , "%d%s",(int)(baseData[LENGTH_9M]) , " m"); } else { sprintf(sfpPtr->linkLength , "%d%s",(int)(baseData[LENGTH_9M_KM]), " km"); } } /* Wave Length */ if (baseData[SFP_WAVE_LENGTH_START] == 0 && baseData[SFP_WAVE_LENGTH_STOP] == 0) { sprintf(sfpPtr->waveLength ,"%s", "Not Specified"); } else { sprintf(sfpPtr->waveLength ,"%d%s", ((((unsigned int)baseData[SFP_WAVE_LENGTH_START])<<8) | baseData[SFP_WAVE_LENGTH_STOP]) , " nm"); } /* Max Bit Rate Margin */ if(baseData[SFP_BR_MAX] == 0) { sprintf(sfpPtr->maxBitRateMargin ,"%s", "Not Specified"); } else { sprintf(sfpPtr->maxBitRateMargin ,"%d%s", (unsigned int) baseData[SFP_BR_MAX] ," %"); } /* Min Bit Rate Margin */ if(baseData[SFP_BR_MIN] == 0) { sprintf(sfpPtr->minBitRateMargin ,"%s", "Not Specified"); } else { sprintf(sfpPtr->minBitRateMargin ,"%d%s", (unsigned int) baseData[SFP_BR_MIN] ," %"); } /* Vendor Serial Number */ memcpy(sfpPtr->vendorSerialNo, &baseData[SFP_SERIAL_NUMBER_START],16); sfpPtr->vendorSerialNo[15] = '\0'; /* Vendor Date Code */ sprintf(sfpPtr->date, "%c%c%s%c%c%s%c%c", baseData[SFP_DATE_CODE_START+4] , baseData[SFP_DATE_CODE_START+5] , "/" , baseData[SFP_DATE_CODE_START+2] , baseData[SFP_DATE_CODE_START+3] , "/20" , baseData[SFP_DATE_CODE_START] , baseData[SFP_DATE_CODE_START+1]); /* SFP Temperature*/ if((int)baseData[SFP_TEMPERATURE_MSB] & 0x80) { sprintf(sfpPtr->temperature, "-%d.%d", ((int)baseData[SFP_TEMPERATURE_MSB] & 0x7f),(int)baseData[SFP_TEMPERATURE_LSB]/256); } else sprintf(sfpPtr->temperature, "%d.%d", (int)baseData[SFP_TEMPERATURE_MSB],(int)baseData[SFP_TEMPERATURE_LSB]/256); /* SFP VCC*/ sprintf(sfpPtr->vccVoltage, "%d.%d", (((int)baseData[SFP_VCC_MSB]<<8 | (int)baseData[SFP_VCC_LSB])/10000),(((int)baseData[SFP_VCC_MSB]<<8 | (int)baseData[SFP_VCC_LSB])/10000)) ; /* SFP TX BIAS*/ //sprintf(sfpPtr->TXBiasCurrent, "%d", (int)baseData[SFP_TX_BIAS_MSB]); sprintf(sfpPtr->TXBiasCurrent, "%.3f mA", (float)((((int)baseData[SFP_TX_BIAS_MSB]<<8 | (int)baseData[SFP_TX_BIAS_LSB]))/500)); /* SFP TX OUTPUT*/ sprintf(sfpPtr->TXOutputPower, "%.3f dBm", 10 * log10((double)((int)baseData[SFP_TX_POWER_MSB]<<8 | (int)baseData[SFP_TX_POWER_LSB]) / 10000)); /* SFP RX OUTPUT*/ sprintf(sfpPtr->RXInputPower, "%.3f dBm", 10 * log10((double)((int)baseData[SFP_RX_POWER_MSB]<<8 | (int)baseData[SFP_RX_POWER_LSB]) / 10000)); return 0; }
/* read the sfp infomation */ int readSfpXfpInfo(int port, char *basePtr) { int fd,i; int delay_count = DELAY_COUNT; //unsigned char data[128] = {0}; unsigned int addr_port; unsigned int addr_fiber_slave; struct fpga_rdwr_data fpga_data; cdebug("start readSfpXfpInfo....\n"); if(basePtr == NULL) { cdebug("readSfpXfpInfo input address err\n"); return (-1); } if(port > SFPXFP_PORT_NUM-1) { cdebug("readSfpXfpInfo input port err\n"); return (-1); } fd=open(FPGADRVDIR,O_RDWR); if(fd<0) { cdebug("open %s error1\n",FPGADRVDIR); return(-1); } if(ioctl(fd, SPI_IOC_OPER_FPGA, NULL)) { } // Check if the fiber module is plugged if(is_fiber_plugged(fd,port) != 1 ) { goto ERROR; } //. fpga_data.nmsgs = 5; fpga_data.msgs = (struct fpga_msg*)malloc(fpga_data.nmsgs * sizeof(struct fpga_msg)); if(NULL == fpga_data.msgs) { cdebug(" fpga_data.msgs is not allocated correctly!\n "); goto ERROR; } // The base address in the register addr_fiber_slave = SLAVE_ADDR_SFP; //addr_port = ((addr_fiber_slave>>4)+port)<<4; /* for 161x */ addr_port = addr_fiber_slave ; cdebug("\naddr_port is %02x\n ", addr_port); // select the port fpga_data.msgs[0].addr = 0xac; fpga_data.msgs[0].flags = 1; // write fpga_data.msgs[0].len = 2; fpga_data.msgs[0].buf[0] = 0; fpga_data.msgs[0].buf[1] = port; write_fpga_data(fd,(struct fpga_msg*)&fpga_data.msgs[0],1); // write a4 a000 fpga_data.msgs[0].addr = addr_port + FPGA_ADDR_OFFSET; fpga_data.msgs[0].flags = 1; // write fpga_data.msgs[0].len = 2; fpga_data.msgs[0].buf[0] = addr_fiber_slave + FPGA_WREN_OFFSET; //read a2 2 fpga_data.msgs[1].addr = addr_port + FPGA_RDEN_OFFSET; fpga_data.msgs[1].flags = 0; // read fpga_data.msgs[1].len = 2; //wrtie a2 0001(0000) 产生跳变沿 fpga_data.msgs[2].addr = addr_port + FPGA_RDEN_OFFSET; fpga_data.msgs[2].flags = 1; // write fpga_data.msgs[2].len = 2; //read aa 2 fpga_data.msgs[3].addr = addr_port + FPGA_EN_OFFSET; fpga_data.msgs[3].flags = 0; // read fpga_data.msgs[3].len = 2; //read a8 2 fpga_data.msgs[4].addr = addr_port + FPGA_RDDATA_OFFSET; fpga_data.msgs[4].flags = 0; // read fpga_data.msgs[4].len = 2; #if 0 struct timeval tv; struct timezone tz; fpga_data.msgs[0].addr = 0xe; fpga_data.msgs[0].flags = 1; // write^M fpga_data.msgs[0].len = 2; fpga_data.msgs[0].buf[0] = 1; gettimeofday(&tv,&tz); printf("time:%d.%d\n",tv.tv_sec,tv.tv_usec); write_fpga_data(fd,(struct fpga_msg*)&fpga_data.msgs[0],1); gettimeofday(&tv,&tz); printf("time:%d.%d\n",tv.tv_sec,tv.tv_usec); fpga_data.msgs[0].addr = 0; read_fpga_data(fd,(struct fpga_msg*)&fpga_data.msgs[0],1); gettimeofday(&tv,&tz); printf("time:%d.%d\n",tv.tv_sec,tv.tv_usec); #endif for(i=0; i<MAX_SXFP_INFO_OFFSET; i++) //read the data of the register(0~93) //for(i=0; i<1; i++) //read the data of the register(0~93) { fpga_data.msgs[0].buf[1] = (unsigned char)i; cdebug("+++++++++%d++++++++++++",i); //write a4 a000 write_fpga_data(fd,(struct fpga_msg*)&fpga_data.msgs[0],1); //read a2 2 read_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[1],2); //wrtie a2 0001 fpga_data.msgs[2].buf[0] = 0x00; fpga_data.msgs[2].buf[1] = fpga_data.msgs[1].buf[1]^(0x01); //跳变沿有效 write_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[2], 3); // To wait for the enable flag delay_count = DELAY_COUNT; // In fact, it needs 3 times to wait for the readable flag do { //read aa 2 read_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[3], 4); if((unsigned char)fpga_data.msgs[3].buf[1] & 0x01) break; }while(delay_count--); cdebug("wait time is +++++++++%d+++++++++++++",delay_count); // check if the read flag is enabled if((unsigned char)fpga_data.msgs[3].buf[1] & 0x01) { read_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[4], 5); basePtr[i] = fpga_data.msgs[4].buf[1]; }else{ cdebug("FPGA is not RDWR ENABLE!! \n"); //free the memory and close fd. free(fpga_data.msgs); goto ERROR; } } // gettimeofday(&tv,&tz); //printf("time:%d.%d\n",tv.tv_sec,tv.tv_usec); // The base address in the register //addr_fiber_slave = 0xa2; addr_fiber_slave = 0xa0; //addr_port = ((addr_fiber_slave>>4)+port)<<4; addr_port = addr_fiber_slave ; cdebug("\naddr_port is %02x\n ", addr_port); // write a4 a000 fpga_data.msgs[0].addr = addr_port + FPGA_ADDR_OFFSET; fpga_data.msgs[0].flags = 1; // write fpga_data.msgs[0].len = 2; fpga_data.msgs[0].buf[0] = addr_fiber_slave + FPGA_WREN_OFFSET; //read a2 2 fpga_data.msgs[1].addr = addr_port + FPGA_RDEN_OFFSET; fpga_data.msgs[1].flags = 0; // read fpga_data.msgs[1].len = 2; //wrtie a2 0001(0000) 靠靠? fpga_data.msgs[2].addr = addr_port + FPGA_RDEN_OFFSET; fpga_data.msgs[2].flags = 1; // write fpga_data.msgs[2].len = 2; //read aa 2 fpga_data.msgs[3].addr = addr_port + FPGA_EN_OFFSET; fpga_data.msgs[3].flags = 0; // read fpga_data.msgs[3].len = 2; //read a8 2 fpga_data.msgs[4].addr = addr_port + FPGA_RDDATA_OFFSET; fpga_data.msgs[4].flags = 0; // read fpga_data.msgs[4].len = 2; for(i=96; i<128; i++) //read the data of the register(0~93) { fpga_data.msgs[0].buf[1] = (unsigned char)i; cdebug("+++++++++%d++++++++++++",i); //write a4 a000 write_fpga_data(fd,(struct fpga_msg*)&fpga_data.msgs[0],1); //read a2 2 read_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[1],2); //wrtie a2 0001 fpga_data.msgs[2].buf[0] = 0x00; fpga_data.msgs[2].buf[1] = fpga_data.msgs[1].buf[1]^(0x01); //靠靠? write_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[2], 3); // To wait for the enable flag delay_count = DELAY_COUNT; // In fact, it needs 3 times to wait for the readable flag do { //read aa 2 read_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[3], 4); if((unsigned char)fpga_data.msgs[3].buf[1] & 0x01) break; }while(delay_count--); cdebug("wait time is +++++++++%d+++++++++++++",delay_count); // check if the read flag is enabled if((unsigned char)fpga_data.msgs[3].buf[1] & 0x01) { read_fpga_data(fd, (struct fpga_msg*)&fpga_data.msgs[4], 5); basePtr[i] = fpga_data.msgs[4].buf[1]; }else{ cdebug("FPGA is not RDWR ENABLE!! \n"); //free the memory and close fd. free(fpga_data.msgs); goto ERROR; } } if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { } close(fd); free(fpga_data.msgs); return(0) ; ERROR: if(ioctl(fd, SPI_IOC_OPER_FPGA_DONE, NULL)) { } close(fd); return -1; }