code: def _param_updated(self, pk):
          
          if self._useV2:
              var_id = struct.unpack('<H', pk.data[:2])[0]
          else:
              var_id = pk.data[0]
          element = self.toc.get_element_by_id(var_id)
          if element:
              if self._useV2:
                  s = struct.unpack(element.pytype, pk.data[2:])[0]
              else:
                  s = struct.unpack(element.pytype, pk.data[1:])[0]
              s = s.__str__()
              complete_name = '%s.%s' % (element.group, element.name)
  
              # Save the value for synchronous access
              if element.group not in self.values:
                  self.values[element.group] = {}
              self.values[element.group][element.name] = s
  
              logger.debug('Updated parameter [%s]' % complete_name)
              if complete_name in self.param_update_callbacks:
                  self.param_update_callbacks[complete_name].call(
                      complete_name, s)
              if element.group in self.group_update_callbacks:
                  self.group_update_callbacks[element.group].call(
                      complete_name, s)
              self.all_update_callback.call(complete_name, s)
  
              # Once all the parameters are updated call the
              # callback for "everything updated" (after all the param
              # updated callbacks)
              if self._check_if_all_updated() and not self.is_updated:
                  self.is_updated = True
                  self.all_updated.call()
          else:
              logger.debug('Variable id [%d] not found in TOC', var_id)
docs: Callback with data for an updated parameter