From 66e7f4294add8187531b24ab1a9ee416ef3facc3 2016-09-29 14:19:08 From: Juan C. Espinoza Date: 2016-09-29 14:19:08 Subject: [PATCH] Update RC model, RC api for testing git-svn-id: http://jro-dev.igp.gob.pe/svn/jro_hard/radarsys/trunk/webapp@208 aa17d016-51d5-4e8b-934c-7b2bbb1bbe71 --- diff --git a/apps/main/models.py b/apps/main/models.py index d8f20c0..bf18f8f 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -1,11 +1,14 @@ -from django.shortcuts import render, redirect, get_object_or_404, HttpResponse + from datetime import datetime -from django.db import models -from polymorphic.models import PolymorphicModel +try: + from polymorphic.models import PolymorphicModel +except: + from polymorphic import PolymorphicModel +from django.db import models from django.core.urlresolvers import reverse - +from django.shortcuts import get_object_or_404 CONF_STATES = ( (0, 'Disconnected'), @@ -26,11 +29,12 @@ CONF_TYPES = ( (1, 'Historical'), ) -DEV_STATES = ( +DEV_STATES = ( (0, 'No connected'), (1, 'Connected'), (2, 'Configured'), (3, 'Running'), + (4, 'Unknown'), ) DEV_TYPES = ( @@ -123,13 +127,16 @@ class Device(models.Model): color = "success" return color - - @property - def url(self): + + def url(self, path=None): + + if path: + return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path) + else: + return 'http://{}:{}/'.format(self.ip_address, self.port_address) - return 'http://{}:{}/'.format(self.ip_address, self.port_address) - def get_absolute_url(self): + return reverse('url_device', args=[str(self.id)]) @@ -570,27 +577,32 @@ class Configuration(PolymorphicModel): def status_device(self): - raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()) + self.message = 'Function not implemented' + return False def stop_device(self): - raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()) + self.message = 'Function not implemented' + return False def start_device(self): - raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()) + self.message = 'Function not implemented' + return False def write_device(self, parms): - raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()) + self.message = 'Function not implemented' + return False def read_device(self): - raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()) + self.message = 'Function not implemented' + return False def get_absolute_url(self): diff --git a/apps/main/views.py b/apps/main/views.py index 712ec1a..1c44250 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -1141,7 +1141,7 @@ def dev_conf_start(request, id_conf): else: messages.error(request, conf.message) - conf.status_device() + #conf.status_device() return redirect(conf.get_absolute_url()) @@ -1155,7 +1155,7 @@ def dev_conf_stop(request, id_conf): else: messages.error(request, conf.message) - conf.status_device() + #conf.status_device() return redirect(conf.get_absolute_url()) @@ -1176,17 +1176,9 @@ def dev_conf_write(request, id_conf): conf = get_object_or_404(Configuration, pk=id_conf) - answer = conf.write_device() - conf.status_device() - - if answer: - messages.success(request, conf.message) - - #Creating a historical configuration - conf.clone(type=1, template=False) - - #Original configuration - conf = DevConfModel.objects.get(pk=id_conf) + if conf.write_device(): + messages.success(request, conf.message) + conf.clone(type=1, template=False) else: messages.error(request, conf.message) @@ -1202,7 +1194,7 @@ def dev_conf_read(request, id_conf): if request.method=='GET': parms = conf.read_device() - conf.status_device() + #conf.status_device() if not parms: messages.error(request, conf.message) diff --git a/apps/rc/models.py b/apps/rc/models.py index 853da79..e1c3dab 100644 --- a/apps/rc/models.py +++ b/apps/rc/models.py @@ -4,6 +4,7 @@ import json import requests import numpy as np from base64 import b64encode +from struct import pack from django.db import models from django.core.urlresolvers import reverse @@ -454,66 +455,114 @@ class RCConfiguration(Configuration): def status_device(self): - try: - req = requests.get(self.device.url) + try: + req = requests.get(self.device.url('status')) payload = req.json() if payload['status']=='ok': - self.device.status = 3 - else: self.device.status = 1 - except: + else: + self.device.status = 0 + except Exception as e: self.device.status = 0 + self.message = str(e) + return False - self.device.save() - - return self.device.status + self.device.save() + return True def reset_device(self): - payload = bytearray() - payload.extend(self.add_cmd('RESTART')) - data = b64encode(payload) - req = requests.put(self.device.url, data) + try: + req = requests.post(self.device.url('reset')) + if 'ok' in req.text: + self.message = 'RC restarted' + else: + self.message = 'RC restart not ok' + self.device.status = 4 + self.device.save() + except Exception as e: + self.message = str(e) + return False + + return True - if data==req.text.encode('utf8'): - return 1 - else: - return 0 - def stop_device(self): - payload = bytearray() - payload.extend(self.add_cmd('DISABLE')) - data = b64encode(payload) - req = requests.put(self.device.url, data) - - if data==req.text.encode('utf8'): - return 1 - else: - return 0 + try: + req = requests.post(self.device.url('stop')) + if 'ok' in req.text: + self.device.status = 2 + self.device.save() + self.message = 'RC stopped' + else: + self.message = 'RC stop not ok' + self.device.status = 4 + self.device.save() + return False + except Exception as e: + self.message = str(e) + return False + + return True def start_device(self): - payload = bytearray() - payload.extend(self.add_cmd('ENABLE')) - data = b64encode(payload) - req = requests.put(self.device.url, data) - - if data==req.text.encode('utf8'): - return 1 - else: - return 0 + try: + req = requests.post(self.device.url('start')) + if 'ok' in req.text: + self.device.status = 3 + self.device.save() + self.message = 'RC running' + else: + self.message = 'RC start not ok' + return False + except Exception as e: + self.message = str(e) + return False + + return True def write_device(self): - data = b64encode(self.parms_to_binary(dat=False)) - req = requests.put(self.device.url, data) - print(req.text) - if data==req.text.encode('utf8'): - return 1 - else: - return 0 + values = zip(self.get_pulses(), + [x-1 for x in self.get_delays()]) + payload = '' + + for tup in values: + vals = pack('-?\d+)/import/$', views.import_file, name='url_import_rc_conf'), url(r'^(?P-?\d+)/edit/$', views.conf_edit, name='url_edit_rc_conf'), url(r'^(?P-?\d+)/plot/$', views.plot_pulses, name='url_plot_rc_pulses'), - url(r'^(?P-?\d+)/plot2/$', views.plot_pulses2, name='url_plot_rc_pulses'), + url(r'^(?P-?\d+)/plot2/$', views.plot_pulses2, name='url_plot_rc_pulses2'), #url(r'^(?P-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_rc_conf'), #url(r'^(?P-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_rc_conf'), diff --git a/devices/rc/api.py b/devices/rc/api.py index 1d7b923..bdd4d76 100644 --- a/devices/rc/api.py +++ b/devices/rc/api.py @@ -1,134 +1,98 @@ ''' -Created on Dec 2, 2014 +API to configure new Radar controller -@author: Miguel Urco - -eth_device decorator is used to implement an api to ethernet devices. -When eth_device decorator is used it adds two parameters to any function (ip and port) - -#Definition - -@eth_device -def enable_rf() - cmd = "xxxxx" - payload = "xxxxxx" - - return cmd, payload - -#How to call this function: -answer = enable_rf(ip, port) +@author: Juan C. Espinoza ''' -from devices.jro_device import eth_device, IdClass - -ID_CLASS = IdClass["rc"] - -CMD_RESET =0X01 -CMD_ENABLE =0X02 -CMD_CHANGEIP =0X03 -CMD_STATUS =0X04 -CMD_DISABLE =0X02 -CMD_ECHO =0XFE - -RC_CMD_RESET =0X10 -RC_CMD_WRITE =0x50 -RC_CMD_READ =0x8000 - -@eth_device(ID_CLASS) -def reset(): - - cmd = CMD_RESET - payload = "" - - return cmd, payload - -@eth_device(ID_CLASS) -def change_ip(ip, mask="255.255.255.0", gateway="0.0.0.0"): - - cmd = CMD_CHANGEIP - payload = ip + '/' + mask + '/' + gateway - - return cmd, payload - -@eth_device(ID_CLASS) -def status(): - - cmd = CMD_STATUS - payload = "" - - return cmd, payload - -@eth_device(ID_CLASS) -def echo(): - - cmd = CMD_ECHO - payload = "" - - return cmd, payload - -@eth_device(ID_CLASS) -def read_all_device(): +import os +import json +import requests +from struct import pack +from base64 import b64encode + +class RCApi(object): + + def __init__(self, ip, port=80): + + self.url = 'http://{}:{}/'.format(ip, port) + self.params = None + + def load(self, filename): + + self.params = json.load(open(filename)) + print 'RC Configuration: {}'.format(self.params['name']) + + def status(self): + + url = os.path.join(self.url, 'status') + req = requests.get(url) + return req.json() + + def read(self): + + url = os.path.join(self.url, 'read') + req = requests.get(url) + return req.json() + + def stop(self): + + url = os.path.join(self.url, 'stop') + req = requests.post(url) + return req.json() + + def reset(self): + + url = os.path.join(self.url, 'reset') + req = requests.post(url) + return req.json() + + def start(self): + + url = os.path.join(self.url, 'start') + req = requests.post(url) + return req.json() + + def write(self): + + url_write = os.path.join(self.url, 'write') + url_divider = os.path.join(self.url, 'divisor') + + values = zip(self.params['pulses'], + [x-1 for x in self.params['delays']]) + payload = '' + + for tup in values: + vals = pack('> 8) - -@eth_device(ID_CLASS) -def write_ram_memory(vector_valores, vector_tiempos): - - l1 = len(vector_valores) - l2 = len(vector_tiempos) - - cad = "" +if __name__ == '__main__': + + ip = '10.10.10.100' + filename = '/home/jespinoza/Downloads/rc_150EEJ.json' - for i in range(l1): - cad += ord(84) + __get_low_byte(vector_valores[i]) + ord(85) + __get_high_byte(vector_valores[i]) + \ - ord(84) + __get_low_byte(vector_tiempos[i]) + ord(85) + __get_high_byte(vector_tiempos[i]) + rc = RCApi(ip) + rc.load(filename) + + print rc.status() + print rc.reset() + print rc.stop() + print rc.write() + print rc.start() + + + - return RC_CMD_WRITE, cad -if __name__ == '__main__': - ip = "10.10.20.150" - port = 2000 - print(status(ip, port)) - print(read_config(ip, port)) diff --git a/devices/rc/data.py b/devices/rc/data.py deleted file mode 100644 index 1c44791..0000000 --- a/devices/rc/data.py +++ /dev/null @@ -1,26 +0,0 @@ -''' -Created on Feb 15, 2016 - -@author: Miguel Urco -''' -import struct - -def rc_str_to_dict(registers): - - parms = {'clock' : 10 - } - - return parms - -def dict_to_rc_str(parms): - """ - Input: - parms : Dictionary with keys - """ - - my_dict = {'clock' : 10 - } - - registers = ord(my_dict['clock']) - - return registers \ No newline at end of file