Göra om C till PHP - Relativt enkelt skulle jag tro, men behöver hjälp

Permalänk
Medlem

Göra om C till PHP - Relativt enkelt skulle jag tro, men behöver hjälp

Hej

Jag har en kodsnutt i C (tror jag) som jag skulle behöva göra om (förstå) till php.
Det är följande:

240 int createNexaString(const char * pHouseStr, const char * pChannelStr, 241 const char * pOn_offStr, char * pTxStr, int waveman) 242 { 243 * pTxStr = '\0'; /* Make sure tx string is empty */ 244 int houseCode; 245 int channelCode; 246 int on_offCode; 247 int txCode = 0; 248 const int unknownCode = 0x6; 249 int bit; 250 int bitmask = 0x0001; 251 252 houseCode = (int)((* pHouseStr) - 65); /* House 'A'..'P' */ 253 channelCode = atoi(pChannelStr) - 1; /* Channel 1..16 */ 254 on_offCode = atoi(pOn_offStr); /* ON/OFF 0..1 */ 255 256 #ifdef RFCMD_DEBUG 257 printf("House: %d, channel: %d, on_off: %d\n", houseCode, channelCode, on_offCode); 258 #endif 259 260 /* check converted parameters for validity */ 261 if((houseCode < 0) || (houseCode > 15) || // House 'A'..'P' 262 (channelCode < 0) || (channelCode > 15) || 263 (on_offCode < 0) || (on_offCode > 1)) 264 { 265 266 } else { 267 /* b0..b11 txCode where 'X' will be represented by 1 for simplicity. 268 b0 will be sent first */ 269 txCode = houseCode; 270 txCode |= (channelCode << 4); 271 if (waveman && on_offCode == 0) { 272 } else { 273 txCode |= (unknownCode << 8); 274 txCode |= (on_offCode << 11); 275 } 276 277 /* convert to send cmd string */ 278 strcat(pTxStr,"S"); 279 for(bit=0;bit<12;bit++) 280 { 281 if((bitmask & txCode) == 0) { 282 /* bit timing might need further refinement */ 283 strcat(pTxStr," ` `"); /* 320 us high, 960 us low, 320 us high, 960 us low */ 284 /* strcat(pTxStr,"$k$k"); *//* 360 us high, 1070 us low, 360 us high, 1070 us low */ 285 } else { /* add 'X' (floating bit) */ 286 strcat(pTxStr," `` "); /* 320 us high, 960 us low, 960 us high, 320 us low */ 287 /*strcat(pTxStr,"$kk$"); *//* 360 us high, 1070 us low, 1070 us high, 360 us low */ 288 } 289 bitmask = bitmask<<1; 290 } 291 /* add stop/sync bit and command termination char '+'*/ 292 strcat(pTxStr," }+"); 293 /* strcat(pTxStr,"$}+"); */ 294 } 295 296 #ifdef RFCMD_DEBUG 297 printf("txCode: %04X\n", txCode); 298 #endif 299 300 return strlen(pTxStr); 301 }

Det enda jag inte förstår är typ:
281 if((bitmask & txCode) == 0) {
Jag är van att man måste ha 2 st && i en if-sats, men här det bara en, så vad betyder det?
bitmask är ju satt till "0x0001" och txCode defineras först på rad 269

Jag skulle gissa att pHouseStr är en bokstav i spannet A-P, men det konverteras tydligen till siffror nånstans, kan det vara här:
252 houseCode = (int)((* pHouseStr) - 65); /* House 'A'..'P' */

Vad betyder |= och << som tex finns här:
270 txCode |= (channelCode << 4);

Någon som kan reda ut dessa saker åt mig?

MVH Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Permalänk
Medlem

Inte helt enkelt att beskriva vad den gör om du inte har sett Binära nummer.
| är bitwise OR
<< är bitwise SHIFT LEFT, dar a << 4 är Bitwise shift left 4 steps.
( Ungefär /2 som sker XX ggr ; och avrundas nedåt )

tXcode |= a ; Betyder tXcode = txCode |_a;
På samma sätt som tXcode +=a ; Betyder tXcode = tXcode +a ;

Kommentarer pa C koden:
Dar C koden har " - 65 " det är inte bra skriven C kode det borde stå " - 'A' " istället.

* pTxStr = '�'; Där skulle jag vilja se *pTxStr = '\0' ; Eller kanske *pTxStr = 0 ;

Line 271-272 should really be put some other way.. Example:
if (waveman && on_offCode != 0) {
Det finns ett par stycken if satser som kunde skrivas enklare å det sättet.

Permalänk
Medlem

Okej, nu har jag försökt litegrann, men det där med bitwise verkade knepigt för mig tyvärr :/

Detta är vad jag åstadkommit hittils:

<?php echo getraw("NEXA","A","1","0")."<br>"; echo getraw("NEXA","C","3","1")."<br>"; function getraw($device,$house,$number,$toggle){ if($device=="NEXA"){ $unknownCode="0x6"; $bitmask="0x0001"; $raw="S"; $txCode = (ord($house)-65); $txCode |= ($number << 4); if($waveman && $toggle == 0){ } else{ $txCode |= ($unknownCode << 8); $txCode |= ($toggle << 11); } for($bit=0;$bit<12;$bit++){ if($bitmask & $txCode==0){ $raw.=" ` `"; } else{ $raw.=" `` "; } } $raw.=" }+"; } return $raw; } ?>

Men resultatet blir bara:
S `` `` `` `` `` `` `` `` `` `` `` `` }+
Oavsett vad jag anropar funktionen med.

Denna rad verkar inte bli sann nån gång:
if($bitmask & $txCode==0){

Nån som ser vad jag gör för fel?

/Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Hedersmedlem

Nu kan jag nog inte påstå att jag minns varken hur man tilldelar variabler hexadecimala värden eller hur php reagerar på oväntade variabelvärden, men borde det inte stå

$bitmask=0x0001;

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Elgot
Nu kan jag nog inte påstå att jag minns varken hur man tilldelar variabler hexadecimala värden eller hur php reagerar på oväntade variabelvärden, men borde det inte stå

$bitmask=0x0001;

Detta, och dessutom har du glömt paranteser runt ($bitmask & $txCode).

Permalänk
Medlem

Okej, nu ser koden ut såhär, men funkar fortfarande inte. Resultatat blir inte som jag förväntat mig :/

function getraw($device,$house,$number,$toggle){ if($device=="NEXA"){ $unknownCode=0x6; $bitmask=0x0001; $raw="S"; $txCode = (ord($house)-65); $txCode |= ($number << 4); if($waveman && $toggle == 0){ } else{ $txCode |= ($unknownCode << 8); $txCode |= ($toggle << 11); } for($bit=0;$bit<12;$bit++){ if(($bitmask & $txCode)==0){ $raw.=" ` `"; } else{ $raw.=" `` "; } } $raw.=" }+"; } } echo getraw("NEXA","A","1","0")."<br>";

Med ovanstående funktionsanrop förväntar jag mig detta svar:
S ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `` `` ` ` }+

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk

Bara en tanke, du skickar in 1 och 0 som strängar och använder bitskift på dessa, är det verkligen vad du vill göra?

Visa signatur

System.out.print(madness ? this.is.SPARTA : "");

Permalänk
Medlem

Även om jag kör:
echo getraw("NEXA","A",1,0)."<br>";
så får jag samma resultat.

Det jag vill göra är att göra om C-koden till PHP-kod

/niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Hedersmedlem

for($bit=0;$bit<12;$bit++){ if(($bitmask & $txCode)==0){ $raw.=" ` `"; } else{ $raw.=" `` "; } $bitmask = $bitmask << 1; //såhär }

Meningen var väl också att bitmask skulle skiftas; som det är nu testar man ju samma sak gång på gång...

Permalänk
Medlem

Ahh, nu börjar det likna nåt, klumpigt av mig å missa det där :/

Resultatet blir nu:
S ` ` ` ` ` ` ` ` `` ` ` ` ` ` ` ` ` `` `` ` ` }+
av
echo getraw("NEXA","A",1,0)."<br>";
Det är dock ett litet fel i den (rött)
Så här ska det se ut:
S ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `` `` ` ` }+

Får försöka gå igenom koden igen om nån annan inte hinner före mig

/niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av skorpion
Så här ska det se ut:
S ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `` `` ` ` }+

