Shop OBEX P1 Docs P2 Docs Learn Events
Trouble getting W5200 connected , Solved , DHCP+Netbios+Basic Auth+Multisocketserver - Page 7 — Parallax Forums

Trouble getting W5200 connected , Solved , DHCP+Netbios+Basic Auth+Multisocketserver

123457

Comments

  • Igor_RastIgor_Rast Posts: 357
    edited 2012-10-31 14:00
    Mike G wrote: »
    You really should start a new post for this issue. Maybe in the Sensor or Propeller forum.

    According to the data sheet at 22 C the SHT-11 has an accuracy of is +/-0.5 C. At ~10 C accuracy is closer to +/-1 C

    Assuming the source code is bug free, consider averaging 3 samples before sending the values to the graph.

    Add an array of temperature values. Fill each element in a circular fashion. When it comes time to populate the graph, send the average of the three temperatures.

    When populating the array, validate the temperature value is within an acceptable deviation form the mean. If it is not acceptable do not add the temperature value.

    ill do that Mike , Thanks for all the help. Ill post the full project when all is finished if someone likes it
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-10-31 20:28
    Mike one tille last ting ,

    The instance I add the code below , to the rest of the code to run the html5graphbasicauthent . the prop does strange tings , only running the last code downloaded without the code below
    I just put it below it all , not even calling the pub somewhere and id doesnt run displaying the charachters as supose to

    any idear why this is ?
    PUB intro_test
    
      repeat 30
        shift.Out( 1979711488)                  {  H  }
        waitcnt(clkfreq/240 + cnt)
    
        shift.Out(2298478592+255+16711680+65280)
        waitcnt(clkfreq/140 + cnt)
           
      repeat 30                         
        shift.Out( 7733248+1996488704)          {  HA  }
        waitcnt(clkfreq/240 + cnt)
    
        shift.Out(8978432+2281701376+255+65280)
        waitcnt(clkfreq/140 + cnt)
    
           
      repeat 30                         
        shift.Out( 30208+7798784+939524096)
        waitcnt(clkfreq/240 + cnt)              {  HAL  }
    
        shift.Out(35072+8912896+3338665984+255)
        waitcnt(clkfreq/140 + cnt)
    
        
      repeat 30                         
        shift.Out(118+30464+3670016+939524096 )
        waitcnt(clkfreq/240 + cnt)              {  HALL  }
    
        shift.Out(137+34816+13041664+3338665984)
        waitcnt(clkfreq/140 + cnt)
    
                
      repeat 30                         
        shift.Out(119+14336+3670016+1056964608 )
        waitcnt(clkfreq/240 + cnt)              {  ALLO  }
    
        shift.Out(136+50944+13041664+3221225472)
        waitcnt(clkfreq/140 + cnt)  
    
      repeat 30                         
        shift.Out(56+14336+4128768 )
        waitcnt(clkfreq/240 + cnt)              {  LLO_  }
    
        shift.Out(199+50944+12582912+4278190080)
        waitcnt(clkfreq/140 + cnt)
    
      repeat 30                         
        shift.Out( 56+16128+100663296)
        waitcnt(clkfreq/240 + cnt)              {  LO_I  }
    
        shift.Out(199+49152+4177526784+16711680)
        waitcnt(clkfreq/140 + cnt)
    
         
      repeat 30                         
        shift.Out( 63+393216+956301312)
        waitcnt(clkfreq/240 + cnt)              {  O_IC  }
    
        shift.Out(192+16318464+3321888768+65280)
        waitcnt(clkfreq/140 + cnt)
    
      repeat 30                         
        shift.Out(1536+3735552+2030043136 )
        waitcnt(clkfreq/240 + cnt)              {  _ICE  }
    
        shift.Out(63744+12976128+2248146944+255)
        waitcnt(clkfreq/140 + cnt)
    
      repeat 150                         
        shift.Out(6+14592+7929856 )
        waitcnt(clkfreq/240 + cnt)              {  ICE_  }
    
        shift.Out(249+50688+8781824+4278190080)
        waitcnt(clkfreq/140 + cnt)          
    
    
  • Mike GMike G Posts: 2,702
    edited 2012-11-01 06:02
    Try blinking an LED at the start of intro_test?

    I suspect there is a programming bug but not enough information is provided to help.
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-01 08:43
    Mike , the led doesn't make any changes , and it continues to be unresponsive , running the last good code downloaded
    I have archived my complete project . Hopefully you can see what the problem is whit the full code
    just doesn't really make any sense to me , as just putting it in the page without every using it causes it to hang

    anyway . here;s the complete file ,
    DHCP + DNS+ Multisocket + basic Authentication + SHT-11 + LCD + 7 Ledś + 4 buttons .
    sensor readings are a average of 10 readings to get a smoother readout
    think its getting pretty complete

    ANyone trieout my code and find any problems or things that could do better , Ill be happy to hear it

    Update , object found in post #187 .the one below is password protected. so useless


    Good working is the Top object
  • Mike GMike G Posts: 2,702
    edited 2012-11-01 09:46
    Your source is password protected.

    Did you remember to set the timeout period for your setup?
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-01 09:57
    Mike G wrote: »
    Your source is password protected.

    Did you remember to set the timeout period for your setup?


    O sorry ,,here is the update one withous password protet

    Good Working .tar.gz


    about the timeout , I was using the default value if i remember corretly , And it works fine that way , so I didn,t change it ,
    For the smartphones not connecting , I havent figured it out yet , but the simple html5graph does open on the phones so there is likely something else wrong , ill have to figure that one out still. stil to come
  • Mike GMike G Posts: 2,702
    edited 2012-11-01 10:00
    Can you attach a zip and not a .tar.qz file?

    Make sure the default timeout is set to 3000 for your setup!!!
  • Mike GMike G Posts: 2,702
    edited 2012-11-01 11:40
    I grabbed 7-Zip and unzipped the archive. The source locks as stated in post 185. I commented the following two lines and was able to retrieve network parameters.
      cognew(Tempcontrol,@stack1)  
      cognew(controller,@stack2)  
    

    However, accessing the web page caused another issue. It appears the socket is being held open by the source code. I'm guessing waiting for a temperature reading?

    All 8 COGs are being used and the main COG is left with 144 longs.

    Reduced the two stacks from 128 longs to 64 longs and uncommented the two cognew statements in the top level object.
      long stack1[64] ,stack2[64]   {stackspace for new cog }
    ...
      cognew(Tempcontrol,@stack1)  
      cognew(controller,@stack2)  
    

    That allowed the DHCP object to retrieve network parameters. Access the index page caused the same socket issue. The browser is waiting for the socket to close. This is usually happens when the socket does not send FIN. This symptom tends to shows up when preparing an HTTP response that requires processing but the processing never completes.


    I verified the code repository source is functioning as expected.

    I believe there are two problems.
    1) Not enough HUB memory for the main COG stack.
    2) A socket bug introduced with recent top level object code changes.
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-01 14:22
    Sorry for the tar file, overlooked it , had to do some grocery shopping , but im back :p

    about the stack , it was stet to 128 from the beginning of creating all this , at the time , the complete file was noting compared with now .
    anyway . i was tinking of calculatin te min amout of stack for those 2 cogs. but didnt get to it yep . maybe now its a good time to start.
    sure I saw a couple of treads about that.
    and I was tinking of removing some pub in the other files that are not used , to save some space.
    but how to optimize the hub memory ?

    for the socket bug , maybe. .
    before I had the problem with the pst before . the intro was part of the code and never was any problem .
    to get the pst solved . i skined down the code , removing all that was not esential ( intro = welcome demo show ) to ofigure out that the pst was the problem .

    till now that im building it back up , that being the last piece of code to go back .
    and its not responding to it. in the mean time we did change the code a few times,im not sure if i just didnt pay atention to it before , but it like , the first time the i ask for the page it never shows or takes verry long , but if i refresh then it does open ,. before this happens some time, now it looks to happen more often

    I am missing the windows propper tool ram data overvieuw (F8) in the simpleide& . anyway of seeing the memory consumed by the program in simpleide that you know of ? moving back and forth with the code from pc just to look ate the image. annoying
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-01 21:40
    Mike , I moved the code over to the simple_74hc595 object , and now it looks to work fine,
    even running the welcome intro . now it called like below
    PUB Controller 
    
      shift.init(SR_CLOCK, SR_LATCH, SR_DATA)              {init lcd driver }  
      shift.welcome
    

    but not verry sure wat was causing this in the first place
    about the hub memory , do you refeur to the stackspace for cog 0 . i see my code takes allot of the space , and I am using the last 5 rows(7FB0-7FF) of eeprom to store permament values ( setpoint eg)
    are those safe there , or should they be saved elsewehere just in case , knowing the cog 0 uses the space.


    Is it possible to store the html DAT file on a second eerprom , and read it from there . or will that be to slow for the propeller to serve every time ,
    the i2cobject supports different eerpromaddress. or is this not going to work . writing the html to the second eeprom first , and after that , load the main file
  • Mike GMike G Posts: 2,702
    edited 2012-11-02 07:19
    I am using the last 5 rows(7FB0-7FF) of eeprom to store permament values ( setpoint eg)
    are those safe there , or should they be saved elsewehere just in case , knowing the cog 0 uses the space.
    COGs use RAM not EEPROM.
    s it possible to store the html DAT file on a second eerprom , and read it from there . or will that be to slow for the propeller to serve every time ,
    Yes, but you do understand the graph page is requested once on the initial request. After the initial request, only the XML document is passed using AJAX requests. The XML is small.

    Why not place the HTML on the same server that stores the CSS and JS?

    By the way, you are not using DNS as the title change suggests, correct?
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-02 10:23
    Mike G wrote: »

    Yes, but you do understand the graph page is requested once on the initial request. After the initial request, only the XML document is passed using AJAX requests. The XML is small.

    Why not place the HTML on the same server that stores the CSS and JS?

    yes mike , I understand that the page is only getting served once , and after that only the xml ,
    So placing the html DAT on a second eerprom and serve it from there would work.
    only its not realy clear to me if this free space is what i need , or sould I leave it like it is now , its working with the current setup.

    but your sugestion about getting the page from the server thats hosting my css is not a bad idea at all.(no need for second eerprom)
    in that case the wiznet wil be acting like a client ??
    you have a code snippet on how to call that on the propeller ?
    Mike G wrote: »
    By the way, you are not using DNS as the title change suggests, correct?
    o sorry for that , is Netbios a better name for it ? I was refeuring to the host beeing addresed by hostname
  • Mike GMike G Posts: 2,702
    edited 2012-11-02 11:02
    but your sugestion about getting the page from the server thats hosting my css is not a bad idea at all.(no need for second eerprom)
    in that case the wiznet wil be acting like a client ??
    you have a code snippet on how to call that on the propeller ?
    Just reference the W5200 Host/IP in the AJAX call. Some browsers might complain about cross site scripting, if so just create a web request proxy using a server technology like PHP. Example, the AJAX script makes an HTTP request to a PHP script on the same host. The PHP script invokes an HTTP GET on the W5200/Prop and forward the XML results to the original caller.

    This architecture separates the HTML GUI from W5200/Propeller generated data. Basically, you can have a really cool looking web site without having to store the HTML, CSS, and JS on the Prop. The web server just needs access to the W5200/Prop. Take that one step further and you could host a web application that serves up temperature and humidity to 1000s of subscriber accounts. User buy the W5200/Prop product, create an account, enter some config info - the url of their device. And you're in business.

    Anyway, that's the idea behind this demo, only I used C#.
    http://www.agaverobotics.com/spinneret/controlpanel.htm
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-02 13:19
    He mike , first thanks for the info , i am reading it verry carefully to understand all that is stated.

    i do understand the concept, and I already know that the css and the js file are being served from another place , so they are not on the prop.
    so that has to be possible with the html page to for it to retreve it from elsewhere.

    php and creating a web proxy Im not good at php . have looked for a few examples that explain the idea pretty good , but ill need to go en fool around abit with it for it to work .
    the link from the webcam with the leds. Im having difficulties finding the part where the request to the html page is done , think il just have to spend a few more hours reading and testing before I fully understand how to make it work. But I think this is deffinitly a better approch ,

    this way if it is neccecary to change the html page getting served , I only have to change the page on the server , and automaticly , all propeller+ wiznet that ask for the page get the updated page , withou having to modifie every single controller.

    the part you were talking about hosting the temp to 1000s of servers, dont know if I understand you correctly
    but . I dont think more than 1 person is opening the page to see the temp + humidity on the one prop I have,
    rather , 1000 people will need to be able to retrive the html page from my server , but display there own temp + humidity values comming from ther own controller in there enviroment they wanne keep a close look on .
    occasionaly there is more than 1 connection to the server, but never acceable for everyone on the web , only those with autorization .

    for hosting the html files on my sever ,
    It will help if the username and password that are beeing used to log in , are also stored in some way on my server (PHP?) or database(mysql?)
    so that a user can after the purcase make a new username and password to go with the controller, and be able to log in with those new login name ,
    think every controller wil need a serial number orso to identiy it , and then assign a new username + password.
    think its a long shot , but deffinitly possible.
    wat do you think about it ?
  • D.PD.P Posts: 790
    edited 2012-11-04 16:22
    Mike G wrote: »
    I commented the PST debug statements, programmed the Prop, and Html5Graph ran fine. I can see the results in WireShark and the router.

    Is the Propeller continually restarting?

    I have gone through hoops with this module, I've have 2 lights on module1, 1 light on module2, the modules work correctly sometimes, reprogram with a slight change (different IP) and they don't, toggle power a couple of times and they come back, maybe. Sent back what I thought was a broken module (probably not) got a the new one and it only has one light on but works correctly with a couple examples. Can you please explain your hardware setup? I'm using a PBOE and only USB for power, via the 3.3 output. I'm not being able to get past the "reliability" part of my project and this leaves me wondering about my skill or the module or my setup. I would really like to contribute more to the NetBios... stuff but I can't even get the modules to work reliably yet with 90 percent of the demos? I do use WireShark, netstat, route, ipconfig, ifconfig, arp, networksetup, tcpdump, iptool etc and have allot of high and low level networking experience.

    BTW: Do you mean to do this in the lastest Socket.spin?
    DAT
      _port       byte  $2710    'line throws the warning
      null        long  $00
    
    Line 50 throws a warning in BST: Value exceeds variable size (will be truncated)

    Using revison 89 from the repository.
  • Mike GMike G Posts: 2,702
    edited 2012-11-04 16:58
    Sorry, it should be
    DAT
      _port       long  $2710
      null        long  $00
    

    the orange LED will light up when data is sent or received.

    There seems to be a hardware issue if the USB cable is removed and PST starts up.

    I'm using a Prop Demo Board with 7.5V 1000mA power supply.

    Some of the demos expect the user to supply network parameters others use DHCP. Pick one demo and we'll get that working then move to the others. Just start a new thread.
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-04 17:09
    @D.P
    for me the issue with the leds was solved with the hard reset , holding the nRESET pin low to reset the wiznet module
    doing a hard reset made sure that both lights were always on when starting . and I havent had a problem with it ever since.
    before I also had it working somethimes with 1 light ,other times with 2 lights.

    and like mike said , give a dhcp a seperate folder , and the one with a static ip also a serparet folder ,
    so u have multiple same files . leave the one when using dhcp completly as is . all values 0
    so you dont mistakenly forget something when working with both ,.

    PUB HardReset(pin)
    
      dira[pin]~~
    
      outa[pin]~
    
      waitcnt(((clkfreq / 1_000_000 * 3 - 3932) #> 381) + cnt)
    
      outa[pin] ~~
    
      waitcnt(((clkfreq / 1_000 * 300 - 3932) #> 381) + cnt)
    
  • D.PD.P Posts: 790
    edited 2012-11-04 17:22
    @Igor_Rast

    Bingo, the HardReset routine works for both my modules now. Wow I spent weeks it seems trying to track this down, thanks so much
  • D.PD.P Posts: 790
    edited 2012-11-04 17:24
    @Mike G No appologies needed Mike, your work is fantastic, and I didn't forget about the BlueBerries, I'll send this tomorrow, I got your PM. Igor's reset works for both of my modules now so I will work on getting more of the demos functional here, I sure the reset was the problem. Thanks for everything you have provided.
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-04 17:38
    D.P wrote: »
    @Mike G No appologies needed Mike, your work is fantastic, and I didn't forget about the BlueBerries, I'll send this tomorrow, I got your PM. Igor's reset works for both of my modules now so I will work on getting more of the demos functional here, I sure the reset was the problem. Thanks for everything you have provided.

    @ D.P
    Glad to hear that it worked out for you 2, sounded so familiar the problem , I was struggeling with it for weeks to. I almost knew for sure the nRESET would fix it .
    Nice. so well be hearing from your testing .
    dont forget the pst issue Mike was mentioning , that was also somthing that kept me busy thinking wat was wrong for a verry long time ,
    make sure if there are pst statements in the object, dont run the demo without the usb-pst connected to the board , if needed without (standalone) , remove all the pst statements.or you wil get random stuff happening again

    have you tried the object I posted in post #186 ??
  • Mike GMike G Posts: 2,702
    edited 2012-11-04 18:23
    BTW, the W5200 object contains methods HardReset and SoftReset methods. It's pretty apparent I should add the reset calls to the demos.
      pst.str(string("Initialize W5200", CR))
      wiz.Start(3, 0, 1, 2)
    
      'Loop until we get the W5200 version
      'This let us know that the W5200 is ready to go
      repeat until wiz.GetVersion > 0
        pause(250)
        if(i++ > ATTEMPTS*5)
          pst.str(string(CR, "W5200 SPI communication failed!", CR))
          return
      wiz.HardReset(RESET_PIN)
    
  • D.PD.P Posts: 790
    edited 2012-11-04 18:31
    Igor_Rast wrote: »
    @ D.P
    Glad to hear that it worked out for you 2, sounded so familiar the problem , I was struggeling with it for weeks to. I almost knew for sure the nRESET would fix it .
    Nice. so well be hearing from your testing .
    dont forget the pst issue Mike was mentioning , that was also somthing that kept me busy thinking wat was wrong for a verry long time ,
    make sure if there are pst statements in the object, dont run the demo without the usb-pst connected to the board , if needed without (standalone) , remove all the pst statements.or you wil get random stuff happening again

    have you tried the object I posted in post #186 ??

    I'll try you demo more later, first off it doesn't self contain all the files, FloatMath... no worries I give it a go later. thanks
  • D.PD.P Posts: 790
    edited 2012-11-04 18:35
    I'd say a big YES to the idea of calling HardReset just before the call to Wiz.Init(), I'm gonna slay the DHCP and NetBios dragons later tonight. HardReset will save lots of hair for other people using this module for the first time, as has all of your work, thanks mike.
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-04 18:56
    D.P wrote: »
    I'll try you demo more later, first off it doesn't self contain all the files, FloatMath... no worries I give it a go later. thanks
    Floatmath ? till I remember I dont use that object in there , anyway ill hear from you, Thanks
  • twctwc Posts: 107
    edited 2012-11-05 06:30
    Mike: Rather than adding hard reset to all the demos I think another option is you can add SoftReset to W5200.spin. I tested this mod to W5200.Start...
      _cs := m_cs
      _clk := m_clk
      _mosi :=  m_mosi
      _miso := m_miso
      '_reset := m_reset
      SoftReset
      SetCommonDefaults
      ' Set Interrupt mask register
      SetIMR2($FF)
    
    

    ...and it seems to work properly i.e. a demo that fails when W5200 starts in ambiguous state works correctly with this fix. You could do the same thing with HardReset, but of course that requires the nRESET pin to be connected. You could just require everyone to devote a pin for nRESET (i.e. add it to the required SPI pins) but that may not be necessary.
  • D.PD.P Posts: 790
    edited 2012-11-05 10:28
    twc wrote: »
    Mike: Rather than adding hard reset to all the demos I think another option is you can add SoftReset to W5200.spin. I tested this mod to W5200.Start...
      _cs := m_cs
      _clk := m_clk
      _mosi :=  m_mosi
      _miso := m_miso
      '_reset := m_reset
      SoftReset
      SetCommonDefaults
      ' Set Interrupt mask register
      SetIMR2($FF)
    
    

    ...and it seems to work properly i.e. a demo that fails when W5200 starts in ambiguous state works correctly with this fix. You could do the same thing with HardReset, but of course that requires the nRESET pin to be connected. You could just require everyone to devote a pin for nRESET (i.e. add it to the required SPI pins) but that may not be necessary.

    During reload of system software from the eeprom I recommend a hardreset and a pause after. I think a single pin is worth dedicating for the entire ethernet subsystem on an embedded system, "I say we take off and nuke the entire site from orbit. It's the only way to be sure!" Aliens 1.
  • Mike GMike G Posts: 2,702
    edited 2012-11-05 11:06
    A software reset on Init or Start will not hurt anything. I'll add the software reset logic to W5200 as suggested.

    As for the hardware reset, the keys is documentation and examples so the end user can make a decision. I'll start working on the docs and demos.
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-06 20:13
    Mike think you could give me a headsup with the proxy .
    I found lots of infor , reading and testing about 3 day, not getting it to work .
    with this example got my best hope , and is explained good , but i just dont get it running .

    think you could point me the way about the cross brouwser htttp request .
    I deffinitly understand what the problem is and what is going on , just the solution is not realy working
  • Mike GMike G Posts: 2,702
    edited 2012-11-07 05:07
    The example in post 209 uses JQuery, JSON, and PHP. Unless the Propeller source was updated to send JSON and the correct JQuery library is referenced - it will not work!

    Here's an example PHP script using cURL. This script will invoke the page count method on my Spinneret web server - sitting next to me in my office - and return the results as an XML document. Live Spinneret Page Count
    [PHP]
    <?php
    $url = "http://spinneret.servebeer.com:5000/pagecnt";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    if(!curl_errno($ch))
    {
    //Content type should be XML
    header ('Content-type: text/xml');
    }
    else
    {
    echo 'Curl error: ' . curl_error($ch);
    }
    curl_close($ch);
    ?>
    [/PHP]


    Steps
    1. Download the attached code.
    2. Update the URL within so it is pointing to your W5200/Propeller URL.
    3. Update the AJAX method in the index.htm page (Graph) so it is pointing to the new getpagecount.php file. You should rename the file to something more appropriate. Make sure getpagecount.php and index.php are in the same web app (domain).

    Please create new threads for new subjects. This thread is too long and not on subject anymore.
  • Igor_RastIgor_Rast Posts: 357
    edited 2012-11-07 19:16
    I agree with you mike, this post has become verry long and a little off topic ,.

    ill start new post if i have new questions ,
    just last question about the last post ,
    I am now able to open my index page stored on the server , by calling the php file, so that looks te be working fine ,
    but to get the ajax to call it in the prop i dont realy understand.
    am I suppose to add remove the page and let it look like below , just calling the ajax. and that page loads the rest , ??
    index byte  "HTTP/1.1 200 OK", CR, LF, {
    }             "Content-Type: text/html", CR, LF, CR, LF, {
    }             "<!DOCTYPE html>", CR, LF, {
    }             "<html>               ", CR, LF, {
    }             "<script type='text/javascript' src='http://192.168.2.151/px/graph_new.js'></script>", CR, LF, {
    }             "<title>PX-210</title>", CR, LF, {
    
    }             "<body>               ", CR, LF, {
    
    
    }             "</header>",        CR, LF, { 
    }             "</body>               ", CR, LF, {
    }             "</html>", 0
    

    supose this was the intention , this is the graph_new beeing called . and that calls the test1.php wich is you modified pagecount to mirror my page.
    function ()
    {
    	var xmlHttp = getXMLHTTP();
     
    	xmlHttp.onreadystatechange = function()
    	{
    		if(xmlHttp.readyState == 4)
    		{
    			document.getElementById('test1').innerHTML =
    			xmlHttp.responseText;
    		}
    	}
    	xmlHttp.open("GET", "test1.php", true);
    	xmlHttp.send(null);
    }
    

    But this doenst seem to be working now. Whats the call to Ajax look like , This is the final Question I promise :smile:
Sign In or Register to comment.