791 {
792 epics::pvData::ScalarArrayConstPtr scalarArrayConstPtr;
793 epics::pvData::PVScalarArrayPtr pvScalarArrayPtr;
794 long i = 0;
795 scalarArrayConstPtr = std::tr1::static_pointer_cast<const epics::pvData::ScalarArray>(PVFieldPtr->getField());
796 pvScalarArrayPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalarArray>(PVFieldPtr);
797
798 if (monitorMode) {
799 i = 0;
800 if (pva->pvaData[index].numMonitorReadings == 0) {
801 pva->pvaData[index].fieldType = scalarArrayConstPtr->getType();
802 pva->pvaData[index].scalarType = scalarArrayConstPtr->getElementType();
803 pva->pvaData[index].numMonitorElements = pvScalarArrayPtr->getLength();
804 } else {
805 if (pva->pvaData[index].nonnumeric) {
806 for (long k = 0; k < pva->pvaData[index].numMonitorElements; k++) {
807 if (pva->pvaData[index].monitorData[0].stringValues[k])
808 free(pva->pvaData[index].monitorData[0].stringValues[k]);
809 }
810 }
811 }
812 } else {
813 i = pva->pvaData[index].numGetReadings;
814 if (pva->pvaData[index].numGetReadings == 0) {
815 pva->pvaData[index].fieldType = scalarArrayConstPtr->getType();
816 pva->pvaData[index].scalarType = scalarArrayConstPtr->getElementType();
817 pva->pvaData[index].numGetElements = pvScalarArrayPtr->getLength();
818 } else if (pva->limitGetReadings) {
819 i = 0;
820 }
821 }
822 switch (pva->pvaData[index].scalarType) {
823 case epics::pvData::pvDouble:
824 case epics::pvData::pvFloat:
825 case epics::pvData::pvLong:
826 case epics::pvData::pvULong:
827 case epics::pvData::pvInt:
828 case epics::pvData::pvUInt:
829 case epics::pvData::pvShort:
830 case epics::pvData::pvUShort: {
831 epics::pvData::PVDoubleArray::const_svector dataVector;
832 pvScalarArrayPtr->PVScalarArray::getAs<double>(dataVector);
833 if (monitorMode) {
834 if (pva->pvaData[index].monitorData[0].values == NULL) {
835 pva->pvaData[index].monitorData[0].values = (double *)malloc(sizeof(double) * pva->pvaData[index].numMonitorElements);
836 pva->pvaData[index].numeric = true;
837 }
838 std::copy(dataVector.begin(), dataVector.begin() + pva->pvaData[index].numMonitorElements, pva->pvaData[index].monitorData[0].values);
839 } else {
840 if (pva->pvaData[index].getData[i].values == NULL) {
841 pva->pvaData[index].getData[i].values = (double *)malloc(sizeof(double) * pva->pvaData[index].numGetElements);
842 pva->pvaData[index].numeric = true;
843 }
844 std::copy(dataVector.begin(), dataVector.begin() + pva->pvaData[index].numGetElements, pva->pvaData[index].getData[i].values);
845 }
846 break;
847 }
848 case epics::pvData::pvByte:
849 case epics::pvData::pvUByte: {
850
851 epics::pvData::PVDoubleArray::const_svector dataVector;
852 int nLength;
853 pvScalarArrayPtr->PVScalarArray::getAs<double>(dataVector);
854 nLength = dataVector.size();
855 if (nLength < 256) {
856 nLength = 256;
857 }
858 if (monitorMode) {
859 if (pva->pvaData[index].monitorData[0].values == NULL) {
860 pva->pvaData[index].monitorData[0].values = (double *)malloc(sizeof(double) * nLength);
861 pva->pvaData[index].numeric = true;
862 }
863 std::copy(dataVector.begin(), dataVector.end(), pva->pvaData[index].monitorData[0].values);
864 for (long k = dataVector.size(); k < 256; k++) {
865 pva->pvaData[index].monitorData[0].values[k] = 0;
866 }
867 } else {
868 if (pva->pvaData[index].getData[i].values == NULL) {
869 pva->pvaData[index].getData[i].values = (double *)malloc(sizeof(double) * nLength);
870 pva->pvaData[index].numeric = true;
871 }
872 std::copy(dataVector.begin(), dataVector.end(), pva->pvaData[index].getData[i].values);
873 for (long k = dataVector.size(); k < 256; k++) {
874 pva->pvaData[index].getData[i].values[k] = 0;
875 }
876 }
877 if (pvScalarArrayPtr->isCapacityMutable() && (pvScalarArrayPtr->getCapacity() <= 256)) {
878 pvScalarArrayPtr->setCapacity(256);
879 pvScalarArrayPtr->setLength(256);
880 if (monitorMode) {
881 pva->pvaData[index].numMonitorElements = 256;
882 } else {
883 pva->pvaData[index].numGetElements = 256;
884 }
885 }
886 break;
887 }
888 case epics::pvData::pvString:
889 case epics::pvData::pvBoolean: {
890 epics::pvData::PVStringArray::const_svector dataVector;
891 pvScalarArrayPtr->PVScalarArray::getAs<std::string>(dataVector);
892 if (monitorMode) {
893 if (pva->pvaData[index].monitorData[0].stringValues == NULL) {
894 pva->pvaData[index].monitorData[0].stringValues = (char **)malloc(sizeof(char *) * pva->pvaData[index].numMonitorElements);
895 pva->pvaData[index].nonnumeric = true;
896 }
897 for (long k = 0; k < pva->pvaData[index].numMonitorElements; k++) {
898 pva->pvaData[index].monitorData[0].stringValues[k] = (char *)malloc(sizeof(char) * (dataVector[k].length() + 1));
899 strcpy(pva->pvaData[index].monitorData[0].stringValues[k], dataVector[k].c_str());
900 }
901 } else {
902 if (pva->pvaData[index].getData[i].stringValues == NULL) {
903 pva->pvaData[index].getData[i].stringValues = (char **)malloc(sizeof(char *) * pva->pvaData[index].numGetElements);
904 pva->pvaData[index].nonnumeric = true;
905 }
906 for (long k = 0; k < pva->pvaData[index].numGetElements; k++) {
907 pva->pvaData[index].getData[i].stringValues[k] = (char *)malloc(sizeof(char) * (dataVector[k].length() + 1));
908 strcpy(pva->pvaData[index].getData[i].stringValues[k], dataVector[k].c_str());
909 }
910 }
911 break;
912 }
913 default: {
914 std::cerr << "ERROR: Need code to handle scalar array type " << pva->pvaData[index].scalarType << std::endl;
915 return (1);
916 }
917 }
918 if (monitorMode) {
919 pva->pvaData[index].numMonitorReadings = 1;
920 } else {
921 if (pva->limitGetReadings) {
922 pva->pvaData[index].numGetReadings = 1;
923 } else {
924 pva->pvaData[index].numGetReadings++;
925 }
926 }
927 return (0);
928}