Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't find logical error with my switch compare Python program

Tags:

python

I am trying to write a simple Python program that will hook to a little microcontroller alarm project I'm working on. The microcontroller is connected to eight switches. It outputs a binary value based on the switch state over a serial port.

I'm trying to write the python program decoder and am using hard coded values to check my logic. Here's what I've written:

switches='11011101'
currentstate = {}
prevstate = {}


def initswitches():
        for x in range (0,8):
                name = "switch" + str(x)
                currentstate[name] = switches[x]
                prevstate[name] = switches[x]

def setswitches():
        for x in range (0,8):
                name = "switch" + str(x)
                currentstate[name] = switches[x]

def checkswitches():
        for switch in range (0,8):
                name = "switch" + str(switch)
                if ( currentstate[name] != prevstate[name]):
                        print name + " value changed to " + str(switch)


initswitches()

for y in range (0,2):

        setswitches()
        print "Loop" + str(y)
        print "Switches:"
        print switches
        print "Current state:"
        print currentstate
        print "Previous state:"
        print prevstate


        checkswitches()

        prevstate = currentstate
        switches='01001001'
        print
        print

and here's the output:

Loop0
Switches:
11011101
Current state:
{'switch3': '1', 'switch2': '0', 'switch1': '1', 'switch0': '1', 'switch7': '1', 'switch6': '0', 'switch5': '1', 'switch4': '1'}
Previous state:
{'switch3': '1', 'switch2': '0', 'switch1': '1', 'switch0': '1', 'switch7': '1', 'switch6': '0', 'switch5': '1', 'switch4': '1'}

Loop1
Switches:
01001001
Current state:
{'switch3': '0', 'switch2': '0', 'switch1': '1', 'switch0': '0', 'switch7': '1', 'switch6': '0', 'switch5': '0', 'switch4': '1'}
Previous state:
{'switch3': '0', 'switch2': '0', 'switch1': '1', 'switch0': '0', 'switch7': '1', 'switch6': '0', 'switch5': '0', 'switch4': '1'}

As you can see, I am able to set the binary values to each switch correctly to current state, but for some reason previous state is always matching current state. Loop0 shows expected behavior, but Loop1 should have previous state matching what was output for Loop0 . I cannot find where I am setting previous state to match currentstate before the checkswitches function is called. Can someone tell me where I am going wrong?

like image 440
dinki Avatar asked Mar 22 '23 06:03

dinki


1 Answers

prevstate = currentstate

redirects the variable prevstate to equal the currentstate dict. prevstate is now literally the same object as currentstate. Doing so makes all changes to currentstate affect prevstate too.

To fix, make prevstate a copy of currentstate:

prevstate = currentstate.copy()

Alternatively, you could update prevstate with the key-value pairs in currentstate:

prevstate.update(currentstate)

This second option is perhaps preferable since you would be creating (and subsequently throwing away) fewer objects.

like image 117
unutbu Avatar answered Apr 06 '23 08:04

unutbu