Java

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Java

OdgovorNapisal/-a s54mtb » 31 Jan 2019, 01:32

Mučim se z javo, kjer ni tako c-jevsko naravnano, ampak je treba vse "peš na roke".

Kako bi tole naredil bolj elegantno (predvsem tisto ponavljajočo konverzijo single precision v vrednost):

Koda: Izberi vse
function Decoder(bytes, port) {
  // Decode an uplink message from a buffer
  // (array) of bytes to an object of fields.
  var decoded = {};
  var bits;
  var sign;
  var e;
  var m;
   var f;
      
   if (port === 0x21) // PM Sensor
   {
     bits = bytes[2]<<8 | bytes[1];
     decoded.PM2_5 = bits;
     bits = bytes[4]<<8 | bytes[3];
     decoded.PM10 = bits;
   }

if (port === 0x24) // SHT31
   {
     bits = bytes[4]<<24 | bytes[3]<<16 | bytes[2]<<8 | bytes[1];
     decoded.SHT_Temp = bits / 1000;
     bits = bytes[8]<<24 | bytes[7]<<16 | bytes[6]<<8 | bytes[5];
     decoded.SHT_RH = bits / 1000;
   }

   
if (port === 0x25) // BME280
   {
     bits = bytes[4]<<24 | bytes[3]<<16 | bytes[2]<<8 | bytes[1];
       sign = (bits>>>31 === 0) ? 1.0 : -1.0;
       e = bits>>>23 & 0xff;
       m = (e === 0) ? (bits & 0x7fffff)<<1 : (bits & 0x7fffff) | 0x800000;
       f = sign * m * Math.pow(2, e - 150);
       decoded.BME280_Temp = f;
      
     bits = bytes[8]<<24 | bytes[7]<<16 | bytes[6]<<8 | bytes[5];
        sign = (bits>>>31 === 0) ? 1.0 : -1.0;
       e = bits>>>23 & 0xff;
       m = (e === 0) ? (bits & 0x7fffff)<<1 : (bits & 0x7fffff) | 0x800000;
       f = sign * m * Math.pow(2, e - 150);
     decoded.BME280_RH = f;

     bits = bytes[12]<<24 | bytes[11]<<16 | bytes[10]<<8 | bytes[9];
        sign = (bits>>>31 === 0) ? 1.0 : -1.0;
       e = bits>>>23 & 0xff;
       m = (e === 0) ? (bits & 0x7fffff)<<1 : (bits & 0x7fffff) | 0x800000;
       f = sign * m * Math.pow(2, e - 150);
     decoded.BME280_PRESS = f;

   }

  return decoded;
}




Dela sicer prav, primer....

Pri bytes:
Koda: Izberi vse
25 34 E7 C8 41 2F 6C 57 42 D2 C3 BE 47


in port = 0x25 vrne:
Koda: Izberi vse
{
  "BME280_PRESS": 97671.640625,
  "BME280_RH": 53.855648040771484,
  "BME280_Temp": 25.112892150878906,
  "channel": 37
}
Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 11327
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1571 krat
Prejel zahvalo: 4114 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 104

Re: Java

OdgovorNapisal/-a blasny » 31 Jan 2019, 11:33

glej https://docs.oracle.com/javase/8/docs/a ... uffer.html

npr.
Koda: Izberi vse
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
float temp = byteBuffer.getFloat();
float rh = byteBuffer.getFloat();


byte ordering prepuscam tebi.

btw. uporaba 'var' namesto explicitne deklaracije tipov v tvojem primeru je kontraproduktivna, ker si mora potem bralec kode razbijat glavo katerih tipov so spremenljivke.
o tem, da so spremenljivke evil, in da jih na koncu sploh ne bos rabil pa drugic.
blasny
 
Prispevkov: 446
Pridružen: 18 Jan 2015, 16:48
Kraj: Tepanjce
Zahvalil se je: 321 krat
Prejel zahvalo: 123 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 15

Re: Java

OdgovorNapisal/-a s54mtb » 31 Jan 2019, 13:54

Sem ugotovil, da je dejansko ECMAScript 5.

takole sem malo "pospravil":
Koda: Izberi vse
function Decoder(bytes, port) {
  // Decode an uplink message from a buffer
  // (array) of bytes to an object of fields.
   

  // Based on https://stackoverflow.com/a/37471538 by Ilya Bursov
  function bytesToFloat(bits) {
    // JavaScript bitwise operators yield a 32 bits integer, not a float.
    // Assume LSB (least significant byte first).
   
    var sign = (bits>>>31 === 0) ? 1.0 : -1.0;
    var e = bits>>>23 & 0xff;
    var m = (e === 0) ? (bits & 0x7fffff)<<1 : (bits & 0x7fffff) | 0x800000;
    var f = sign * m * Math.pow(2, e - 150);
    return f;
  } 
     
       
         
  var decoded = {};
  var bits;
  var sign;
  var e;
  var m;
   var f;
      
   if (port === 0x21) // PM Sensor
   {
     bits = bytes[2]<<8 | bytes[1];
     decoded.PM2_5 = bits;
     bits = bytes[4]<<8 | bytes[3];
     decoded.PM10 = bits;
   }

if (port === 0x24) // SHT31
   {
     bits = bytes[4]<<24 | bytes[3]<<16 | bytes[2]<<8 | bytes[1];
     decoded.SHT_Temp = bits / 1000;
     bits = bytes[8]<<24 | bytes[7]<<16 | bytes[6]<<8 | bytes[5];
     decoded.SHT_RH = bits / 1000;
   }

   
if (port === 0x25) // BME280
   {
       decoded.BME280_Temp = bytesToFloat(bytes[4]<<24 | bytes[3]<<16 | bytes[2]<<8 | bytes[1]);   
     decoded.BME280_RH = bytesToFloat(bytes[8]<<24 | bytes[7]<<16 | bytes[6]<<8 | bytes[5]);
     decoded.BME280_PRESS = bytesToFloat(bytes[12]<<24 | bytes[11]<<16 | bytes[10]<<8 | bytes[9]);
   }

  decoded.channel = bytes[0];
  return decoded;
}

Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 11327
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1571 krat
Prejel zahvalo: 4114 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 104


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost