//LATEST VERSION in ENGINEERING... workign version in FIU-SCS import stamp.core.*; import stamp.util.*; public class javelin1{ //pins for the rfid reader and the rf receiver final static int rxPinCard = CPU.pin2; final static int rxPinBatt = CPU.pin9; //Uart objects that will receive the information static Uart rxCard = new Uart(Uart.dirReceive, rxPinCard, Uart.dontInvert, Uart.speed2400,Uart.stop1); static Uart rxBatt = new Uart(Uart.dirReceive, rxPinBatt, Uart.dontInvert, Uart.speed2400,Uart.stop1); static StringBuffer bufferCard = new StringBuffer(128); static StringBuffer bufferBatt = new StringBuffer(128); static char charCard; static char charBatt; static int indexCard =0; static int indexBatt =0; static boolean startCard = false; static boolean startBatt = false; static StringBuffer bufferCardW = new StringBuffer(128); static StringBuffer bufferBattW = new StringBuffer(128); static char charCardW; static char charBattW; static int indexCardW =0; static int indexBattW =0; static boolean startCardW = false; static boolean startBattW = false; static boolean stopCard = false; static boolean stopBatt = false; static EEPROM e = new EEPROM(); //XOR function for decoding the signal received from the rf receiver public static char[] xor(char[] password, char[] key) { char[] result = new char[password.length]; for (int i=0; i 13) return false; int x; int i; if (card){ i = 0; x = 10; } else { i= 20; x =13; } char[] one = s.toCharArray(); for (int y = 0 ;y < x; y++) { EEPROM.write(y+i,(byte)one[y]); } return true; } public static String readMem(boolean card) { char[] conv; int start; if (card) { conv = new char[10]; start = 0;} else { conv = new char[13]; start = 20;} for (int i=0;i < conv.length; i++) { conv[i] = (char)EEPROM.read(start + i); } return new String(conv); } public static void eraseMem(boolean card) { int x; int i; if (card){ i = 0; x = 10; } else { i= 20; x =13; } for (int y=0;y < x; y++) { EEPROM.write(y+i, (byte)'0'); } return; } public static void main(){ char[] key = "this2is4my5secret".toCharArray(); try{ while (true) { //wait for multiple bytes to receive if ((CPU.readPin(CPU.pin4) == true)) { //WE ARE IN PROGRAMMING MODE if (rxCard.byteAvailable() && !stopCard) { charCardW = (char)rxCard.receiveByte(); if (!startCardW) { if (charCardW == '\n') startCardW = true; //WAIT($0A) } else { bufferCardW.append(charCardW); indexCardW++; if (indexCardW == 10) { boolean exists = false; //System.out.println("Card RX: " + bufferCardW.toString()); for (int i = 0; i<5 ; i++) if (bufferCardW.equals(readMem(true))) exists = true; if((CPU.readPin(CPU.pin3) == true)) { if(exists) eraseMem(true); } else { if(!exists) writeMem(bufferCardW.toString(),true); } CPU.nap(7); indexCardW =0; startCardW = false; bufferCardW.clear(); stopCard = true; } } } else if (rxBatt.byteAvailable() && !stopBatt){ charBattW = (char)rxBatt.receiveByte(); if (!startBattW) { if(charBattW == '+'){ startBattW = true;} } else { bufferBattW.append(charBattW); indexBattW++; if (indexBattW == 17) { char[] store = bufferBattW.toNewString().toCharArray(); StringBuffer finalSB = new StringBuffer(new String(xor(store, key))); String ssda = finalSB.subString(0,13).toNewString(); //System.out.println("Batt RX: " + ssda); boolean exists2 = false; for (int i = 0; i < 5; i++) if(ssda.equals(readMem(false))) exists2 = true; if((CPU.readPin(CPU.pin3) == true)) { if(exists2) eraseMem(false); } else{ if(!exists2) writeMem(ssda,false); } CPU.nap(7); indexBattW = 0; startBattW = false; bufferBattW.clear(); stopBatt = true; } } } } else { // WE ARE IN OPERATION MODE if (rxCard.byteAvailable()) { charCard = (char)rxCard.receiveByte(); if (!startCard) { if (charCard == '\n') startCard = true; //WAIT($0A) } else { bufferCard.append(charCard); indexCard++; if (indexCard == 10) { if (bufferCard.equals(readMem(true))){ CPU.writePin(CPU.pin6, true); CPU.writePin(CPU.pin12, false); CPU.nap(2); CPU.writePin(CPU.pin12, true); CPU.writePin(CPU.pin6, false); CPU.nap(7); } indexCard =0; //reset buf index startCard = false; //wait for $0A again bufferCard.clear(); } } } else if (rxBatt.byteAvailable()){ charBatt = (char)rxBatt.receiveByte(); if (!startBatt) { if (charBatt == '+') startBatt = true; } else { //System.out.println(charBatt); bufferBatt.append(charBatt); indexBatt++; if (indexBatt == 17) { String secret2 = bufferBatt.toNewString(); char[] s = bufferBatt.toNewString().toCharArray(); StringBuffer strb = new StringBuffer(new String(xor(s, key))); if (strb.subString(0,13).equals(readMem(false)) && (Integer.parseInt(strb.subString(13,strb.length())) > 500)){ CPU.writePin(CPU.pin6, true); CPU.writePin(CPU.pin12, false); CPU.nap(2); CPU.writePin(CPU.pin12, true); CPU.writePin(CPU.pin6, false); CPU.nap(7); } indexBatt = 0; startBatt = false; bufferBatt.clear(); } } } } } } catch(Exception e) { System.out.println(e.getMessage()); } } }