Kan det där verkligen stämma? Strängen skall väl bestå av grupperna " ` `" och " `` ", men då stämmer det inte riktigt:
S ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, `` ,`` ` ` }+
Den röda texten borde inledas med ett blanksteg.

Permalänk
Medlem

Elgot: Du har rätt, men det är forumet som tar bort dubbel-mellanslag tror jag :/

codetaggarna kanske funkar

Resultatet blir nu: S ` ` ` ` ` ` ` ` `` ` ` ` ` ` ` ` ` `` `` ` ` }+ av echo getraw("NEXA","A",1,0)."<br>"; Det är dock ett litet fel i den (rött) Så här ska det se ut: S ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `` `` ` ` }+

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Elgot
Kan det där verkligen stämma? Strängen skall väl bestå av grupperna " ` `" och " `` ", men då stämmer det inte riktigt:
S ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, `` ,`` ` ` }+
Den röda texten borde inledas med ett blanksteg.

Forumet strippar nog dubbla blanksteg om man inte använder [code].

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av skorpion

Så här ska det se ut: S ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `` `` ` ` }+

Det stämmer väl ändå inte?

Så här ska det se ut: S, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ``, ``, ` `, }+

De sista grupperna börjar med två blanksteg.

Permalänk
Medlem

Så här ska det se ut: S, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, `` , `` , ` `, }+

Nu så bör det stämma

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av skorpion

Så här ska det se ut: S, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, ` `, `` , `` , ` `, }+

Nu så bör det stämma

Det var bättre. Den här då?

Resultatet blir nu: S, ` `, ` `, ` `, ` `, `` ,` ` ,` ` ,` ` ,` ` , `` , `` , ` `, }+

Permalänk
Medlem

Testa den här,

function createNexaString($sHouse, $iChannelCode, $bOnOffCode, $iWaveman){ /* $sHouse (string) motsv. pHouseStr $iChannelCode (int) motsv. pChannelStr, 0<x<16 $bOnOffCode (bool) motsv. pOn_offStr, true/false $iWaveman (int) motsv. waveman */ $sOutput = ''; $iCode = 0; $iUnknownCode = 0x6; $iBitmask = 0x0001; $iHouseCode = ord($sHouse) - 65; $iOnOffCode = $bOnOffCode ? 1 : 0; if(!(($iHouseCode < 0) || ($iHouseCode > 15) || ($iChannelCode < 0) || ($iChannelCode > 15))){ $iCode = $iHouseCode; $iCode |= ($iChannelCode << 4); if(!($iWaveman != 0 && $iOnOffCode == 0)){ $iCode |= ($iUnknownCode << 8); $iCode |= ($iOnOffCode << 11); } $sOutput .= "S"; for($iBit=0;$iBit<12;$iBit++){ if(($iBitmask & $iCode) == 0){ $sOutput .= " ` `"; }else{ $sOutput .= " `` "; } $iBitmask = $iBitmask << 1; } $sOutput .= " }+"; } return $sOutput; } header("Content-type: text/plain"); print_r("VAL: ".createNexaString("A", 0, false, 0)."\n"); print_r("REF: S ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `` `` ` ` }+\n\n");

Edit: Ja, det är "fel" $channel, men detta är i princip en exakt kopia av C-koden, så det ska fungera så här. Kanalerna börjar säkert räknas från 0, inte 1.

Permalänk
Medlem

You: Måste tacka dig för arbetet du gjorde av att göra om C till PHP. Stort TACK!

Det fungerar relativt bra, bara det att (som du skrev) att channel börjar på 0, vilket är fel. Den ska börja på 1
Så med den koden du gjorde så är channel alltid -1 av vad som skall vara.

Kort och gott så fick jag ändra:
$iCode |= ($iChannelCode << 4);
till:
$iCode |= (($iChannelCode-1) << 4);

Nu när jag såg detta så fungerar min gamla kod oxå, bara å subtrahera där oxå.

function getraw($device,$house,$number,$toggle){ if($device=="NEXA"){ $unknownCode=0x6; $bitmask=0x0001; $raw="S"; $txCode = (ord($house)-65); $txCode |= (($number-1) << 4); if($waveman && $toggle == 0){ } else{ $txCode |= ($unknownCode << 8); $txCode |= ($toggle << 11); } for($bit=0;$bit<12;$bit++){ if(($bitmask & $txCode)==0){ $raw.=" ` `"; } else{ $raw.=" `` "; } $bitmask = $bitmask << 1; //såhär } $raw.=" }+"; } if($device=="RISINGSUN"){ $raw="S.e"; for($i=1;$i<=4;$i++){ if($i==$house){ $raw.=".e.e"; } else{ $raw.="e..e"; } } for($i=1;$i<=4;$i++){ if($i==$number){ $raw.=".e.e"; } else{ $raw.="e..e"; } } if($toggle>=1){ $raw.="e..ee..ee..ee..e+"; } else{ $raw.="e..ee..ee..e.e.e+"; } } return $raw; } echo getraw("NEXA","C",5,1)."<br>"; echo getraw("NEXA","A",1,0)."<br>";

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av skorpion
Det fungerar relativt bra, bara det att (som du skrev) att channel börjar på 0, vilket är fel. Den ska börja på 1

Såg att jag missade följande bit i C-koden:

253 channelCode = atoi(pChannelStr) - 1; /* Channel 1..16 */

Det är därför channel blir fel

Permalänk
Medlem

Hehe, jag missade ju oxå den där lilla, men vitala delen.

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem

vad gör koden?

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Medlem

Det är en bit kod från ett program som räknar ut RAW-kod som skall skickas till en RF-mottagare.
Sändaren är en Tellstick (http://telldus.se) och mottagaren är tex en NEXA/PROOVE/WAVEMAN strömbrytare

Det är en del i mitt projekt:
http://www.sweclockers.com/forum/showthread.php?s=&threadid=8...
http://www.telldus.se/forum/viewtopic.php?t=378&start=15&post...

Nu finns det ju ett program som gör denna omvandlingen åt mig, men en del personer vill kunna använda ett annat program som arbetar på ett helt annat sätt. Därför behöver jag kunna räkna ut RAW-koder själv

/niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare