#!/usr/bin/env python
# -*-coding=utf8 -*-
"""
@version: v1.0
@author: jayzhen
@license: Apache Licence
@contact: jayzhen_testing@163.com
@site: http://blog.csdn.net/u013948858
@software: PyCharm
"""
# 需要安装pychartdir模块
import string
from com.framework.core.adb.AdbCommand import AdbCmder
from pychartdir import *


class AppPerformanceMonitor():
    def  __init__(self,sno,times,pkg_name):
        # 打开待测应用,运行脚本,默认times为30次(可自己手动修改次数),获取该应用cpu、memory占用率的曲线图,图表保存至chart目录下
        self.utils = AdbCmder()
        self.sno = sno
        if times is None or time == "":
            self.times = 30        #top次数
        else:
            self.times = string.atoi(times)
            if self.times < 15 and self.times > 0:
                self.times = 20
        if pkg_name is None or pkg_name == "":
            self.pak_name = self.utils.get_current_package_name(sno)
        else:
            self.pkg_name = pkg_name          # 设备当前运行应用的包名

    # 获取cpu、mem占用
    def top(self):
        cpu = []
        mem = []
        top_info = self.utils.shell(self.sno, "top -n %s | findstr %s$" %(str(self.times), self.pkg_name)).stdout.readlines()
    #  PID PR CPU% S #THR VSS RSS PCY UID Name
        for info in top_info:
            # temp_list = del_space(info)
            temp_list = info.split()
            cpu.append(temp_list[2])
            mem.append(temp_list[6])
        return cpu, mem

    # 绘制线性图表,具体接口的用法查看ChartDirecto的帮助文档
    def line_chart(self, data):
        PATH = lambda p: os.path.abspath(p)
        cpu_data = []
        mem_data = []
        # 去掉cpu占用率中的百分号,并转换为int型
        for cpu in data[0]:
            cpu_data.append(string.atoi(cpu.split("%")[0]))
        # 去掉内存占用中的单位K,并转换为int型,以M为单位
        for mem in data[1]:
            mem_data.append(string.atof(mem.split("K")[0])/1024)

        # 横坐标
        labels = []
        for i in range(1, self.times + 1):
            labels.append(str(i))

        # 自动设置图表区域宽度
        if self.times <= 50:
            xArea = self.times * 40
        elif 50 < self.times <= 90:
            xArea = self.times * 20
        else:
            xArea = 1800

        c = XYChart(xArea, 800, 0xCCEEFF, 0x000000, 1)
        c.setPlotArea(60, 100, xArea - 100, 650)
        c.addLegend(50, 30, 0, "arialbd.ttf", 15).setBackground(Transparent)

        c.addTitle("cpu and memery info(%s)" %self.pkg_name, "timesbi.ttf", 15).setBackground(0xCCEEFF, 0x000000, glassEffect())
        c.yAxis().setTitle("The numerical", "arialbd.ttf", 12)
        c.xAxis().setTitle("Times", "arialbd.ttf", 12)

        c.xAxis().setLabels(labels)

        # 自动设置X轴步长
        if self.times <= 50:
            step = 1
        else:
            step = self.times / 50 + 1

        c.xAxis().setLabelStep(step)

        layer = c.addLineLayer()
        layer.setLineWidth(2)
        layer.addDataSet(cpu_data, 0xff0000, "cpu(%)")
        layer.addDataSet(mem_data, 0x008800, "mem(M)")

        path = PATH("%s/chart" %os.getcwd())
        if not os.path.isdir(path):
            os.makedirs(path)

        # 图片保存至脚本当前目录的chart目录下
        c.makeChart(PATH("%s/%s.png" %(path, self.utils.timestamp())))